diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2022-11-04 16:02:52 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2022-11-08 13:37:06 -0300 |
commit | 2e274cd8c1ebd0bd0c43a7f2e5433685740938ca (patch) | |
tree | ac3f69747db62b0444960f54f559e0d5359fac69 /io/bits | |
parent | 19934d629ee22bbd332f04da4320e4f624c9560c (diff) | |
download | glibc-2e274cd8c1ebd0bd0c43a7f2e5433685740938ca.zip glibc-2e274cd8c1ebd0bd0c43a7f2e5433685740938ca.tar.gz glibc-2e274cd8c1ebd0bd0c43a7f2e5433685740938ca.tar.bz2 |
Linux: Add ppoll fortify symbol for 64 bit time_t (BZ# 29746)
Similar to ppoll, the poll.h header needs to redirect the poll call
to a proper fortified ppoll with 64 bit time_t support.
The implementation is straightforward, just need to add a similar
check as __poll_chk and call the 64 bit time_t ppoll version. The
debug fortify tests are also extended to cover 64 bit time_t for
affected ABIs.
Unfortunately it requires an aditional symbol, which makes backport
tricky. One possibility is to add a static inline version if compiler
supports is and call abort instead of __chk_fail, so fortified version
will call __poll64 in the end.
Another possibility is to just remove the fortify support for
_TIME_BITS=64.
Checked on i686-linux-gnu.
Diffstat (limited to 'io/bits')
-rw-r--r-- | io/bits/poll2.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/io/bits/poll2.h b/io/bits/poll2.h index 3679d84..90f5574 100644 --- a/io/bits/poll2.h +++ b/io/bits/poll2.h @@ -43,6 +43,30 @@ poll (struct pollfd *__fds, nfds_t __nfds, int __timeout) #ifdef __USE_GNU +# ifdef __USE_TIME_BITS64 +extern int __REDIRECT (__ppoll64_alias, (struct pollfd *__fds, nfds_t __nfds, + const struct timespec *__timeout, + const __sigset_t *__ss), __ppoll64); +extern int __ppoll64_chk (struct pollfd *__fds, nfds_t __nfds, + const struct timespec *__timeout, + const __sigset_t *__ss, __SIZE_TYPE__ __fdslen) + __attr_access ((__write_only__, 1, 2)); +extern int __REDIRECT (__ppoll64_chk_warn, (struct pollfd *__fds, nfds_t __n, + const struct timespec *__timeout, + const __sigset_t *__ss, + __SIZE_TYPE__ __fdslen), + __ppoll64_chk) + __warnattr ("ppoll called with fds buffer too small file nfds entries"); + +__fortify_function __fortified_attr_access (__write_only__, 1, 2) int +ppoll (struct pollfd *__fds, nfds_t __nfds, const struct timespec *__timeout, + const __sigset_t *__ss) +{ + return __glibc_fortify (ppoll64, __nfds, sizeof (*__fds), + __glibc_objsize (__fds), + __fds, __nfds, __timeout, __ss); +} +# else extern int __REDIRECT (__ppoll_alias, (struct pollfd *__fds, nfds_t __nfds, const struct timespec *__timeout, const __sigset_t *__ss), ppoll); @@ -65,6 +89,7 @@ ppoll (struct pollfd *__fds, nfds_t __nfds, const struct timespec *__timeout, __glibc_objsize (__fds), __fds, __nfds, __timeout, __ss); } +# endif #endif __END_DECLS |