]> Savannah Git Hosting - gnulib.git/commitdiff
open, openat: port to (O_RDWR | O_RDONLY) != 0
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 7 Mar 2020 19:02:05 +0000 (11:02 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 7 Mar 2020 19:02:43 +0000 (11:02 -0800)
Potential portability problem reported by Dan Gohman in:
https://lists.gnu.org/r/bug-gnulib/2020-03/msg00000.html
* lib/open.c (open):
* lib/openat.c (rpl_openat):
Don’t assume O_RDONLY is disjoint from O_RDWR.

ChangeLog
lib/open.c
lib/openat.c

index 0eddfee99d9212bc73457b3f309c657df3c359cb..f6bd5180caca3217def841c45f67bee883e6cf37 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2020-03-07  Paul Eggert  <eggert@cs.ucla.edu>
+
+       open, openat: port to (O_RDWR | O_RDONLY) != 0
+       Potential portability problem reported by Dan Gohman in:
+       https://lists.gnu.org/r/bug-gnulib/2020-03/msg00000.html
+       * lib/open.c (open):
+       * lib/openat.c (rpl_openat):
+       Don’t assume O_RDONLY is disjoint from O_RDWR.
+
 2020-03-07  Bruno Haible  <bruno@clisp.org>
 
        findprog, relocatable-prog: Ignore directories during PATH search.
index 487194f6652bf24db218b0c3ae1ac16c02aef9d7..bb180fde2920b19ce5277f3322a9d123e0a91f85 100644 (file)
@@ -110,7 +110,9 @@ open (const char *filename, int flags, ...)
          directories,
        - if O_WRONLY or O_RDWR is specified, open() must fail because the
          file does not contain a '.' directory.  */
-  if (flags & (O_CREAT | O_WRONLY | O_RDWR))
+  if ((flags & O_CREAT)
+      || (flags & O_ACCMODE) == O_RDWR
+      || (flags & O_ACCMODE) == O_WRONLY)
     {
       size_t len = strlen (filename);
       if (len > 0 && filename[len - 1] == '/')
index 7d67dc4cad1065929943384669507372b44a48e1..fdbe83f43d391517bb9823278221ccab7b3bcd18 100644 (file)
@@ -100,7 +100,9 @@ rpl_openat (int dfd, char const *filename, int flags, ...)
          directories,
        - if O_WRONLY or O_RDWR is specified, open() must fail because the
          file does not contain a '.' directory.  */
-  if (flags & (O_CREAT | O_WRONLY | (O_RDWR & ~O_RDONLY)))
+  if ((flags & O_CREAT)
+      || (flags & O_ACCMODE) == O_RDWR
+      || (flags & O_ACCMODE) == O_WRONLY)
     {
       size_t len = strlen (filename);
       if (len > 0 && filename[len - 1] == '/')