From 718e3294c5134d3a8af6daf12910c2282dffb1f1 Mon Sep 17 00:00:00 2001 From: Lv Ying Date: Wed, 30 Aug 2023 10:55:12 +0800 Subject: [PATCH] string: strerror must not return NULL (bug 30555) Reference: https://sourceware.org/git/?p=glibc.git;a=commit;h=1d44530a5be2442e064baa48139adc9fdfb1fc6b Signed-off-by: Lv Ying (cherry picked from commit 18d6e3aaebbff63febc2f1a3a429f051064096f6) --- ...error-must-not-return-NULL-bug-30555.patch | 141 ++++++++++++++++++ glibc.spec | 6 +- 2 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 backport-string-strerror-must-not-return-NULL-bug-30555.patch diff --git a/backport-string-strerror-must-not-return-NULL-bug-30555.patch b/backport-string-strerror-must-not-return-NULL-bug-30555.patch new file mode 100644 index 0000000..95acf94 --- /dev/null +++ b/backport-string-strerror-must-not-return-NULL-bug-30555.patch @@ -0,0 +1,141 @@ +From d68468ccde45b80e271735d8bbbdb7d3cc7eb420 Mon Sep 17 00:00:00 2001 +From: Florian Weimer +Date: Thu, 15 Jun 2023 12:08:22 +0200 +Subject: [PATCH] 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 +--- + string/Makefile | 2 +- + string/strerror_l.c | 13 +++++-- + string/tst-strerror-fail.c | 77 ++++++++++++++++++++++++++++++++++++++ + 3 files changed, 87 insertions(+), 5 deletions(-) + create mode 100644 string/tst-strerror-fail.c + +diff --git a/string/Makefile b/string/Makefile +index f0fce2a0..a385c8fd 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 a381c79c..20aa3efe 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 00000000..e0fa45ab +--- /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 +-- +2.40.1 + diff --git a/glibc.spec b/glibc.spec index 157e058..d605fc5 100644 --- a/glibc.spec +++ b/glibc.spec @@ -70,7 +70,7 @@ ############################################################################## Name: glibc Version: 2.34 -Release: 132 +Release: 133 Summary: The GNU libc libraries License: %{all_license} URL: http://www.gnu.org/software/glibc/ @@ -273,6 +273,7 @@ Patch182: backport-elf-fix-handling-of-negative-numbers-in-dl-printf.patch Patch183: backport-rtld-properly-handle-root-directory-in-load-path-bug-30435.patch Patch184: time-Fix-use-after-free-in-getdate.patch Patch185: time-strftime_l-Avoid-an-unbounded-alloca.patch +Patch186: backport-string-strerror-must-not-return-NULL-bug-30555.patch Patch9000: turn-default-value-of-x86_rep_stosb_threshold_form_2K_to_1M.patch Patch9001: delete-no-hard-link-to-avoid-all_language-package-to.patch @@ -1496,6 +1497,9 @@ fi %endif %changelog +* Wed Aug 30 2023 Lv Ying - 2.34-133 +- string: strerror must not return NULL (bug 30555) + * Tue Aug 29 2023 chenhaixiang - 2.34-132 - time: strftime_l: Avoid an unbounded alloca. -- Gitee