lkml.org 
[lkml]   [2003]   [Jul]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patches in this message
/
Date
From
Subjectbinfmt handler issues with emulators
Hi Linus/Andrew,

Did you get a chance to see my patch posted to LKML on 7/28 ?

http://marc.theaimsgroup.com/?l=linux-kernel&m=105942737328805&w=2

This is an issue for cases where an interpreter itself may be interpreted (by an emulator). The current implementation has problems with argument passing and the output of ps (which doesn't match native).

The attached patch fixes the problems for us. Comments ?

-Arun

--- 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);
\
 
 \ /
  Last update: 2005-03-22 13:47    [W:0.031 / U:1.428 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site