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 /sysdeps/unix/sysv/linux/ppoll_chk.c | |
parent | 19934d629ee22bbd332f04da4320e4f624c9560c (diff) | |
download | glibc-2e274cd8c1ebd0bd0c43a7f2e5433685740938ca.tar.gz glibc-2e274cd8c1ebd0bd0c43a7f2e5433685740938ca.tar.xz glibc-2e274cd8c1ebd0bd0c43a7f2e5433685740938ca.zip |
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 'sysdeps/unix/sysv/linux/ppoll_chk.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/ppoll_chk.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/sysdeps/unix/sysv/linux/ppoll_chk.c b/sysdeps/unix/sysv/linux/ppoll_chk.c new file mode 100644 index 0000000000..65c4b56671 --- /dev/null +++ b/sysdeps/unix/sysv/linux/ppoll_chk.c @@ -0,0 +1,42 @@ +/* Fortify ppoll implementation. Linux version. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <poll.h> + +int +__ppoll64_chk (struct pollfd *fds, nfds_t nfds, + const struct __timespec64 *tmo, const __sigset_t *ss, + __SIZE_TYPE__ fdslen) +{ + if (fdslen / sizeof (*fds) < nfds) + __chk_fail (); + + return __ppoll64 (fds, nfds, tmo, ss); +} + +#if __TIMESIZE != 64 +int +__ppoll_chk (struct pollfd *fds, nfds_t nfds, const struct timespec *tmo, + const __sigset_t *ss, __SIZE_TYPE__ fdslen) +{ + if (fdslen / sizeof (*fds) < nfds) + __chk_fail (); + + return ppoll (fds, nfds, tmo, ss); +} +#endif |