ignore access mode bits of flags in mkostemps and functions that use it
authorRich Felker <dalias@aerifal.cx>
Tue, 7 Oct 2014 03:13:01 +0000 (23:13 -0400)
committerRich Felker <dalias@aerifal.cx>
Tue, 7 Oct 2014 03:13:01 +0000 (23:13 -0400)
per the text accepted for inclusion in POSIX, behavior is unspecified
when any of the access mode bits are set. since it's impossible to
consistently report this usage error (O_RDONLY could not be detected
since its value happens to be zero), the most consistent way to handle
them is just to ignore them.

previously, if a caller erroneously passed O_WRONLY, the resulting
access mode would be O_WRONLY|O_RDWR, which has the value 3, and this
resulted in a file descriptor which rejects both read and write
attempts when it is subsequently used.

src/temp/mkostemps.c

index 7f8492a1ae8479ef2ca167c5dc6d37edd819ddb8..512b5f188a1fdb37dde4633e11becc0edee39767 100644 (file)
@@ -15,6 +15,7 @@ int __mkostemps(char *template, int len, int flags)
                return -1;
        }
 
+       flags -= flags & O_ACCMODE;
        int fd, retries = 100;
        do {
                __randname(template+l-len-6);