It works on i386 only by accident, and doesn't work at all with UML.
start_thread, which is called from inside the set_fs(USER_DS) -
set_fs(oldfs) does set_fs(USER_DS). That is then blown away by the
set_fs(oldfs).
A one-line fix might be
Index: linux-2.6.17/fs/exec.c
===================================================================
--- linux-2.6.17.orig/fs/exec.c 2007-01-31 12:10:08.000000000 -0500
+++ linux-2.6.17/fs/exec.c 2007-01-31 12:41:15.000000000 -0500
@@ -1079,6 +1079,7 @@ int search_binary_handler(struct linux_b
continue;
read_unlock(&binfmt_lock);
retval = fn(bprm, regs);
+ oldfs = get_fs();
if (retval >= 0) {
put_binfmt(fmt);
allow_write_access(bprm->file);
but this seems like it's pasting one kludge on top of another.
Jeff
--
Work email - jdike at linux dot intel dot com