| From 69318192d16adc7d57adcd69fbbb1e3e107b2783 Mon Sep 17 00:00:00 2001 |
| From: Adhemerval Zanella <adhemerval.zanella@linaro.org> |
| Date: Fri, 4 Nov 2022 16:02:52 -0300 |
| Subject: [PATCH] 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. |
| |
| Upstream-Status: Backport |
| |
| Signed-off-by: Ola Nilsson <olani@axis.com> |
| --- |
| debug/Makefile | 41 ++++++++++++------ |
| include/sys/poll.h | 5 ++- |
| io/bits/poll2.h | 25 +++++++++++ |
| sysdeps/unix/sysv/linux/Versions | 5 +++ |
| sysdeps/unix/sysv/linux/arm/be/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/arm/le/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/csky/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/hppa/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/i386/libc.abilist | 1 + |
| .../sysv/linux/m68k/coldfire/libc.abilist | 1 + |
| .../unix/sysv/linux/m68k/m680x0/libc.abilist | 1 + |
| .../sysv/linux/microblaze/be/libc.abilist | 1 + |
| .../sysv/linux/microblaze/le/libc.abilist | 1 + |
| .../sysv/linux/mips/mips32/fpu/libc.abilist | 1 + |
| .../sysv/linux/mips/mips32/nofpu/libc.abilist | 1 + |
| .../sysv/linux/mips/mips64/n32/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/nios2/libc.abilist | 1 + |
| .../linux/powerpc/powerpc32/fpu/libc.abilist | 1 + |
| .../powerpc/powerpc32/nofpu/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/ppoll.c | 3 +- |
| sysdeps/unix/sysv/linux/ppoll_chk.c | 42 +++++++++++++++++++ |
| .../unix/sysv/linux/s390/s390-32/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/sh/be/libc.abilist | 1 + |
| sysdeps/unix/sysv/linux/sh/le/libc.abilist | 1 + |
| .../sysv/linux/sparc/sparc32/libc.abilist | 1 + |
| 25 files changed, 125 insertions(+), 15 deletions(-) |
| create mode 100644 sysdeps/unix/sysv/linux/ppoll_chk.c |
| |
| diff --git a/debug/Makefile b/debug/Makefile |
| index 456b349c4d..075a135a2b 100644 |
| --- a/debug/Makefile |
| +++ b/debug/Makefile |
| @@ -120,8 +120,10 @@ CPPFLAGS-tst-read-chk-cancel.c += -D_FORTIFY_SOURCE=2 |
| # CFLAGS for the file. |
| |
| tests-all-chk = tst-fortify |
| -tests-c-chk = |
| -tests-cc-chk = |
| +tests-c-def-chk = |
| +tests-cc-def-chk = |
| +tests-c-time64-chk = |
| +tests-cc-time64-chk = |
| |
| CFLAGS-tst-fortify.c += -Wno-format -Wno-deprecated-declarations -Wno-error |
| |
| @@ -130,11 +132,11 @@ define cflags-default |
| endef |
| |
| define cflags-lfs |
| -CFLAGS-tst-fortify-$(1)-lfs-$(2).$(1) += -D_FILE_OFFSET_BITS=64 |
| +CFLAGS-tst-fortify-$(1)-lfs-$(2)-$(3).$(1) += -D_FILE_OFFSET_BITS=64 |
| endef |
| |
| define cflags-nongnu |
| -CFLAGS-tst-fortify-$(1)-nongnu-$(2).$(1) += -D_LARGEFILE64_SOURCE=1 |
| +CFLAGS-tst-fortify-$(1)-nongnu-$(2)-$(3).$(1) += -D_LARGEFILE64_SOURCE=1 |
| endef |
| |
| src-chk-nongnu = \#undef _GNU_SOURCE |
| @@ -145,12 +147,12 @@ src-chk-nongnu = \#undef _GNU_SOURCE |
| # And they also generate warnings from warning attributes, which |
| # cannot be disabled via pragmas, so require -Wno-error to be used. |
| define gen-chk-test |
| -tests-$(1)-chk += tst-fortify-$(1)-$(2)-$(3) |
| -CFLAGS-tst-fortify-$(1)-$(2)-$(3).$(1) += -D_FORTIFY_SOURCE=$(3) -Wno-format \ |
| +tests-$(1)-$(4)-chk += tst-fortify-$(1)-$(2)-$(3)-$(4) |
| +CFLAGS-tst-fortify-$(1)-$(2)-$(3)-$(4).$(1) += -D_FORTIFY_SOURCE=$(3) -Wno-format \ |
| -Wno-deprecated-declarations \ |
| -Wno-error |
| -$(eval $(call cflags-$(2),$(1),$(3))) |
| -$(objpfx)tst-fortify-$(1)-$(2)-$(3).$(1): tst-fortify.c Makefile |
| +$(eval $(call cflags-$(2),$(1),$(3),$(4))) |
| +$(objpfx)tst-fortify-$(1)-$(2)-$(3)-$(4).$(1): tst-fortify.c Makefile |
| ( echo "/* Autogenerated from Makefile. */"; \ |
| echo "$(src-chk-$(2))"; \ |
| echo "#include \"tst-fortify.c\"" ) > $$@.tmp |
| @@ -159,19 +161,29 @@ endef |
| |
| chk-extensions = c cc |
| chk-types = default lfs nongnu |
| +# 64 bit time_t implies LFS. |
| +chk-types-time64 = default nongnu |
| chk-levels = 1 2 3 |
| |
| $(foreach e,$(chk-extensions), \ |
| $(foreach t,$(chk-types), \ |
| $(foreach l,$(chk-levels), \ |
| - $(eval $(call gen-chk-test,$(e),$(t),$(l)))))) |
| + $(eval $(call gen-chk-test,$(e),$(t),$(l),def))))) |
| |
| -tests-all-chk += $(tests-c-chk) $(tests-cc-chk) |
| +tests-all-chk += $(tests-c-def-chk) $(tests-cc-def-chk) |
| + |
| +$(foreach e,$(chk-extensions), \ |
| + $(foreach t,$(chk-types-time64), \ |
| + $(foreach l,$(chk-levels), \ |
| + $(eval $(call gen-chk-test,$(e),$(t),$(l),time64))))) |
| + |
| +tests-all-time64-chk += $(tests-c-time64-chk) $(tests-cc-time64-chk) |
| |
| define link-cc |
| LDLIBS-$(1) = -lstdc++ |
| endef |
| -$(foreach t,$(tests-cc-chk), $(eval $(call link-cc,$(t)))) |
| +$(foreach t,$(tests-cc-def-chk), $(eval $(call link-cc,$(t)))) |
| +$(foreach t,$(tests-cc-time64-chk), $(eval $(call link-cc,$(t)))) |
| |
| # backtrace_symbols only works if we link with -rdynamic. backtrace |
| # requires unwind tables on most architectures. |
| @@ -201,6 +213,10 @@ tests = backtrace-tst \ |
| tst-realpath-chk \ |
| $(tests-all-chk) |
| |
| +tests-time64 += \ |
| + $(tests-all-time64-chk) \ |
| + # tests-time64 |
| + |
| ifeq ($(have-ssp),yes) |
| tests += tst-ssp-1 |
| endif |
| @@ -210,7 +226,7 @@ tests += tst-read-chk-cancel |
| endif |
| |
| ifeq (,$(CXX)) |
| -tests-unsupported = $(tests-cc-chk) |
| +tests-unsupported = $(tests-cc-def-chk) $(test-cc-time64-chk) |
| endif |
| |
| extra-libs = libpcprofile |
| @@ -235,6 +251,7 @@ define chk-gen-locales |
| $(objpfx)$(1).out: $(gen-locales) |
| endef |
| $(foreach t, $(tests-all-chk), $(eval $(call chk-gen-locales,$(t)))) |
| +$(foreach t, $(tests-all-time64-chk), $(eval $(call chk-gen-locales,$(t)))) |
| endif |
| |
| sLIBdir := $(shell echo $(slibdir) | sed 's,lib\(\|64\)$$,\\\\$$LIB,') |
| diff --git a/include/sys/poll.h b/include/sys/poll.h |
| index f904e21f89..228704fe79 100644 |
| --- a/include/sys/poll.h |
| +++ b/include/sys/poll.h |
| @@ -2,13 +2,16 @@ |
| # include <io/sys/poll.h> |
| |
| #ifndef _ISOMAC |
| +#include <include/struct___timespec64.h> |
| + |
| extern int __poll (struct pollfd *__fds, unsigned long int __nfds, |
| int __timeout); |
| libc_hidden_proto (__poll) |
| libc_hidden_proto (ppoll) |
| |
| # if __TIMESIZE == 64 |
| -# define __ppoll64 __ppoll |
| +# define __ppoll64 ppoll |
| +# define __ppoll64_chk __ppoll_chk |
| # else |
| # include <time.h> |
| # include <signal.h> |
| diff --git a/io/bits/poll2.h b/io/bits/poll2.h |
| index 3679d8451a..90f5574969 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 |
| diff --git a/sysdeps/unix/sysv/linux/Versions b/sysdeps/unix/sysv/linux/Versions |
| index 65d2ceda2c..ca6eb1a49e 100644 |
| --- a/sysdeps/unix/sysv/linux/Versions |
| +++ b/sysdeps/unix/sysv/linux/Versions |
| @@ -313,6 +313,11 @@ libc { |
| process_madvise; |
| process_mrelease; |
| } |
| + GLIBC_2.37 { |
| +%ifdef TIME64_NON_DEFAULT |
| + __ppoll64_chk; |
| +%endif |
| + } |
| GLIBC_PRIVATE { |
| # functions used in other libraries |
| __syscall_rt_sigqueueinfo; |
| diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist |
| index e0668a80cf..f28402fe03 100644 |
| --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist |
| @@ -513,6 +513,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 _Exit F |
| GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 |
| GLIBC_2.4 _IO_2_1_stdin_ D 0xa0 |
| diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist |
| index d28e7c60b7..e2f56880ed 100644 |
| --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist |
| @@ -510,6 +510,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 _Exit F |
| GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 |
| GLIBC_2.4 _IO_2_1_stdin_ D 0xa0 |
| diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist |
| index 922b05062f..319d92356e 100644 |
| --- a/sysdeps/unix/sysv/linux/csky/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist |
| @@ -2669,3 +2669,4 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist |
| index 412144f94c..6450e17ebe 100644 |
| --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist |
| @@ -2618,6 +2618,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist |
| index 134393900a..0a24ec9afd 100644 |
| --- a/sysdeps/unix/sysv/linux/i386/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist |
| @@ -2802,6 +2802,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |
| index 0604029c68..16243a7a92 100644 |
| --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist |
| @@ -514,6 +514,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 _Exit F |
| GLIBC_2.4 _IO_2_1_stderr_ D 0x98 |
| GLIBC_2.4 _IO_2_1_stdin_ D 0x98 |
| diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist |
| index af2be5c80d..564a553b27 100644 |
| --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist |
| @@ -2745,6 +2745,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist |
| index e090b8d48f..e850f47b21 100644 |
| --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist |
| @@ -2718,3 +2718,4 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist |
| index 8c5b2db243..37178c503f 100644 |
| --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist |
| @@ -2715,3 +2715,4 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist |
| index 68847134a2..3b30b31466 100644 |
| --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist |
| @@ -2710,6 +2710,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist |
| index daa44e64fa..0e358570a2 100644 |
| --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist |
| @@ -2708,6 +2708,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist |
| index 6169188c96..59c598b98f 100644 |
| --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist |
| @@ -2716,6 +2716,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist |
| index 58e9b486b0..463e01ab84 100644 |
| --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist |
| @@ -2757,3 +2757,4 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist |
| index 8c9ca32cbe..405d40d11c 100644 |
| --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist |
| @@ -2772,6 +2772,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 _IO_fprintf F |
| GLIBC_2.4 _IO_printf F |
| GLIBC_2.4 _IO_sprintf F |
| diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist |
| index 08a6604aab..ce89602b93 100644 |
| --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist |
| @@ -2805,6 +2805,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 _IO_fprintf F |
| GLIBC_2.4 _IO_printf F |
| GLIBC_2.4 _IO_sprintf F |
| diff --git a/sysdeps/unix/sysv/linux/ppoll.c b/sysdeps/unix/sysv/linux/ppoll.c |
| index 1105e29b00..2e173b931d 100644 |
| --- a/sysdeps/unix/sysv/linux/ppoll.c |
| +++ b/sysdeps/unix/sysv/linux/ppoll.c |
| @@ -67,7 +67,7 @@ __ppoll64 (struct pollfd *fds, nfds_t nfds, const struct __timespec64 *timeout, |
| libc_hidden_def (__ppoll64) |
| |
| int |
| -__ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, |
| +ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, |
| const sigset_t *sigmask) |
| { |
| struct __timespec64 ts64; |
| @@ -77,5 +77,4 @@ __ppoll (struct pollfd *fds, nfds_t nfds, const struct timespec *timeout, |
| return __ppoll64 (fds, nfds, timeout ? &ts64 : NULL, sigmask); |
| } |
| #endif |
| -strong_alias (__ppoll, ppoll) |
| libc_hidden_def (ppoll) |
| 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 |
| diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist |
| index 009f22931e..5ca051a9eb 100644 |
| --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist |
| @@ -2770,6 +2770,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 _IO_fprintf F |
| GLIBC_2.4 _IO_printf F |
| GLIBC_2.4 _IO_sprintf F |
| diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist |
| index afb5bc37b1..5b48168ec6 100644 |
| --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist |
| @@ -2625,6 +2625,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist |
| index 2b53a3cf92..c42b39cea8 100644 |
| --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist |
| @@ -2622,6 +2622,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 __confstr_chk F |
| GLIBC_2.4 __fgets_chk F |
| GLIBC_2.4 __fgets_unlocked_chk F |
| diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |
| index 43b9844a99..5a0a662dee 100644 |
| --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |
| +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist |
| @@ -2765,6 +2765,7 @@ GLIBC_2.36 pidfd_open F |
| GLIBC_2.36 pidfd_send_signal F |
| GLIBC_2.36 process_madvise F |
| GLIBC_2.36 process_mrelease F |
| +GLIBC_2.37 __ppoll64_chk F |
| GLIBC_2.4 _IO_fprintf F |
| GLIBC_2.4 _IO_printf F |
| GLIBC_2.4 _IO_sprintf F |