epoll: convert internal api to timespec64
[linux-2.6-microblaze.git] / fs / binfmt_misc.c
index cdb4582..3880a82 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)
@@ -160,51 +159,25 @@ static int load_misc_binary(struct linux_binprm *bprm)
                        goto ret;
        }
 
-       if (fmt->flags & MISC_FMT_OPEN_BINARY) {
+       if (fmt->flags & MISC_FMT_OPEN_BINARY)
+               bprm->have_execfd = 1;
 
-               /* 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);
-
-               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);
-               bprm->file = NULL;
-       }
        /* make argv[1] be the path to the binary */
-       retval = copy_strings_kernel(1, &bprm->interp, bprm);
+       retval = copy_string_kernel(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);
+       retval = copy_string_kernel(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,38 +188,16 @@ static int load_misc_binary(struct linux_binprm *bprm)
        }
        retval = PTR_ERR(interp_file);
        if (IS_ERR(interp_file))
-               goto error;
-
-       bprm->file = interp_file;
-       if (fmt->flags & MISC_FMT_CREDENTIALS) {
-               loff_t pos = 0;
-
-               /*
-                * No need to call prepare_binprm(), it's already been
-                * done.  bprm->buf is stale, update from interp_file.
-                */
-               memset(bprm->buf, 0, BINPRM_BUF_SIZE);
-               retval = kernel_read(bprm->file, bprm->buf, BINPRM_BUF_SIZE,
-                               &pos);
-       } else
-               retval = prepare_binprm(bprm);
-
-       if (retval < 0)
-               goto error;
+               goto ret;
 
-       retval = search_binary_handler(bprm);
-       if (retval < 0)
-               goto error;
+       bprm->interpreter = interp_file;
+       if (fmt->flags & MISC_FMT_CREDENTIALS)
+               bprm->execfd_creds = 1;
 
+       retval = 0;
 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 */