Change omode() to not special-case O_EXEC [6/7]
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Sep 2015 18:54:05 +0000 (14:54 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 28 Sep 2015 19:14:00 +0000 (15:14 -0400)
Without this change, we don't save the O_EXEC bit.  There may be some
code that breaks that requests O_EXEC without O_READ.  This is yet
another example of O_RDONLY being implied.  It looks like Plan 9 might
have been using omode() to help with this conversion, depending on what
the actual value of OREAD was for them.

kern/src/ns/sysfile.c

index cb18513..9f934a0 100644 (file)
@@ -108,7 +108,10 @@ int openmode(uint32_t omode)
        /* this is the old plan9 style.  i think they want to turn exec into read,
         * and strip off anything higher, and just return the RD/WR style bits.  not
         * stuff like ORCLOSE.  the lack of OEXCL might be a bug on their part (it's
-        * the only one of their non-RW-related flags that isn't masked out) */
+        * the only one of their non-RW-related flags that isn't masked out).
+        *
+        * Note that we no longer convert OEXEC/O_EXEC to O_READ, and instead return
+        * just the O_ACCMODE bits. */
        if (o >= (OTRUNC | OCEXEC | ORCLOSE | OEXEC))
                error(Ebadarg);
        o &= ~(OTRUNC | OCEXEC | ORCLOSE);
@@ -120,9 +123,6 @@ int openmode(uint32_t omode)
 #endif
        /* no error checking (we have a shitload of flags anyway), and we return the
         * basic access modes (RD/WR/ETC) */
-       if (omode == O_EXEC) {
-       return O_RDONLY;
-       }
        return omode & O_ACCMODE;
 }