diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2018-08-29 16:36:44 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2018-09-28 10:08:09 -0300 |
commit | 7a16bdbb9ff4122af0a28dc20996c95352011fdd (patch) | |
tree | 9b3a3ff38fc14518d92eddf940313b8d2edae943 /misc/tst-preadvwritev64v2.c | |
parent | 81dca813cc35f91414731fdd0ff6b756d5e1827f (diff) | |
download | glibc-7a16bdbb9ff4122af0a28dc20996c95352011fdd.tar.gz glibc-7a16bdbb9ff4122af0a28dc20996c95352011fdd.tar.xz glibc-7a16bdbb9ff4122af0a28dc20996c95352011fdd.zip |
Fix misreported errno on preadv2/pwritev2 (BZ#23579)
The fallback code of Linux wrapper for preadv2/pwritev2 executes regardless of the errno code for preadv2, instead of the case where the syscall is not supported. This fixes it by calling the fallback code iff errno is ENOSYS. The patch also adds tests for both invalid file descriptor and invalid iov_len and vector count. The only discrepancy between preadv2 and fallback code regarding error reporting is when an invalid flags are used. The fallback code bails out earlier with ENOTSUP instead of EINVAL/EBADF when the syscall is used. Checked on x86_64-linux-gnu on a 4.4.0 and 4.15.0 kernel. [BZ #23579] * misc/tst-preadvwritev2-common.c (do_test_with_invalid_fd): New test. * misc/tst-preadvwritev2.c, misc/tst-preadvwritev64v2.c (do_test): Call do_test_with_invalid_fd. * sysdeps/unix/sysv/linux/preadv2.c (preadv2): Use fallback code iff errno is ENOSYS. * sysdeps/unix/sysv/linux/preadv64v2.c (preadv64v2): Likewise. * sysdeps/unix/sysv/linux/pwritev2.c (pwritev2): Likewise. * sysdeps/unix/sysv/linux/pwritev64v2.c (pwritev64v2): Likewise.
Diffstat (limited to 'misc/tst-preadvwritev64v2.c')
-rw-r--r-- | misc/tst-preadvwritev64v2.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/misc/tst-preadvwritev64v2.c b/misc/tst-preadvwritev64v2.c index 8d3cc32b28..6a9de54c78 100644 --- a/misc/tst-preadvwritev64v2.c +++ b/misc/tst-preadvwritev64v2.c @@ -32,6 +32,8 @@ do_test (void) { do_test_with_invalid_flags (); do_test_without_offset (); + do_test_with_invalid_fd (); + do_test_with_invalid_iov (); return do_test_with_offset (0); } |