All of lore.kernel.org
 help / color / mirror / Atom feed
* binfmt handler searching issues
@ 2003-07-28 21:11 Arun Sharma
  0 siblings, 0 replies; only message in thread
From: Arun Sharma @ 2003-07-28 21:11 UTC (permalink / raw)
  To: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 778 bytes --]

A script such as

#!/bin/foo.bar
...

where /bin/foo.bar is handled by binfmt_misc, is not handled correctly i.e. the interpreter of foo.bar doesn't receive the correct arguments.

The binfmt_misc handler requires that bprm->filename is appropriately filled so that the argv[1] could be correctly passed to the interpreter.

However, binfmt_script, as it exists today doesn't populate bprm->filename correctly.

Another motivation for this patch is the output of ps. Emulators which use binfmt_misc may want to keep the output of ps consistent with native execution. This requires preserving bprm->filename. The attached patch guarantees this even if we have to go through several binfmt handlers (think of finite loops involving  binfmt_script and binfmt_misc).

        -Arun

[-- Attachment #2: binfmt_interp.patch --]
[-- Type: text/plain, Size: 2349 bytes --]

--- linux/fs/exec.c-	Thu Mar 13 11:42:51 2003
+++ linux/fs/exec.c	Thu Mar 13 11:43:05 2003
@@ -882,6 +882,7 @@
 
 	bprm.file = file;
 	bprm.filename = filename;
+	bprm.interp = filename;
 	bprm.sh_bang = 0;
 	bprm.loader = 0;
 	bprm.exec = 0;
--- linux/fs/binfmt_script.c-	Thu Mar 13 12:09:28 2003
+++ linux/fs/binfmt_script.c	Thu Mar 13 12:09:46 2003
@@ -78,6 +78,8 @@
 	retval = copy_strings_kernel(1, &i_name, bprm);
 	if (retval) return retval; 
 	bprm->argc++;
+	bprm->interp = interp;
+	
 	/*
 	 * OK, now restart the process with the interpreter's dentry.
 	 */
--- linux/include/linux/binfmts.h-	Thu Mar 13 11:40:41 2003
+++ linux/include/linux/binfmts.h	Thu Mar 13 11:42:05 2003
@@ -30,7 +30,10 @@
 	int e_uid, e_gid;
 	kernel_cap_t cap_inheritable, cap_permitted, cap_effective;
 	int argc, envc;
-	char * filename;	/* Name of binary */
+	char * filename;	/* Name of binary as seen by procps */
+	char * interp;		/* Name of the binary really executed. Most
+				   of the time same as filename, but could be
+				   different for binfmt_{misc,script} */
 	unsigned long loader, exec;
 };

--- linux/fs/binfmt_script.c-	Mon Mar 17 08:10:56 2003
+++ linux/fs/binfmt_script.c	Mon Mar 17 08:13:07 2003
@@ -67,7 +67,7 @@
 	 * user environment and arguments are stored.
 	 */
 	remove_arg_zero(bprm);
-	retval = copy_strings_kernel(1, &bprm->filename, bprm);
+	retval = copy_strings_kernel(1, &bprm->interp, bprm);
 	if (retval < 0) return retval; 
 	bprm->argc++;
 	if (i_arg) {
 
--- linux/fs/binfmt_misc.c.orig	Wed Mar 19 15:45:34 2003
+++ linux/fs/binfmt_misc.c	Wed Mar 19 15:49:39 2003
@@ -58,7 +58,7 @@
  */
 static Node *check_file(struct linux_binprm *bprm)
 {
-	char *p = strrchr(bprm->filename, '.');
+	char *p = strrchr(bprm->interp, '.');
 	struct list_head *l;
 
 	for (l = entries.next; l != &entries; l = l->next) {
@@ -125,13 +125,13 @@
 	if (!(fmt->flags & MISC_FMT_PRESERVE_ARGV0)) {
 		remove_arg_zero(bprm);
 	}
-	retval = copy_strings_kernel(1, &bprm->filename, bprm);
+	retval = copy_strings_kernel(1, &bprm->interp, bprm);
 	if (retval < 0) goto _ret; 
 	bprm->argc++;
 	retval = copy_strings_kernel(1, &iname_addr, bprm);
 	if (retval < 0) goto _ret; 
 	bprm->argc++;
-	bprm->filename = iname;	/* for binfmt_script */
+	bprm->interp = iname;	/* for binfmt_script */
 
 	file = open_exec(iname);
 	retval = PTR_ERR(file);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-07-28 21:13 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-07-28 21:11 binfmt handler searching issues Arun Sharma

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.