Safer ABI for O_TMPFILE
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 13 Jul 2013 09:26:37 +0000 (13:26 +0400)
committerStricted <info@stricted.net>
Tue, 6 Aug 2019 11:33:34 +0000 (11:33 +0000)
[suggested by Rasmus Villemoes] make O_DIRECTORY | O_RDWR part of O_TMPFILE;
that will fail on old kernels in a lot more cases than what I came up with.
And make sure O_CREAT doesn't get there...

Change-Id: I4818563d79ca1abf9ea99f5ccea9317eb2f3b678
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
arch/alpha/include/uapi/asm/fcntl.h
arch/parisc/include/uapi/asm/fcntl.h
arch/sparc/include/uapi/asm/fcntl.h
fs/namei.c
fs/open.c
include/uapi/asm-generic/fcntl.h

index dfdadb0b4befa6619568d8179dd68f1850ef6151..09f49a6b87d18a85451e2d457df84bb9c6f2e2ed 100644 (file)
@@ -32,7 +32,7 @@
 #define O_SYNC         (__O_SYNC|O_DSYNC)
 
 #define O_PATH         040000000
-#define O_TMPFILE      0100000000
+#define __O_TMPFILE    0100000000
 
 #define F_GETLK                7
 #define F_SETLK                8
index cc61c475f2779198e45e72dc16dcc4f51e691dec..34a46cbc76ed5d1f6f0f47bda6f0873d2448d8e2 100644 (file)
@@ -20,7 +20,7 @@
 #define O_INVISIBLE    004000000 /* invisible I/O, for DMAPI/XDSM */
 
 #define O_PATH         020000000
-#define O_TMPFILE      040000000
+#define __O_TMPFILE    040000000
 
 #define F_GETLK64      8
 #define F_SETLK64      9
index d73e5e008b0de953d5e7eaf958d5c7bfed0c45c8..7e8ace5bf760a6d2639928ce5199ec41f938b717 100644 (file)
@@ -35,7 +35,7 @@
 #define O_SYNC         (__O_SYNC|O_DSYNC)
 
 #define O_PATH         0x1000000
-#define O_TMPFILE      0x2000000
+#define __O_TMPFILE    0x2000000
 
 #define F_GETOWN       5       /*  for sockets. */
 #define F_SETOWN       6       /*  for sockets. */
index aebcd647b36a395a8966e07327af5a61b1de5ea0..ac3e12c60b883d583df98130fded1d7fd293b812 100644 (file)
@@ -3068,7 +3068,7 @@ static struct file *path_openat(int dfd, struct filename *pathname,
 
        file->f_flags = op->open_flag;
 
-       if (unlikely(file->f_flags & O_TMPFILE)) {
+       if (unlikely(file->f_flags & __O_TMPFILE)) {
                error = do_tmpfile(dfd, pathname, nd, flags, op, file, &opened);
                goto out;
        }
index f55cbf1b261b60d406fe0531eca16ea3d97d9e09..486e05f0dc1d30bad8f10135dc29bc1e32409894 100644 (file)
--- a/fs/open.c
+++ b/fs/open.c
@@ -843,8 +843,8 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
        if (flags & __O_SYNC)
                flags |= O_DSYNC;
 
-       if (flags & O_TMPFILE) {
-               if (!(flags & O_CREAT))
+       if (flags & __O_TMPFILE) {
+               if ((flags & O_TMPFILE_MASK) != O_TMPFILE)
                        return -EINVAL;
                acc_mode = MAY_OPEN | ACC_MODE(flags);
        } else if (flags & O_PATH) {
index 06632beaa6d515d80fc2a62c5ddca455c964e0a3..05ac354e124de3e4577667ebf292002f40f45579 100644 (file)
 #define O_PATH         010000000
 #endif
 
-#ifndef O_TMPFILE
-#define O_TMPFILE      020000000
+#ifndef __O_TMPFILE
+#define __O_TMPFILE    020000000
 #endif
 
+/* a horrid kludge trying to make sure that this will fail on old kernels */
+#define O_TMPFILE (__O_TMPFILE | O_DIRECTORY | O_RDWR)
+#define O_TMPFILE_MASK (__O_TMPFILE | O_DIRECTORY | O_CREAT | O_ACCMODE)      
+
 #ifndef O_NDELAY
 #define O_NDELAY       O_NONBLOCK
 #endif