about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/ppoll_chk.c
diff options
context:
space:
mode:
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-11-04 16:02:52 -0300
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>2022-11-08 13:37:06 -0300
commit2e274cd8c1ebd0bd0c43a7f2e5433685740938ca (patch)
treeac3f69747db62b0444960f54f559e0d5359fac69 /sysdeps/unix/sysv/linux/ppoll_chk.c
parent19934d629ee22bbd332f04da4320e4f624c9560c (diff)
downloadglibc-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.c42
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