diff options
author | Manuel Novoa III <mjn3@codepoet.org> | 2001-03-17 19:05:51 +0000 |
---|---|---|
committer | Manuel Novoa III <mjn3@codepoet.org> | 2001-03-17 19:05:51 +0000 |
commit | a91d0a538d52c77fd56a3f44974f96654125d9db (patch) | |
tree | d8778f4311c38e210f1b0a93f3b35763016e6037 | |
parent | 162b5c1c0a1d12b47250e422b036882eefc99732 (diff) |
Fix fdopen mode-compatibility test and errno setting.
-rw-r--r-- | libc/stdio/stdio.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/libc/stdio/stdio.c b/libc/stdio/stdio.c index 73b9d1aee..fe1c6a073 100644 --- a/libc/stdio/stdio.c +++ b/libc/stdio/stdio.c @@ -701,8 +701,15 @@ const char *mode; if (fname) { /* Open the file itself */ fd = open(fname, open_mode, 0666); } else { /* fdopen -- check mode is compatible. */ +#if O_ACCMODE != 3 || O_RDONLY != 0 || O_WRONLY != 1 || O_RDWR != 2 +#error Assumption violated - mode constants +#endif cur_mode = fcntl(fd, F_GETFL); - if ((cur_mode == -1) || ((cur_mode ^ open_mode) & O_ACCMODE)) { + if (cur_mode == -1) { + fd = -1; + } else if (!(cur_mode & O_RDWR) + && ((cur_mode ^ open_mode) & O_ACCMODE)) { + errno = EINVAL; fd = -1; } } |