Set O_EXEC when the kernel opens a file for exec
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 1 Mar 2018 18:58:43 +0000 (13:58 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Apr 2018 18:31:44 +0000 (14:31 -0400)
Not a huge deal, but if we're going to have the flags, then we should use
them.  This popped up when doing permission checks on mmap on chans.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/src/elf.c
kern/src/monitor.c
kern/src/syscall.c

index 89408ba..7a91373 100644 (file)
@@ -362,7 +362,8 @@ int load_elf(struct proc *p, struct file_or_chan *foc,
                return -1;
 
        if (ei.dynamic) {
-               struct file_or_chan *interp = foc_open(ei.interp, O_READ, 0);
+               struct file_or_chan *interp = foc_open(ei.interp, O_EXEC | O_READ, 0);
+
                if (!interp)
                        return -1;
                /* Load dynamic linker at 1M. Obvious MIB joke avoided.
index 1d87344..354f55a 100644 (file)
@@ -289,7 +289,7 @@ int mon_bin_ls(int argc, char **argv, struct hw_trapframe *hw_tf)
        struct file *bin_dir;
        int retval = 0;
 
-       bin_dir = do_file_open("/bin", O_READ, 0);
+       bin_dir = do_file_open("/bin", O_EXEC | O_READ, 0);
        if (!bin_dir) {
                printk("No /bin directory!\n");
                return 1;
@@ -318,7 +318,7 @@ int mon_bin_run(int argc, char **argv, struct hw_trapframe *hw_tf)
                printk("Filename '%s' too long!\n", argv[1]);
                return 1;
        }
-       program = foc_open(buf, O_READ, 0);
+       program = foc_open(buf, O_EXEC | O_READ, 0);
        if (!program) {
                printk("No such program!\n");
                return 1;
index 9a75919..daef203 100644 (file)
@@ -717,7 +717,7 @@ static int sys_proc_create(struct proc *p, char *path, size_t path_l,
        t_path = copy_in_path(p, path, path_l);
        if (!t_path)
                return -1;
-       program = foc_open(t_path, O_READ, 0);
+       program = foc_open(t_path, O_EXEC | O_READ, 0);
        if (!program)
                goto error_with_path;
        if (!is_valid_elf(program)) {
@@ -1032,7 +1032,7 @@ static int sys_exec(struct proc *p, char *path, size_t path_l,
                return -1;
        }
        /* This could block: */
-       program = foc_open(t_path, O_READ, 0);
+       program = foc_open(t_path, O_EXEC | O_READ, 0);
        /* Clear the current_ctx.  We won't be returning the 'normal' way.  Even if
         * we want to return with an error, we need to go back differently in case
         * we succeed.  This needs to be done before we could possibly block, but