diff --git a/glibc-rh2215368.patch b/glibc-rh2215368.patch new file mode 100644 index 0000000..d037ca1 --- /dev/null +++ b/glibc-rh2215368.patch @@ -0,0 +1,137 @@ +commit 1d44530a5be2442e064baa48139adc9fdfb1fc6b +Author: Florian Weimer +Date: Thu Jun 15 12:08:22 2023 +0200 + + string: strerror must not return NULL (bug 30555) + + For strerror, this fixes commit 28aff047818eb1726394296d27b ("string: + Implement strerror in terms of strerror_l"). This commit avoids + returning NULL for strerror_l as well, although POSIX allows this + behavior for strerror_l. + + Reviewed-by: Arjun Shankar + +Conflicts: + string/Makefile + (usual test differences) + +diff --git a/string/Makefile b/string/Makefile +index f0fce2a0b8dea752..a385c8fdfed330b2 100644 +--- a/string/Makefile ++++ b/string/Makefile +@@ -63,7 +63,7 @@ tests := tester inl-tester noinl-tester testcopy test-ffs \ + tst-strtok_r bug-strcoll2 tst-cmp tst-xbzero-opt \ + test-endian-types test-endian-file-scope \ + test-endian-sign-conversion tst-memmove-overflow \ +- test-sig_np ++ test-sig_np tst-strerror-fail + + # Both tests require the .mo translation files generated by msgfmt. + tests-translation := tst-strsignal \ +diff --git a/string/strerror_l.c b/string/strerror_l.c +index a381c79c5a0ba2a1..20aa3efe4714faee 100644 +--- a/string/strerror_l.c ++++ b/string/strerror_l.c +@@ -43,10 +43,15 @@ __strerror_l (int errnum, locale_t loc) + struct tls_internal_t *tls_internal = __glibc_tls_internal (); + free (tls_internal->strerror_l_buf); + if (__asprintf (&tls_internal->strerror_l_buf, "%s%d", +- translate ("Unknown error ", loc), errnum) == -1) +- tls_internal->strerror_l_buf = NULL; +- +- err = tls_internal->strerror_l_buf; ++ translate ("Unknown error ", loc), errnum) > 0) ++ err = tls_internal->strerror_l_buf; ++ else ++ { ++ /* The memory was freed above. */ ++ tls_internal->strerror_l_buf = NULL; ++ /* Provide a fallback translation. */ ++ err = (char *) translate ("Unknown error", loc); ++ } + } + else + err = (char *) translate (err, loc); +diff --git a/string/tst-strerror-fail.c b/string/tst-strerror-fail.c +new file mode 100644 +index 0000000000000000..e0fa45ab2b12f6b3 +--- /dev/null ++++ b/string/tst-strerror-fail.c +@@ -0,0 +1,77 @@ ++/* Check that strerror, strerror_l do not return NULL on failure (bug 30555). ++ Copyright (C) 2023 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 ++ . */ ++ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* Interposed malloc that can be used to inject allocation failures. */ ++ ++static volatile bool fail_malloc; ++ ++void * ++malloc (size_t size) ++{ ++ if (fail_malloc) ++ return NULL; ++ ++ static void *(*original_malloc) (size_t); ++ if (original_malloc == NULL) ++ original_malloc = xdlsym (RTLD_NEXT, "malloc"); ++ return original_malloc (size); ++} ++ ++/* Callbacks for the actual tests. Use fork to run both tests with a ++ clean state. */ ++ ++static void ++test_strerror (void *closure) ++{ ++ fail_malloc = true; ++ const char *s = strerror (999); ++ fail_malloc = false; ++ TEST_COMPARE_STRING (s, "Unknown error"); ++} ++ ++static void ++test_strerror_l (void *closure) ++{ ++ locale_t loc = newlocale (LC_ALL, "C", (locale_t) 0); ++ TEST_VERIFY (loc != (locale_t) 0); ++ fail_malloc = true; ++ const char *s = strerror_l (999, loc); ++ fail_malloc = false; ++ TEST_COMPARE_STRING (s, "Unknown error"); ++ freelocale (loc); ++} ++ ++static int ++do_test (void) ++{ ++ support_isolate_in_subprocess (test_strerror, NULL); ++ support_isolate_in_subprocess (test_strerror_l, NULL); ++ ++ return 0; ++} ++ ++#include diff --git a/glibc.spec b/glibc.spec index 28c0b11..cb6a585 100644 --- a/glibc.spec +++ b/glibc.spec @@ -155,7 +155,7 @@ end \ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 68%{?dist} +Release: 69%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -719,6 +719,11 @@ Patch484: glibc-upstream-2.34-397.patch # glibc-upstream-2.34-398.patch not backported because we can avoid the # ABI tunable issue downstream, using @order directives. +# This marks the end of backports via upstream release/2.34/master. +# All future backports need maintain CentOS 9 Stream and RHEL 9 only. + +Patch485: glibc-rh2215368.patch + ############################################################################## # Continued list of core "glibc" package information: ############################################################################## @@ -2875,6 +2880,9 @@ update_gconv_modules_cache () %endif %changelog +* Mon Jun 26 2023 Arjun Shankar - 2.34-69 +- strerror must not return NULL (#2215368) + * Mon May 08 2023 DJ Delorie - 2.34-68 - Switch to sysusers_ctl instead of useradd (#2095417)