fix pipe2 silently ignoring unknown flags on old kernels
authorRich Felker <dalias@aerifal.cx>
Tue, 28 Feb 2023 17:18:43 +0000 (12:18 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 28 Feb 2023 17:18:43 +0000 (12:18 -0500)
kernels using the fallback have an inherent close-on-exec race
condition and as such support for them is only best-effort anyway.
however, ignoring potential new flags is still very bad behavior.
instead, fail with EINVAL.

src/unistd/pipe2.c

index f24f74f..a096990 100644 (file)
@@ -8,6 +8,7 @@ int pipe2(int fd[2], int flag)
        if (!flag) return pipe(fd);
        int ret = __syscall(SYS_pipe2, fd, flag);
        if (ret != -ENOSYS) return __syscall_ret(ret);
+       if (flag & ~(O_CLOEXEC|O_NONBLOCK)) return __syscall_ret(-EINVAL);
        ret = pipe(fd);
        if (ret) return ret;
        if (flag & O_CLOEXEC) {