|
Message-ID: <20200219023729.37349-1-zhangtianci1@huawei.com> Date: Wed, 19 Feb 2020 10:37:29 +0800 From: Zhang Tianci <zhangtianci1@...wei.com> To: <musl@...ts.openwall.com> CC: <zhangtianci1@...wei.com>, <yunlong.song@...wei.com> Subject: [PATCH] stdio: Fix fdopen bug Currently, in musl the fdopen doesn't check the consistence between fd's mode and corresponding file's mode. For example, int fd = open("file1", O_RDONLY); FILE *f = fdopen(fd, "W") In musl, above code will be Okay. While according to POSIX, above code (fdopen) will return EINVAL. Signed-off-by: Zhang Tianci <zhangtianci1@...wei.com> --- src/stdio/__fdopen.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/stdio/__fdopen.c b/src/stdio/__fdopen.c index 116e78e..23c4ffd 100644 --- a/src/stdio/__fdopen.c +++ b/src/stdio/__fdopen.c @@ -26,6 +26,16 @@ FILE *__fdopen(int fd, const char *mode) /* Impose mode restrictions */ if (!strchr(mode, '+')) f->flags = (*mode == 'r') ? F_NOWR : F_NORD; + int fd_flag = __syscall(SYS_fcntl, fd, F_GETFL); + + if (fd_flag == -1) return 0; + + if (((fd_flag & O_ACCMODE) == O_RDONLY && !(f->flags & F_NORD)) || + ((fd_flag & O_ACCMODE) == O_WRONLY && !(f->flags & F_NOWR))) { + errno = EINVAL; + return 0; + } + /* Apply close-on-exec flag */ if (strchr(mode, 'e')) __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC); -- 2.17.1
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.