exec: Generic execfd support
[linux-2.6-block.git] / fs / binfmt_misc.c
index 50a73afdf9b70fdea1a27d9dc5d508c7b912832f..ad2866f28f0cfa82002a5eed1e9e166b11d1e777 100644 (file)
@@ -134,7 +134,6 @@ static int load_misc_binary(struct linux_binprm *bprm)
        Node *fmt;
        struct file *interp_file = NULL;
        int retval;
-       int fd_binary = -1;
 
        retval = -ENOEXEC;
        if (!enabled)
@@ -161,29 +160,12 @@ static int load_misc_binary(struct linux_binprm *bprm)
        }
 
        if (fmt->flags & MISC_FMT_OPEN_BINARY) {
-
-               /* if the binary should be opened on behalf of the
-                * interpreter than keep it open and assign descriptor
-                * to it
-                */
-               fd_binary = get_unused_fd_flags(0);
-               if (fd_binary < 0) {
-                       retval = fd_binary;
-                       goto ret;
-               }
-               fd_install(fd_binary, bprm->file);
-
-               /* if the binary is not readable than enforce mm->dumpable=0
-                  regardless of the interpreter's permissions */
-               would_dump(bprm, bprm->file);
+               /* Pass the open binary to the interpreter */
+               bprm->have_execfd = 1;
+               bprm->executable = bprm->file;
 
                allow_write_access(bprm->file);
                bprm->file = NULL;
-
-               /* mark the bprm that fd should be passed to interp */
-               bprm->interp_flags |= BINPRM_FLAGS_EXECFD;
-               bprm->interp_data = fd_binary;
-
        } else {
                allow_write_access(bprm->file);
                fput(bprm->file);
@@ -192,19 +174,19 @@ static int load_misc_binary(struct linux_binprm *bprm)
        /* make argv[1] be the path to the binary */
        retval = copy_strings_kernel(1, &bprm->interp, bprm);
        if (retval < 0)
-               goto error;
+               goto ret;
        bprm->argc++;
 
        /* add the interp as argv[0] */
        retval = copy_strings_kernel(1, &fmt->interpreter, bprm);
        if (retval < 0)
-               goto error;
+               goto ret;
        bprm->argc++;
 
        /* Update interp in case binfmt_script needs it. */
        retval = bprm_change_interp(fmt->interpreter, bprm);
        if (retval < 0)
-               goto error;
+               goto ret;
 
        if (fmt->flags & MISC_FMT_OPEN_FILE) {
                interp_file = file_clone_open(fmt->interp_file);
@@ -215,7 +197,7 @@ static int load_misc_binary(struct linux_binprm *bprm)
        }
        retval = PTR_ERR(interp_file);
        if (IS_ERR(interp_file))
-               goto error;
+               goto ret;
 
        bprm->file = interp_file;
        if (fmt->flags & MISC_FMT_CREDENTIALS)
@@ -223,17 +205,11 @@ static int load_misc_binary(struct linux_binprm *bprm)
 
        retval = search_binary_handler(bprm);
        if (retval < 0)
-               goto error;
+               goto ret;
 
 ret:
        dput(fmt->dentry);
        return retval;
-error:
-       if (fd_binary > 0)
-               ksys_close(fd_binary);
-       bprm->interp_flags = 0;
-       bprm->interp_data = 0;
-       goto ret;
 }
 
 /* Command parsers */