diff --git a/glibc-RHEL-15343-1.patch b/glibc-RHEL-15343-1.patch new file mode 100644 index 0000000..291e770 --- /dev/null +++ b/glibc-RHEL-15343-1.patch @@ -0,0 +1,26 @@ +commit 1626d8a521c7c771d4118b1328421fea113cab64 +Author: Joe Simmons-Talbott +Date: Fri Apr 21 09:24:22 2023 -0400 + + string: Allow use of test-string.h for non-ifunc implementations. + + Mark two variables as unused to silence warning when using + test-string.h for non-ifunc implementations. + + Reviewed-by: Adhemerval Zanella + +diff --git a/string/test-string.h b/string/test-string.h +index 41de973479..8bcb8afd0a 100644 +--- a/string/test-string.h ++++ b/string/test-string.h +@@ -130,8 +130,8 @@ cmdline_process_function (int c) + /* Increase size of FUNC_LIST if assert is triggered at run-time. */ + static struct libc_ifunc_impl func_list[32]; + static int func_count; +-static int impl_count = -1; +-static impl_t *impl_array; ++static int impl_count __attribute__ ((unused)) = -1; ++static impl_t *impl_array __attribute__ ((unused)); + + # define FOR_EACH_IMPL(impl, notall) \ + impl_t *impl; \ diff --git a/glibc-RHEL-15343-2.patch b/glibc-RHEL-15343-2.patch new file mode 100644 index 0000000..2110e90 --- /dev/null +++ b/glibc-RHEL-15343-2.patch @@ -0,0 +1,233 @@ +commit eaaad78db41724e5a18a42becb238bfc4e683998 +Author: Joe Simmons-Talbott +Date: Fri Apr 21 09:24:23 2023 -0400 + + string: Add tests for strdup (BZ #30266) + + Copy strcpy tests for strdup. Covers some basic testcases with random + strings. Add a zero-length string testcase. + + Reviewed-by: Adhemerval Zanella + Conflicts: + string/Makefile + (different test backport order) + + +diff -Nrup a/string/Makefile b/string/Makefile +--- a/string/Makefile 2023-11-30 10:59:16.400251685 -0500 ++++ b/string/Makefile 2023-11-30 11:16:42.829613344 -0500 +@@ -63,7 +63,8 @@ tests := tester inl-tester noinl-tester + 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 tst-strerror-fail ++ test-sig_np tst-strerror-fail \ ++ test-strdup + + # Both tests require the .mo translation files generated by msgfmt. + tests-translation := tst-strsignal \ +diff -Nrup a/string/test-strdup.c b/string/test-strdup.c +--- a/string/test-strdup.c 1969-12-31 19:00:00.000000000 -0500 ++++ b/string/test-strdup.c 2023-11-30 11:11:32.850447614 -0500 +@@ -0,0 +1,201 @@ ++/* Test and measure strdup functions. ++ 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 ++ ++#ifdef WIDE ++# include ++# define CHAR wchar_t ++# define sfmt "ls" ++# define BIG_CHAR WCHAR_MAX ++# define SMALL_CHAR 1273 ++# define STRCMP wcscmp ++# define MEMCMP wmemcmp ++# define MEMSET wmemset ++# define TCS TEST_COMPARE_STRING_WIDE ++#else ++# define CHAR char ++# define sfmt "s" ++# define BIG_CHAR CHAR_MAX ++# define SMALL_CHAR 127 ++# define STRCMP strcmp ++# define MEMCMP memcmp ++# define MEMSET memset ++# define TCS TEST_COMPARE_STRING ++#endif ++ ++#ifndef STRDUP_RESULT ++# define STRDUP_RESULT(dst, len) dst ++# define TEST_MAIN ++# ifndef WIDE ++# define TEST_NAME "strdup" ++# else ++# define TEST_NAME "wcsdup" ++# endif ++# include "test-string.h" ++# ifndef WIDE ++# define STRDUP strdup ++# else ++# define STRDUP wcsdup ++# endif ++#endif ++ ++typedef CHAR *(*proto_t) (const CHAR *); ++ ++static void ++do_zero_len_test (void) ++{ ++ CHAR src[1] = { '\0' }; ++ CHAR *dst = STRDUP (src); ++ ++ TCS (dst, src); ++ free (dst); ++} ++ ++static void ++do_one_test (const CHAR *src, ++ size_t len __attribute__((unused))) ++{ ++ CHAR *dst = STRDUP (src); ++ ++ if (STRCMP (dst, src) != 0) ++ { ++ error (0, 0, ++ "Wrong result in function %s dst \"%" sfmt "\" src \"%" sfmt "\"", ++ TEST_NAME, dst, src); ++ ret = 1; ++ free (dst); ++ return; ++ } ++ free (dst); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, int max_char) ++{ ++ size_t i; ++ CHAR *s1; ++/* For wcsdup: align1 and align2 here mean alignment not in bytes, ++ but in wchar_ts, in bytes it will equal to align * (sizeof (wchar_t)) ++ len for wcschr here isn't in bytes but it's number of wchar_t symbols. */ ++ align1 &= 7; ++ if ((align1 + len) * sizeof (CHAR) >= page_size) ++ return; ++ ++ align2 &= 7; ++ if ((align2 + len) * sizeof (CHAR) >= page_size) ++ return; ++ ++ s1 = (CHAR *) (buf1) + align1; ++ ++ for (i = 0; i < len; i++) ++ s1[i] = 32 + 23 * i % (max_char - 32); ++ s1[len] = 0; ++ ++ do_one_test (s1, len); ++} ++ ++static void ++do_random_tests (void) ++{ ++ size_t i, j, n, align1, align2, len; ++ CHAR *p1 = (CHAR *)(buf1 + page_size) - 512; ++ CHAR *res; ++ ++ for (n = 0; n < ITERATIONS; n++) ++ { ++ /* align1 and align2 are expressed as wchar_t and not in bytes for wide ++ char test, and thus it will be equal to align times wchar_t size. ++ ++ For non wide version we need to check all alignments from 0 to 63 ++ since some assembly implementations have separate prolog for alignments ++ more 48. */ ++ ++ align1 = random () & (63 / sizeof (CHAR)); ++ if (random () & 1) ++ align2 = random () & (63 / sizeof (CHAR)); ++ else ++ align2 = align1 + (random () & 24); ++ len = random () & 511; ++ j = align1; ++ if (align2 > j) ++ j = align2; ++ if (len + j >= 511) ++ len = 510 - j - (random () & 7); ++ j = len + align1 + 64; ++ if (j > 512) ++ j = 512; ++ for (i = 0; i < j; i++) ++ { ++ if (i == len + align1) ++ p1[i] = 0; ++ else ++ { ++ p1[i] = random () & BIG_CHAR; ++ if (i >= align1 && i < len + align1 && !p1[i]) ++ p1[i] = (random () & SMALL_CHAR) + 3; ++ } ++ } ++ ++ res = STRDUP(p1 + align1); ++ TCS (res, (p1 + align1)); ++ free (res); ++ } ++} ++ ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%23s", ""); ++ printf ("\t%s", TEST_NAME); ++ putchar ('\n'); ++ ++ for (i = 0; i < 16; ++i) ++ { ++ do_test (0, 0, i, SMALL_CHAR); ++ do_test (0, 0, i, BIG_CHAR); ++ do_test (0, i, i, SMALL_CHAR); ++ do_test (i, 0, i, BIG_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, 8 << i, SMALL_CHAR); ++ do_test (8 - i, 2 * i, 8 << i, SMALL_CHAR); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, 2 * i, 8 << i, SMALL_CHAR); ++ do_test (2 * i, i, 8 << i, BIG_CHAR); ++ do_test (i, i, 8 << i, SMALL_CHAR); ++ do_test (i, i, 8 << i, BIG_CHAR); ++ } ++ ++ do_zero_len_test (); ++ do_random_tests (); ++ ++ return ret; ++} ++ ++#include diff --git a/glibc-RHEL-15343-3.patch b/glibc-RHEL-15343-3.patch new file mode 100644 index 0000000..8cac6d9 --- /dev/null +++ b/glibc-RHEL-15343-3.patch @@ -0,0 +1,232 @@ +commit 0c48aa0551151ea201f7f528492e89a0b08a6890 +Author: Joe Simmons-Talbott +Date: Fri Apr 21 09:24:24 2023 -0400 + + string: Add tests for strndup (BZ #30266) + + Copy strncpy tests for strndup. Covers some basic testcases with random + strings. Remove tests that set the destination's bytes and checked the + resulting buffer's bytes. Remove wide character test support since + wcsndup() doesn't exist. + + Reviewed-by: Adhemerval Zanella + Conflicts: + string/Makefile + (different test backport order) + +diff -Nrup a/string/Makefile b/string/Makefile +--- a/string/Makefile 2023-11-30 11:55:02.263010916 -0500 ++++ b/string/Makefile 2023-11-30 11:58:29.238954539 -0500 +@@ -64,7 +64,7 @@ tests := tester inl-tester noinl-tester + test-endian-types test-endian-file-scope \ + test-endian-sign-conversion tst-memmove-overflow \ + test-sig_np tst-strerror-fail \ +- test-strdup ++ test-strdup test-strndup + + # Both tests require the .mo translation files generated by msgfmt. + tests-translation := tst-strsignal \ +diff -Nrup a/string/test-strndup.c b/string/test-strndup.c +--- a/string/test-strndup.c 1969-12-31 19:00:00.000000000 -0500 ++++ b/string/test-strndup.c 2023-11-30 11:56:24.986388053 -0500 +@@ -0,0 +1,200 @@ ++/* Test strndup functions. ++ 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 ++ ++#define TEST_MAIN ++#include "test-string.h" ++ ++static void ++do_one_test (const char *src, size_t len, size_t n) ++{ ++ char *dst = strndup (src, n); ++ size_t s = (len > n ? n: len) * sizeof (char); ++ ++ TEST_COMPARE_BLOB (dst, s, src, s); ++ ++ free (dst); ++} ++ ++static void ++do_test (size_t align1, size_t align2, size_t len, size_t n, int max_char) ++{ ++ size_t i; ++ char *s1; ++ ++ align1 &= 7; ++ if ((align1 + len) * sizeof (char) >= page_size) ++ return; ++ ++ align2 &= 7; ++ if ((align2 + len) * sizeof (char) >= page_size) ++ return; ++ ++ s1 = (char *) (buf1) + align1; ++ ++ for (i = 0; i < len; ++i) ++ s1[i] = 32 + 23 * i % (max_char - 32); ++ s1[len] = 0; ++ for (i = len + 1; (i + align1) * sizeof (char) < page_size && i < len + 64; ++ ++i) ++ s1[i] = 32 + 32 * i % (max_char - 32); ++ ++ do_one_test (s1, len, n); ++} ++ ++static void ++do_page_tests (void) ++{ ++ char *s1; ++ const size_t maxoffset = 64; ++ ++ /* Put s1 at the maxoffset from the edge of buf1's last page. */ ++ s1 = (char *) buf1 + BUF1PAGES * page_size / sizeof (char) - maxoffset; ++ ++ memset (s1, 'a', maxoffset - 1); ++ s1[maxoffset - 1] = '\0'; ++ ++ /* Both strings are bounded to a page with read/write access and the next ++ page is protected with PROT_NONE (meaning that any access outside of the ++ page regions will trigger an invalid memory access). ++ ++ The loop copies the string s1 for all possible offsets up to maxoffset ++ for both inputs with a size larger than s1 (so memory access outside the ++ expected memory regions might trigger invalid access). */ ++ ++ for (size_t off1 = 0; off1 < maxoffset; off1++) ++ for (size_t off2 = 0; off2 < maxoffset; off2++) ++ do_one_test (s1 + off1, maxoffset - off1 - 1, ++ maxoffset + (maxoffset - off2)); ++} ++ ++static void ++do_random_tests (void) ++{ ++ size_t i, j, n, align1, align2, len, size, mode; ++ char *p1 = (char *) (buf1 + page_size) - 512; ++ char *res; ++ ++ for (n = 0; n < ITERATIONS; n++) ++ { ++ mode = random (); ++ if (mode & 1) ++ { ++ size = random () & 255; ++ align1 = 512 - size - (random () & 15); ++ if (mode & 2) ++ align2 = align1 - (random () & 24); ++ else ++ align2 = align1 - (random () & 31); ++ if (mode & 4) ++ { ++ j = align1; ++ align1 = align2; ++ align2 = j; ++ } ++ if (mode & 8) ++ len = size - (random () & 31); ++ else ++ len = 512; ++ if (len >= 512) ++ len = random () & 511; ++ } ++ else ++ { ++ align1 = random () & 31; ++ if (mode & 2) ++ align2 = random () & 31; ++ else ++ align2 = align1 + (random () & 24); ++ len = random () & 511; ++ j = align1; ++ if (align2 > j) ++ j = align2; ++ if (mode & 4) ++ { ++ size = random () & 511; ++ if (size + j > 512) ++ size = 512 - j - (random () & 31); ++ } ++ else ++ size = 512 - j; ++ if ((mode & 8) && len + j >= 512) ++ len = 512 - j - (random () & 7); ++ } ++ j = len + align1 + 64; ++ if (j > 512) ++ j = 512; ++ for (i = 0; i < j; i++) ++ { ++ if (i == len + align1) ++ p1[i] = 0; ++ else ++ { ++ p1[i] = random () & CHAR_MAX; ++ if (i >= align1 && i < len + align1 && !p1[i]) ++ p1[i] = (random () & 127) + 3; ++ } ++ } ++ ++ res = (char *) strndup ((char *) (p1 + align1), size); ++ j = len + 1; ++ if (size < j) ++ j = size; ++ TEST_COMPARE_BLOB (res, j, (char *) (p1 + align1), j); ++ free (res); ++ } ++} ++ ++int ++test_main (void) ++{ ++ size_t i; ++ ++ test_init (); ++ ++ printf ("%28s", ""); ++ printf ("\t%s", "strndup"); ++ putchar ('\n'); ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (i, i, 16, 16, 127); ++ do_test (i, i, 16, 16, CHAR_MAX); ++ do_test (i, 2 * i, 16, 16, 127); ++ do_test (2 * i, i, 16, 16, CHAR_MAX); ++ do_test (8 - i, 2 * i, 1 << i, 2 << i, 127); ++ do_test (2 * i, 8 - i, 2 << i, 1 << i, 127); ++ do_test (8 - i, 2 * i, 1 << i, 2 << i, CHAR_MAX); ++ do_test (2 * i, 8 - i, 2 << i, 1 << i, CHAR_MAX); ++ } ++ ++ for (i = 1; i < 8; ++i) ++ { ++ do_test (0, 0, 4 << i, 8 << i, 127); ++ do_test (0, 0, 16 << i, 8 << i, 127); ++ do_test (8 - i, 2 * i, 4 << i, 8 << i, 127); ++ do_test (8 - i, 2 * i, 16 << i, 8 << i, 127); ++ } ++ ++ do_random_tests (); ++ do_page_tests (); ++ return ret; ++} ++ ++#include diff --git a/glibc-RHEL-15343-4.patch b/glibc-RHEL-15343-4.patch new file mode 100644 index 0000000..cd2a826 --- /dev/null +++ b/glibc-RHEL-15343-4.patch @@ -0,0 +1,33 @@ +commit 0aa5b28a504c6f1f17b387d8147715d1496fff62 +Author: Joe Simmons-Talbott +Date: Fri Apr 21 09:24:25 2023 -0400 + + wcsmbs: Add wcsdup() tests. (BZ #30266) + + Enable wide character testcases for wcsdup(). + + Reviewed-by: Adhemerval Zanella + Conflicts: + wcsmbs/Makefile + (different test backport order) + + +diff -Nrup a/wcsmbs/Makefile b/wcsmbs/Makefile +--- a/wcsmbs/Makefile 2023-11-30 14:14:18.755010508 -0500 ++++ b/wcsmbs/Makefile 2023-11-30 14:38:18.511131851 -0500 +@@ -53,7 +53,8 @@ tests := tst-wcstof wcsmbs-tst1 tst-wcsn + tst-c16c32-1 wcsatcliff tst-wcstol-locale tst-wcstod-nan-locale \ + tst-wcstod-round test-char-types tst-fgetwc-after-eof \ + tst-wcstod-nan-sign tst-c16-surrogate tst-c32-state \ +- $(addprefix test-,$(strop-tests)) tst-mbstowcs ++ $(addprefix test-,$(strop-tests)) tst-mbstowcs \ ++ test-wcsdup + + include ../Rules + +diff -Nrup a/wcsmbs/test-wcsdup.c b/wcsmbs/test-wcsdup.c +--- a/wcsmbs/test-wcsdup.c 1969-12-31 19:00:00.000000000 -0500 ++++ b/wcsmbs/test-wcsdup.c 2023-11-30 14:14:48.869138712 -0500 +@@ -0,0 +1,2 @@ ++#define WIDE 1 ++#include "../string/test-strdup.c" diff --git a/glibc.spec b/glibc.spec index 4663bbf..da34e00 100644 --- a/glibc.spec +++ b/glibc.spec @@ -155,7 +155,7 @@ end \ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 91%{?dist} +Release: 92%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -781,6 +781,11 @@ Patch544: glibc-RHEL-2338-1.patch Patch545: glibc-RHEL-2338-2.patch Patch546: glibc-RHEL-2338-3.patch Patch547: glibc-RHEL-2338-4.patch +Patch548: glibc-RHEL-15343-1.patch +Patch549: glibc-RHEL-15343-2.patch +Patch550: glibc-RHEL-15343-3.patch +Patch551: glibc-RHEL-15343-4.patch + ############################################################################## # Continued list of core "glibc" package information: @@ -2939,6 +2944,9 @@ update_gconv_modules_cache () %endif %changelog +* Fri Dec 1 2023 Patsy Griffin - 2.34-92 +- Improve test coverage for wcsdup, strdup and strndup. (RHEL-15343) + * Fri Nov 24 2023 Florian Weimer - 2.34-91 - fstat performance enhancement (RHEL-2338)