diff --git a/glibc-upstream-2.33-11.patch b/glibc-upstream-2.33-11.patch new file mode 100644 index 0000000..9d2a661 --- /dev/null +++ b/glibc-upstream-2.33-11.patch @@ -0,0 +1,179 @@ +commit ee9f98d9cac12e843ca59c6e4d4b225f58a66727 +Author: H.J. Lu +Date: Tue Feb 2 13:45:58 2021 -0800 + + x86: Set minimum x86-64 level marker [BZ #27318] + + Since the full ISA set used in an ELF binary is unknown to compiler, + an x86-64 ISA level marker indicates the minimum, not maximum, ISA set + required to run such an ELF binary. We never guarantee a library with + an x86-64 ISA level v3 marker doesn't contain other ISAs beyond x86-64 + ISA level v3, like AVX VNNI. We check the x86-64 ISA level marker for + the minimum ISA set. Since -march=sandybridge enables only some ISAs + in x86-64 ISA level v3, we should set the needed ISA marker to v2. + Otherwise, libc is compiled with -march=sandybridge will fail to run on + Sandy Bridge: + + $ ./elf/ld.so ./libc.so + ./libc.so: (p) CPU ISA level is lower than required: needed: 7; got: 3 + + Set the minimum, instead of maximum, x86-64 ISA level marker should have + no impact on the glibc-hwcaps directory assignment logic in ldconfig nor + ld.so. + + (cherry picked from commit 339bf918ea4830fb35614632e96f3aab3237adce) + +diff --git a/config.h.in b/config.h.in +index 06ee8ae26a0eb833..f21bf04e4791e5dc 100644 +--- a/config.h.in ++++ b/config.h.in +@@ -275,4 +275,10 @@ + /* Define if x86 ISA level should be included in shared libraries. */ + #undef INCLUDE_X86_ISA_LEVEL + ++/* Define if -msahf is enabled by default on x86. */ ++#undef HAVE_X86_LAHF_SAHF ++ ++/* Define if -mmovbe is enabled by default on x86. */ ++#undef HAVE_X86_MOVBE ++ + #endif +diff --git a/sysdeps/x86/configure b/sysdeps/x86/configure +index 5e32dc62b334b27f..ead1295c38cf5f4e 100644 +--- a/sysdeps/x86/configure ++++ b/sysdeps/x86/configure +@@ -126,6 +126,8 @@ cat > conftest2.S <&5 + (eval $ac_try) 2>&5 +@@ -135,6 +137,24 @@ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -nostartfiles -nostdlib -r -o conftest c + count=`LC_ALL=C $READELF -n conftest | grep NT_GNU_PROPERTY_TYPE_0 | wc -l` + if test "$count" = 1; then + libc_cv_include_x86_isa_level=yes ++ cat > conftest.c <&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; } | grep -q "\-msahf"; then ++ libc_cv_have_x86_lahf_sahf=yes ++ fi ++ if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -fverbose-asm -S -o - conftest.c' ++ { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; } | grep -q "\-mmovbe"; then ++ libc_cv_have_x86_movbe=yes ++ fi + fi + fi + rm -f conftest* +@@ -144,6 +164,14 @@ $as_echo "$libc_cv_include_x86_isa_level" >&6; } + if test $libc_cv_include_x86_isa_level = yes; then + $as_echo "#define INCLUDE_X86_ISA_LEVEL 1" >>confdefs.h + ++fi ++if test $libc_cv_have_x86_lahf_sahf = yes; then ++ $as_echo "#define HAVE_X86_LAHF_SAHF 1" >>confdefs.h ++ ++fi ++if test $libc_cv_have_x86_movbe = yes; then ++ $as_echo "#define HAVE_X86_MOVBE 1" >>confdefs.h ++ + fi + config_vars="$config_vars + enable-x86-isa-level = $libc_cv_include_x86_isa_level" +diff --git a/sysdeps/x86/configure.ac b/sysdeps/x86/configure.ac +index f94088f377ec95ab..bca97fdc2f1ac1a7 100644 +--- a/sysdeps/x86/configure.ac ++++ b/sysdeps/x86/configure.ac +@@ -98,14 +98,30 @@ cat > conftest2.S < conftest.c < +Date: Thu Feb 25 16:08:21 2021 -0500 + + nscd: Fix double free in netgroupcache [BZ #27462] + + In commit 745664bd798ec8fd50438605948eea594179fba1 a use-after-free + was fixed, but this led to an occasional double-free. This patch + tracks the "live" allocation better. + + Tested manually by a third party. + + Related: RHBZ 1927877 + + Reviewed-by: Siddhesh Poyarekar + Reviewed-by: Carlos O'Donell + (cherry picked from commit dca565886b5e8bd7966e15f0ca42ee5cff686673) + +diff --git a/nscd/netgroupcache.c b/nscd/netgroupcache.c +index dba6ceec1be490bf..ad2daddafdc9d80c 100644 +--- a/nscd/netgroupcache.c ++++ b/nscd/netgroupcache.c +@@ -248,7 +248,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + : NULL); + ndomain = (ndomain ? newbuf + ndomaindiff + : NULL); +- buffer = newbuf; ++ *tofreep = buffer = newbuf; + } + + nhost = memcpy (buffer + bufused, +@@ -319,7 +319,7 @@ addgetnetgrentX (struct database_dyn *db, int fd, request_header *req, + else if (status == NSS_STATUS_TRYAGAIN && e == ERANGE) + { + buflen *= 2; +- buffer = xrealloc (buffer, buflen); ++ *tofreep = buffer = xrealloc (buffer, buflen); + } + else if (status == NSS_STATUS_RETURN + || status == NSS_STATUS_NOTFOUND diff --git a/glibc-upstream-2.33-13.patch b/glibc-upstream-2.33-13.patch new file mode 100644 index 0000000..98eca5e --- /dev/null +++ b/glibc-upstream-2.33-13.patch @@ -0,0 +1,241 @@ +commit 32b9280f1d9f78e8fa3874e22f4d9a76460ee02a +Author: Adhemerval Zanella +Date: Thu Mar 11 08:21:06 2021 -0300 + + io: Return EBAFD for negative file descriptor on fstat (BZ #27559) + + Now that fstat is implemented on top fstatat we need to handle negative + inputs. The implementation now rejects AT_FDCWD, which would otherwise + be accepted by the kernel. + + Checked on x86_64-linux-gnu and on i686-linux-gnu. + + (cherry picked from commit 94caafa040e4b4289c968cd70d53041b1463ac4d) + +diff --git a/io/Makefile b/io/Makefile +index b7bebe923f84e878..d145d88f4e3faabf 100644 +--- a/io/Makefile ++++ b/io/Makefile +@@ -68,7 +68,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ + tst-fts tst-fts-lfs tst-open-tmpfile \ + tst-copy_file_range tst-getcwd-abspath tst-lockf \ + tst-ftw-lnk tst-file_change_detection tst-lchmod \ +- tst-ftw-bz26353 ++ tst-ftw-bz26353 tst-stat tst-stat-lfs + + # Likewise for statx, but we do not need static linking here. + tests-internal += tst-statx +diff --git a/io/fstat.c b/io/fstat.c +index dc117361ffe7064b..17f31bf3b3a65a12 100644 +--- a/io/fstat.c ++++ b/io/fstat.c +@@ -16,10 +16,16 @@ + . */ + + #include ++#include + + int + __fstat (int fd, struct stat *buf) + { ++ if (fd < 0) ++ { ++ __set_errno (EBADF); ++ return -1; ++ } + return __fstatat (fd, "", buf, AT_EMPTY_PATH); + } + +diff --git a/io/fstat64.c b/io/fstat64.c +index addf3797754f16b3..618170695cd56eec 100644 +--- a/io/fstat64.c ++++ b/io/fstat64.c +@@ -16,10 +16,16 @@ + . */ + + #include ++#include + + int + __fstat64 (int fd, struct stat64 *buf) + { ++ if (fd < 0) ++ { ++ __set_errno (EBADF); ++ return -1; ++ } + return __fstatat64 (fd, "", buf, AT_EMPTY_PATH); + } + hidden_def (__fstat64) +diff --git a/io/tst-stat-lfs.c b/io/tst-stat-lfs.c +new file mode 100644 +index 0000000000000000..b53f460ad589c383 +--- /dev/null ++++ b/io/tst-stat-lfs.c +@@ -0,0 +1,2 @@ ++#define _FILE_OFFSET_BITS 64 ++#include "tst-stat.c" +diff --git a/io/tst-stat.c b/io/tst-stat.c +new file mode 100644 +index 0000000000000000..445ac4176c1d0f94 +--- /dev/null ++++ b/io/tst-stat.c +@@ -0,0 +1,102 @@ ++/* Basic tests for stat, lstat, fstat, and fstatat. ++ Copyright (C) 2021 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 ++#include ++#include ++#include ++ ++static void ++stat_check (int fd, const char *path, struct stat *st) ++{ ++ TEST_COMPARE (stat (path, st), 0); ++} ++ ++static void ++lstat_check (int fd, const char *path, struct stat *st) ++{ ++ TEST_COMPARE (lstat (path, st), 0); ++} ++ ++static void ++fstat_check (int fd, const char *path, struct stat *st) ++{ ++ /* Test for invalid fstat input (BZ #27559). */ ++ TEST_COMPARE (fstat (AT_FDCWD, st), -1); ++ TEST_COMPARE (errno, EBADF); ++ ++ TEST_COMPARE (fstat (fd, st), 0); ++} ++ ++static void ++fstatat_check (int fd, const char *path, struct stat *st) ++{ ++ TEST_COMPARE (fstatat (fd, "", st, 0), -1); ++ TEST_COMPARE (errno, ENOENT); ++ ++ TEST_COMPARE (fstatat (fd, path, st, 0), 0); ++} ++ ++typedef void (*test_t)(int, const char *path, struct stat *); ++ ++static int ++do_test (void) ++{ ++ char *path; ++ int fd = create_temp_file ("tst-fstat.", &path); ++ TEST_VERIFY_EXIT (fd >= 0); ++ support_write_file_string (path, "abc"); ++ ++ struct statx stx; ++ TEST_COMPARE (statx (fd, path, 0, STATX_BASIC_STATS, &stx), 0); ++ ++ test_t tests[] = { stat_check, lstat_check, fstat_check, fstatat_check }; ++ ++ for (int i = 0; i < array_length (tests); i++) ++ { ++ struct stat st; ++ tests[i](fd, path, &st); ++ ++ TEST_COMPARE (stx.stx_dev_major, major (st.st_dev)); ++ TEST_COMPARE (stx.stx_dev_minor, minor (st.st_dev)); ++ TEST_COMPARE (stx.stx_ino, st.st_ino); ++ TEST_COMPARE (stx.stx_mode, st.st_mode); ++ TEST_COMPARE (stx.stx_nlink, st.st_nlink); ++ TEST_COMPARE (stx.stx_uid, st.st_uid); ++ TEST_COMPARE (stx.stx_gid, st.st_gid); ++ TEST_COMPARE (stx.stx_rdev_major, major (st.st_rdev)); ++ TEST_COMPARE (stx.stx_rdev_minor, minor (st.st_rdev)); ++ TEST_COMPARE (stx.stx_blksize, st.st_blksize); ++ TEST_COMPARE (stx.stx_blocks, st.st_blocks); ++ ++ TEST_COMPARE (stx.stx_ctime.tv_sec, st.st_ctim.tv_sec); ++ TEST_COMPARE (stx.stx_ctime.tv_nsec, st.st_ctim.tv_nsec); ++ TEST_COMPARE (stx.stx_mtime.tv_sec, st.st_mtim.tv_sec); ++ TEST_COMPARE (stx.stx_mtime.tv_nsec, st.st_mtim.tv_nsec); ++ } ++ ++ return 0; ++} ++ ++#include +diff --git a/sysdeps/unix/sysv/linux/fstat.c b/sysdeps/unix/sysv/linux/fstat.c +index fd643622054fea26..31a172dcc81163e7 100644 +--- a/sysdeps/unix/sysv/linux/fstat.c ++++ b/sysdeps/unix/sysv/linux/fstat.c +@@ -19,11 +19,17 @@ + #include + #include + #include ++#include + + #if !XSTAT_IS_XSTAT64 + int + __fstat (int fd, struct stat *buf) + { ++ if (fd < 0) ++ { ++ __set_errno (EBADF); ++ return -1; ++ } + return __fstatat (fd, "", buf, AT_EMPTY_PATH); + } + +diff --git a/sysdeps/unix/sysv/linux/fstat64.c b/sysdeps/unix/sysv/linux/fstat64.c +index 993abcb4458fa309..46de80b663b9c1c4 100644 +--- a/sysdeps/unix/sysv/linux/fstat64.c ++++ b/sysdeps/unix/sysv/linux/fstat64.c +@@ -22,10 +22,16 @@ + #include + #include + #include ++#include + + int + __fstat64_time64 (int fd, struct __stat64_t64 *buf) + { ++ if (fd < 0) ++ { ++ __set_errno (EBADF); ++ return -1; ++ } + return __fstatat64_time64 (fd, "", buf, AT_EMPTY_PATH); + } + #if __TIMESIZE != 64 +@@ -34,6 +40,12 @@ hidden_def (__fstat64_time64) + int + __fstat64 (int fd, struct stat64 *buf) + { ++ if (fd < 0) ++ { ++ __set_errno (EBADF); ++ return -1; ++ } ++ + struct __stat64_t64 st_t64; + return __fstat64_time64 (fd, &st_t64) + ?: __cp_stat64_t64_stat64 (&st_t64, buf); diff --git a/glibc-upstream-2.33-14.patch b/glibc-upstream-2.33-14.patch new file mode 100644 index 0000000..1f7a7cf --- /dev/null +++ b/glibc-upstream-2.33-14.patch @@ -0,0 +1,193 @@ +commit 64f6c287ad3ccd807b7d4c694f4a91e2a662fed5 +Author: H.J. Lu +Date: Sat Mar 6 10:19:32 2021 -0800 + + x86: Handle _SC_LEVEL1_ICACHE_LINESIZE [BZ #27444] + + commit 2d651eb9265d1366d7b9e881bfddd46db9c1ecc4 + Author: H.J. Lu + Date: Fri Sep 18 07:55:14 2020 -0700 + + x86: Move x86 processor cache info to cpu_features + + missed _SC_LEVEL1_ICACHE_LINESIZE. + + 1. Add level1_icache_linesize to struct cpu_features. + 2. Initialize level1_icache_linesize by calling handle_intel, + handle_zhaoxin and handle_amd with _SC_LEVEL1_ICACHE_LINESIZE. + 3. Return level1_icache_linesize for _SC_LEVEL1_ICACHE_LINESIZE. + + Reviewed-by: Carlos O'Donell + (cherry picked from commit f53ffc9b90cbd92fa5518686daf4091bdd1d4889) + +diff --git a/sysdeps/x86/Makefile b/sysdeps/x86/Makefile +index dd826743426ffc9c..d231263051f1c242 100644 +--- a/sysdeps/x86/Makefile ++++ b/sysdeps/x86/Makefile +@@ -208,3 +208,11 @@ $(objpfx)check-cet.out: $(..)sysdeps/x86/check-cet.awk \ + generated += check-cet.out + endif + endif ++ ++ifeq ($(subdir),posix) ++tests += \ ++ tst-sysconf-cache-linesize \ ++ tst-sysconf-cache-linesize-static ++tests-static += \ ++ tst-sysconf-cache-linesize-static ++endif +diff --git a/sysdeps/x86/cacheinfo.c b/sysdeps/x86/cacheinfo.c +index 7b8df45e3bb6eaa1..5ea4723ca69d7b62 100644 +--- a/sysdeps/x86/cacheinfo.c ++++ b/sysdeps/x86/cacheinfo.c +@@ -32,6 +32,9 @@ __cache_sysconf (int name) + case _SC_LEVEL1_ICACHE_SIZE: + return cpu_features->level1_icache_size; + ++ case _SC_LEVEL1_ICACHE_LINESIZE: ++ return cpu_features->level1_icache_linesize; ++ + case _SC_LEVEL1_DCACHE_SIZE: + return cpu_features->level1_dcache_size; + +diff --git a/sysdeps/x86/dl-cacheinfo.h b/sysdeps/x86/dl-cacheinfo.h +index 6f91651f0da1d46a..2ab3acd83e1cfd97 100644 +--- a/sysdeps/x86/dl-cacheinfo.h ++++ b/sysdeps/x86/dl-cacheinfo.h +@@ -707,6 +707,7 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) + long int core; + unsigned int threads = 0; + unsigned long int level1_icache_size = -1; ++ unsigned long int level1_icache_linesize = -1; + unsigned long int level1_dcache_size = -1; + unsigned long int level1_dcache_assoc = -1; + unsigned long int level1_dcache_linesize = -1; +@@ -726,6 +727,8 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) + + level1_icache_size + = handle_intel (_SC_LEVEL1_ICACHE_SIZE, cpu_features); ++ level1_icache_linesize ++ = handle_intel (_SC_LEVEL1_ICACHE_LINESIZE, cpu_features); + level1_dcache_size = data; + level1_dcache_assoc + = handle_intel (_SC_LEVEL1_DCACHE_ASSOC, cpu_features); +@@ -753,6 +756,7 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) + shared = handle_zhaoxin (_SC_LEVEL3_CACHE_SIZE); + + level1_icache_size = handle_zhaoxin (_SC_LEVEL1_ICACHE_SIZE); ++ level1_icache_linesize = handle_zhaoxin (_SC_LEVEL1_ICACHE_LINESIZE); + level1_dcache_size = data; + level1_dcache_assoc = handle_zhaoxin (_SC_LEVEL1_DCACHE_ASSOC); + level1_dcache_linesize = handle_zhaoxin (_SC_LEVEL1_DCACHE_LINESIZE); +@@ -772,6 +776,7 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) + shared = handle_amd (_SC_LEVEL3_CACHE_SIZE); + + level1_icache_size = handle_amd (_SC_LEVEL1_ICACHE_SIZE); ++ level1_icache_linesize = handle_amd (_SC_LEVEL1_ICACHE_LINESIZE); + level1_dcache_size = data; + level1_dcache_assoc = handle_amd (_SC_LEVEL1_DCACHE_ASSOC); + level1_dcache_linesize = handle_amd (_SC_LEVEL1_DCACHE_LINESIZE); +@@ -833,6 +838,7 @@ dl_init_cacheinfo (struct cpu_features *cpu_features) + } + + cpu_features->level1_icache_size = level1_icache_size; ++ cpu_features->level1_icache_linesize = level1_icache_linesize; + cpu_features->level1_dcache_size = level1_dcache_size; + cpu_features->level1_dcache_assoc = level1_dcache_assoc; + cpu_features->level1_dcache_linesize = level1_dcache_linesize; +diff --git a/sysdeps/x86/dl-diagnostics-cpu.c b/sysdeps/x86/dl-diagnostics-cpu.c +index 55c6f35c7cabb4da..af8486470826426d 100644 +--- a/sysdeps/x86/dl-diagnostics-cpu.c ++++ b/sysdeps/x86/dl-diagnostics-cpu.c +@@ -89,6 +89,8 @@ _dl_diagnostics_cpu (void) + cpu_features->rep_stosb_threshold); + print_cpu_features_value ("level1_icache_size", + cpu_features->level1_icache_size); ++ print_cpu_features_value ("level1_icache_linesize", ++ cpu_features->level1_icache_linesize); + print_cpu_features_value ("level1_dcache_size", + cpu_features->level1_dcache_size); + print_cpu_features_value ("level1_dcache_assoc", +diff --git a/sysdeps/x86/include/cpu-features.h b/sysdeps/x86/include/cpu-features.h +index 184dc93c699d9b91..04d8e5734eb53e2b 100644 +--- a/sysdeps/x86/include/cpu-features.h ++++ b/sysdeps/x86/include/cpu-features.h +@@ -859,6 +859,8 @@ struct cpu_features + unsigned long int rep_stosb_threshold; + /* _SC_LEVEL1_ICACHE_SIZE. */ + unsigned long int level1_icache_size; ++ /* _SC_LEVEL1_ICACHE_LINESIZE. */ ++ unsigned long int level1_icache_linesize; + /* _SC_LEVEL1_DCACHE_SIZE. */ + unsigned long int level1_dcache_size; + /* _SC_LEVEL1_DCACHE_ASSOC. */ +diff --git a/sysdeps/x86/tst-sysconf-cache-linesize-static.c b/sysdeps/x86/tst-sysconf-cache-linesize-static.c +new file mode 100644 +index 0000000000000000..152ae68821748b3d +--- /dev/null ++++ b/sysdeps/x86/tst-sysconf-cache-linesize-static.c +@@ -0,0 +1 @@ ++#include "tst-sysconf-cache-linesize.c" +diff --git a/sysdeps/x86/tst-sysconf-cache-linesize.c b/sysdeps/x86/tst-sysconf-cache-linesize.c +new file mode 100644 +index 0000000000000000..642dbde5d25b7c5e +--- /dev/null ++++ b/sysdeps/x86/tst-sysconf-cache-linesize.c +@@ -0,0 +1,57 @@ ++/* Test system cache line sizes. ++ Copyright (C) 2021 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 ++ ++static struct ++{ ++ const char *name; ++ int _SC_val; ++} sc_options[] = ++ { ++#define N(name) { "_SC_"#name, _SC_##name } ++ N (LEVEL1_ICACHE_LINESIZE), ++ N (LEVEL1_DCACHE_LINESIZE), ++ N (LEVEL2_CACHE_LINESIZE) ++ }; ++ ++static int ++do_test (void) ++{ ++ int result = EXIT_SUCCESS; ++ ++ for (int i = 0; i < array_length (sc_options); ++i) ++ { ++ long int scret = sysconf (sc_options[i]._SC_val); ++ if (scret < 0) ++ { ++ printf ("sysconf (%s) returned < 0 (%ld)\n", ++ sc_options[i].name, scret); ++ result = EXIT_FAILURE; ++ } ++ else ++ printf ("sysconf (%s): %ld\n", sc_options[i].name, scret); ++ } ++ ++ return result; ++} ++ ++#include diff --git a/glibc-upstream-2.33-15.patch b/glibc-upstream-2.33-15.patch new file mode 100644 index 0000000..a527e02 --- /dev/null +++ b/glibc-upstream-2.33-15.patch @@ -0,0 +1,162 @@ +commit ea5a537e879bb667e03435a2308d915dc89448a6 +Author: Carlos O'Donell +Date: Fri Mar 12 16:44:47 2021 +0100 + + elf: Always set l in _dl_init_paths (bug 23462) + + After d1d5471579eb0426671bf94f2d71e61dfb204c30 ("Remove dead + DL_DST_REQ_STATIC code.") we always setup the link map l to make the + static and shared cases the same. The bug is that in elf/dl-load.c + (_dl_init_paths) we conditionally set l only in the #ifdef SHARED + case, but unconditionally use it later. The simple solution is to + remove the #ifdef SHARED conditional, because it's no longer needed, + and unconditionally setup l for both the static and shared cases. A + regression test is added to run a static binary with + LD_LIBRARY_PATH='$ORIGIN' which crashes before the fix and runs after + the fix. + + Co-Authored-By: Florian Weimer + (cherry picked from commit 332421312576bd7095e70589154af99b124dd2d1) + +diff --git a/elf/Makefile b/elf/Makefile +index 7610fa080f3f4738..63da0ed64f6234a8 100644 +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -164,7 +164,8 @@ tests-static-normal := tst-leaks1-static tst-array1-static tst-array5-static \ + tst-dl-iter-static \ + tst-tlsalign-static tst-tlsalign-extern-static \ + tst-linkall-static tst-env-setuid tst-env-setuid-tunables \ +- tst-single_threaded-static tst-single_threaded-pthread-static ++ tst-single_threaded-static tst-single_threaded-pthread-static \ ++ tst-dst-static + + tests-static-internal := tst-tls1-static tst-tls2-static \ + tst-ptrguard1-static tst-stackguard1-static \ +@@ -1905,3 +1906,5 @@ $(objpfx)list-tunables.out: tst-rtld-list-tunables.sh $(objpfx)ld.so + cmp tst-rtld-list-tunables.exp \ + $(objpfx)/tst-rtld-list-tunables.out > $@; \ + $(evaluate-test) ++ ++tst-dst-static-ENV = LD_LIBRARY_PATH='$$ORIGIN' +diff --git a/elf/dl-load.c b/elf/dl-load.c +index 9e2089cfaa7dd4b1..376a2e64d6a33535 100644 +--- a/elf/dl-load.c ++++ b/elf/dl-load.c +@@ -758,50 +758,45 @@ _dl_init_paths (const char *llp, const char *source, + max_dirnamelen = SYSTEM_DIRS_MAX_LEN; + *aelem = NULL; + +-#ifdef SHARED + /* This points to the map of the main object. */ + l = GL(dl_ns)[LM_ID_BASE]._ns_loaded; +- if (l != NULL) ++ assert (l->l_type != lt_loaded); ++ ++ if (l->l_info[DT_RUNPATH]) ++ { ++ /* Allocate room for the search path and fill in information ++ from RUNPATH. */ ++ decompose_rpath (&l->l_runpath_dirs, ++ (const void *) (D_PTR (l, l_info[DT_STRTAB]) ++ + l->l_info[DT_RUNPATH]->d_un.d_val), ++ l, "RUNPATH"); ++ /* During rtld init the memory is allocated by the stub malloc, ++ prevent any attempt to free it by the normal malloc. */ ++ l->l_runpath_dirs.malloced = 0; ++ ++ /* The RPATH is ignored. */ ++ l->l_rpath_dirs.dirs = (void *) -1; ++ } ++ else + { +- assert (l->l_type != lt_loaded); ++ l->l_runpath_dirs.dirs = (void *) -1; + +- if (l->l_info[DT_RUNPATH]) ++ if (l->l_info[DT_RPATH]) + { + /* Allocate room for the search path and fill in information +- from RUNPATH. */ +- decompose_rpath (&l->l_runpath_dirs, ++ from RPATH. */ ++ decompose_rpath (&l->l_rpath_dirs, + (const void *) (D_PTR (l, l_info[DT_STRTAB]) +- + l->l_info[DT_RUNPATH]->d_un.d_val), +- l, "RUNPATH"); +- /* During rtld init the memory is allocated by the stub malloc, +- prevent any attempt to free it by the normal malloc. */ +- l->l_runpath_dirs.malloced = 0; +- +- /* The RPATH is ignored. */ +- l->l_rpath_dirs.dirs = (void *) -1; ++ + l->l_info[DT_RPATH]->d_un.d_val), ++ l, "RPATH"); ++ /* During rtld init the memory is allocated by the stub ++ malloc, prevent any attempt to free it by the normal ++ malloc. */ ++ l->l_rpath_dirs.malloced = 0; + } + else +- { +- l->l_runpath_dirs.dirs = (void *) -1; +- +- if (l->l_info[DT_RPATH]) +- { +- /* Allocate room for the search path and fill in information +- from RPATH. */ +- decompose_rpath (&l->l_rpath_dirs, +- (const void *) (D_PTR (l, l_info[DT_STRTAB]) +- + l->l_info[DT_RPATH]->d_un.d_val), +- l, "RPATH"); +- /* During rtld init the memory is allocated by the stub +- malloc, prevent any attempt to free it by the normal +- malloc. */ +- l->l_rpath_dirs.malloced = 0; +- } +- else +- l->l_rpath_dirs.dirs = (void *) -1; +- } ++ l->l_rpath_dirs.dirs = (void *) -1; + } +-#endif /* SHARED */ + + if (llp != NULL && *llp != '\0') + { +diff --git a/elf/tst-dst-static.c b/elf/tst-dst-static.c +new file mode 100644 +index 0000000000000000..56eb371c96f85276 +--- /dev/null ++++ b/elf/tst-dst-static.c +@@ -0,0 +1,32 @@ ++/* Test DST expansion for static binaries doesn't carsh. Bug 23462. ++ Copyright (C) 2021 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 ++ . */ ++ ++/* The purpose of this test is to exercise the code in elf/dl-loac.c ++ (_dl_init_paths) or thereabout and ensure that static binaries ++ don't crash when expanding DSTs. ++ ++ If the dynamic loader code linked into the static binary cannot ++ handle expanding the DSTs e.g. null-deref on an incomplete link ++ map, then it will crash before reaching main, so the test harness ++ is unnecessary. */ ++ ++int ++main (void) ++{ ++ return 0; ++} diff --git a/glibc-upstream-2.33-16.patch b/glibc-upstream-2.33-16.patch new file mode 100644 index 0000000..8b50d66 --- /dev/null +++ b/glibc-upstream-2.33-16.patch @@ -0,0 +1,77 @@ +commit dd8023c2ac0af28a6e391a2eb5038bb351694243 +Author: Florian Weimer +Date: Mon Mar 15 10:33:43 2021 +0100 + + elf: ld.so --help calls _dl_init_paths without a main map [BZ #27577] + + In this case, use the link map of the dynamic loader itself as + a replacement. This is more than just a hack: if we ever support + DT_RUNPATH/DT_RPATH for the dynamic loader, reporting it for + ld.so --help (without further command line arguments) would be the + right thing to do. + + Fixes commit 332421312576bd7095e70589154af99b124dd2d1 ("elf: Always + set l in _dl_init_paths (bug 23462)"). + + (cherry picked from commit 4e6db99c665d3b82a70a3e218860ef087b1555b4) + +diff --git a/elf/Makefile b/elf/Makefile +index 63da0ed64f6234a8..4b92f8b3054b556e 100644 +--- a/elf/Makefile ++++ b/elf/Makefile +@@ -245,7 +245,7 @@ tests += $(tests-execstack-$(have-z-execstack)) + ifeq ($(run-built-tests),yes) + tests-special += $(objpfx)tst-leaks1-mem.out \ + $(objpfx)tst-leaks1-static-mem.out $(objpfx)noload-mem.out \ +- $(objpfx)tst-ldconfig-X.out ++ $(objpfx)tst-ldconfig-X.out $(objpfx)tst-rtld-help.out + endif + tlsmod17a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 + tlsmod18a-suffixes = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 +@@ -433,7 +433,8 @@ endif + ifeq (yes,$(build-shared)) + ifeq ($(run-built-tests),yes) + tests-special += $(objpfx)tst-pathopt.out $(objpfx)tst-rtld-load-self.out \ +- $(objpfx)tst-rtld-preload.out $(objpfx)argv0test.out ++ $(objpfx)tst-rtld-preload.out $(objpfx)argv0test.out \ ++ $(objpfx)tst-rtld-help.out + endif + tests-special += $(objpfx)check-textrel.out $(objpfx)check-execstack.out \ + $(objpfx)check-wx-segment.out \ +@@ -1908,3 +1909,16 @@ $(objpfx)list-tunables.out: tst-rtld-list-tunables.sh $(objpfx)ld.so + $(evaluate-test) + + tst-dst-static-ENV = LD_LIBRARY_PATH='$$ORIGIN' ++ ++$(objpfx)tst-rtld-help.out: $(objpfx)ld.so ++ $(test-wrapper) $(rtld-prefix) --help > $@; \ ++ status=$$?; \ ++ echo "info: ld.so exit status: $$status" >> $@; \ ++ if ! grep -q 'Legacy HWCAP subdirectories under library search path directories' $@; then \ ++ echo "error: missing subdirectory pattern" >> $@; \ ++ if test $$status -eq 0; then \ ++ status=1; \ ++ fi; \ ++ fi; \ ++ (exit $$status); \ ++ $(evaluate-test) +diff --git a/elf/dl-load.c b/elf/dl-load.c +index 376a2e64d6a33535..2f760503c5f117f8 100644 +--- a/elf/dl-load.c ++++ b/elf/dl-load.c +@@ -758,8 +758,14 @@ _dl_init_paths (const char *llp, const char *source, + max_dirnamelen = SYSTEM_DIRS_MAX_LEN; + *aelem = NULL; + +- /* This points to the map of the main object. */ ++ /* This points to the map of the main object. If there is no main ++ object (e.g., under --help, use the dynamic loader itself as a ++ stand-in. */ + l = GL(dl_ns)[LM_ID_BASE]._ns_loaded; ++#ifdef SHARED ++ if (l == NULL) ++ l = &GL (dl_rtld_map); ++#endif + assert (l->l_type != lt_loaded); + + if (l->l_info[DT_RUNPATH]) diff --git a/glibc-upstream-2.33-17.patch b/glibc-upstream-2.33-17.patch new file mode 100644 index 0000000..96a2974 --- /dev/null +++ b/glibc-upstream-2.33-17.patch @@ -0,0 +1,196 @@ +commit f90d6b0484032334a3e2db5891981e123051cf19 +Author: Jakub Jelinek +Date: Thu Mar 4 15:15:33 2021 +0100 + + pthread_once hangs when init routine throws an exception [BZ #18435] + + This is another attempt at making pthread_once handle throwing exceptions + from the init routine callback. As the new testcases show, just switching + to the cleanup attribute based cleanup does fix the tst-once5 test, but + breaks the new tst-oncey3 test. That is because when throwing exceptions, + only the unwind info registered cleanups (i.e. C++ destructors or cleanup + attribute), when cancelling threads and there has been unwind info from the + cancellation point up to whatever needs cleanup both unwind info registered + cleanups and THREAD_SETMEM (self, cleanup, ...) registered cleanups are + invoked, but once we hit some frame with no unwind info, only the + THREAD_SETMEM (self, cleanup, ...) registered cleanups are invoked. + So, to stay fully backwards compatible (allow init routines without + unwind info which encounter cancellation points) and handle exception throwing + we actually need to register the pthread_once cleanups in both unwind info + and in the THREAD_SETMEM (self, cleanup, ...) way. + If an exception is thrown, only the former will happen and we in that case + need to also unregister the THREAD_SETMEM (self, cleanup, ...) registered + handler, because otherwise after catching the exception the user code could + call deeper into the stack some cancellation point, get cancelled and then + a stale cleanup handler would clobber stack and probably crash. + If a thread calling init routine is cancelled and unwind info ends before + the pthread_once frame, it will be cleaned up through self->cleanup as + before. And if unwind info is present, unwind_stop first calls the + self->cleanup registered handler for the frame, then it will call the + unwind info registered handler but that will already see __do_it == 0 + and do nothing. + + (cherry picked from commit f0419e6a10740a672b28e112c409ae24f5e890ab) + +diff --git a/nptl/Makefile b/nptl/Makefile +index 0282e07390e8a249..5b036eb8a7b5d8b3 100644 +--- a/nptl/Makefile ++++ b/nptl/Makefile +@@ -314,10 +314,6 @@ xtests += tst-eintr1 + + test-srcs = tst-oddstacklimit + +-# Test expected to fail on most targets (except x86_64) due to bug +-# 18435 - pthread_once hangs when init routine throws an exception. +-test-xfail-tst-once5 = yes +- + gen-as-const-headers = unwindbuf.sym \ + pthread-pi-defines.sym + +diff --git a/nptl/pthreadP.h b/nptl/pthreadP.h +index e5efa2e62d3d23d8..79be1bc70f4e9db8 100644 +--- a/nptl/pthreadP.h ++++ b/nptl/pthreadP.h +@@ -602,6 +602,67 @@ extern void __pthread_cleanup_pop (struct _pthread_cleanup_buffer *buffer, + # undef pthread_cleanup_pop + # define pthread_cleanup_pop(execute) \ + __pthread_cleanup_pop (&_buffer, (execute)); } ++ ++# if defined __EXCEPTIONS && !defined __cplusplus ++/* Structure to hold the cleanup handler information. */ ++struct __pthread_cleanup_combined_frame ++{ ++ void (*__cancel_routine) (void *); ++ void *__cancel_arg; ++ int __do_it; ++ struct _pthread_cleanup_buffer __buffer; ++}; ++ ++/* Special cleanup macros which register cleanup both using ++ __pthread_cleanup_{push,pop} and using cleanup attribute. This is needed ++ for pthread_once, so that it supports both throwing exceptions from the ++ pthread_once callback (only cleanup attribute works there) and cancellation ++ of the thread running the callback if the callback or some routines it ++ calls don't have unwind information. */ ++ ++static __always_inline void ++__pthread_cleanup_combined_routine (struct __pthread_cleanup_combined_frame ++ *__frame) ++{ ++ if (__frame->__do_it) ++ { ++ __frame->__cancel_routine (__frame->__cancel_arg); ++ __frame->__do_it = 0; ++ __pthread_cleanup_pop (&__frame->__buffer, 0); ++ } ++} ++ ++static inline void ++__pthread_cleanup_combined_routine_voidptr (void *__arg) ++{ ++ struct __pthread_cleanup_combined_frame *__frame ++ = (struct __pthread_cleanup_combined_frame *) __arg; ++ if (__frame->__do_it) ++ { ++ __frame->__cancel_routine (__frame->__cancel_arg); ++ __frame->__do_it = 0; ++ } ++} ++ ++# define pthread_cleanup_combined_push(routine, arg) \ ++ do { \ ++ void (*__cancel_routine) (void *) = (routine); \ ++ struct __pthread_cleanup_combined_frame __clframe \ ++ __attribute__ ((__cleanup__ (__pthread_cleanup_combined_routine))) \ ++ = { .__cancel_routine = __cancel_routine, .__cancel_arg = (arg), \ ++ .__do_it = 1 }; \ ++ __pthread_cleanup_push (&__clframe.__buffer, \ ++ __pthread_cleanup_combined_routine_voidptr, \ ++ &__clframe); ++ ++# define pthread_cleanup_combined_pop(execute) \ ++ __pthread_cleanup_pop (&__clframe.__buffer, 0); \ ++ __clframe.__do_it = 0; \ ++ if (execute) \ ++ __cancel_routine (__clframe.__cancel_arg); \ ++ } while (0) ++ ++# endif + #endif + + extern void __pthread_cleanup_push_defer (struct _pthread_cleanup_buffer *buffer, +diff --git a/nptl/pthread_once.c b/nptl/pthread_once.c +index 28d97097c75f992d..7645da222a65bc3d 100644 +--- a/nptl/pthread_once.c ++++ b/nptl/pthread_once.c +@@ -111,11 +111,11 @@ __pthread_once_slow (pthread_once_t *once_control, void (*init_routine) (void)) + /* This thread is the first here. Do the initialization. + Register a cleanup handler so that in case the thread gets + interrupted the initialization can be restarted. */ +- pthread_cleanup_push (clear_once_control, once_control); ++ pthread_cleanup_combined_push (clear_once_control, once_control); + + init_routine (); + +- pthread_cleanup_pop (0); ++ pthread_cleanup_combined_pop (0); + + + /* Mark *once_control as having finished the initialization. We need +diff --git a/nptl/tst-once5.cc b/nptl/tst-once5.cc +index b797ab35622e78eb..60fe1ef820f3832c 100644 +--- a/nptl/tst-once5.cc ++++ b/nptl/tst-once5.cc +@@ -59,7 +59,7 @@ do_test (void) + " throwing an exception", stderr); + } + catch (OnceException) { +- if (1 < niter) ++ if (niter > 1) + fputs ("pthread_once unexpectedly threw", stderr); + result = 0; + } +@@ -75,7 +75,5 @@ do_test (void) + return result; + } + +-// The test currently hangs and is XFAILed. Reduce the timeout. +-#define TIMEOUT 1 + #define TEST_FUNCTION do_test () + #include "../test-skeleton.c" +diff --git a/sysdeps/pthread/Makefile b/sysdeps/pthread/Makefile +index eeb64f9fb0480ccc..53b65ef3499ef8c9 100644 +--- a/sysdeps/pthread/Makefile ++++ b/sysdeps/pthread/Makefile +@@ -231,7 +231,7 @@ generated += $(objpfx)tst-atfork2.mtrace \ + + tests-internal += tst-cancel25 tst-robust8 + +-tests += tst-oncex3 tst-oncex4 ++tests += tst-oncex3 tst-oncex4 tst-oncey3 tst-oncey4 + + modules-names += tst-join7mod + +@@ -242,6 +242,8 @@ endif + + CFLAGS-tst-oncex3.c += -fexceptions + CFLAGS-tst-oncex4.c += -fexceptions ++CFLAGS-tst-oncey3.c += -fno-exceptions -fno-asynchronous-unwind-tables ++CFLAGS-tst-oncey4.c += -fno-exceptions -fno-asynchronous-unwind-tables + + $(objpfx)tst-join7: $(libdl) $(shared-thread-library) + $(objpfx)tst-join7.out: $(objpfx)tst-join7mod.so +diff --git a/sysdeps/pthread/tst-oncey3.c b/sysdeps/pthread/tst-oncey3.c +new file mode 100644 +index 0000000000000000..08225b88dc06b979 +--- /dev/null ++++ b/sysdeps/pthread/tst-oncey3.c +@@ -0,0 +1 @@ ++#include "tst-once3.c" +diff --git a/sysdeps/pthread/tst-oncey4.c b/sysdeps/pthread/tst-oncey4.c +new file mode 100644 +index 0000000000000000..9b4d98f3f13c265a +--- /dev/null ++++ b/sysdeps/pthread/tst-oncey4.c +@@ -0,0 +1 @@ ++#include "tst-once4.c" diff --git a/glibc-upstream-2.33-18.patch b/glibc-upstream-2.33-18.patch new file mode 100644 index 0000000..4318bad --- /dev/null +++ b/glibc-upstream-2.33-18.patch @@ -0,0 +1,42 @@ +commit 79c6be6a0ad59e28cfb73ad6cae6b073e22836e3 +Author: Florian Weimer +Date: Thu Feb 4 15:00:20 2021 +0100 + + nptl: Remove private futex optimization [BZ #27304] + + It is effectively used, unexcept for pthread_cond_destroy, where we do + not want it; see bug 27304. The internal locks do not support a + process-shared mode. + + This fixes commit dc6cfdc934db9997c33728082d63552b9eee4563 ("nptl: + Move pthread_cond_destroy implementation into libc"). + + Reviewed-by: Adhemerval Zanella + (cherry picked from commit c4ad832276f4dadfa40904109b26a521468f66bc) + +diff --git a/sysdeps/nptl/lowlevellock-futex.h b/sysdeps/nptl/lowlevellock-futex.h +index ecb729da6b838773..ca96397a4a925b8b 100644 +--- a/sysdeps/nptl/lowlevellock-futex.h ++++ b/sysdeps/nptl/lowlevellock-futex.h +@@ -50,20 +50,8 @@ + #define LLL_SHARED FUTEX_PRIVATE_FLAG + + #ifndef __ASSEMBLER__ +- +-# if IS_IN (libc) || IS_IN (rtld) +-/* In libc.so or ld.so all futexes are private. */ +-# define __lll_private_flag(fl, private) \ +- ({ \ +- /* Prevent warnings in callers of this macro. */ \ +- int __lll_private_flag_priv __attribute__ ((unused)); \ +- __lll_private_flag_priv = (private); \ +- ((fl) | FUTEX_PRIVATE_FLAG); \ +- }) +-# else +-# define __lll_private_flag(fl, private) \ ++# define __lll_private_flag(fl, private) \ + (((fl) | FUTEX_PRIVATE_FLAG) ^ (private)) +-# endif + + # define lll_futex_syscall(nargs, futexp, op, ...) \ + ({ \ diff --git a/glibc-upstream-2.33-19.patch b/glibc-upstream-2.33-19.patch new file mode 100644 index 0000000..8d22581 --- /dev/null +++ b/glibc-upstream-2.33-19.patch @@ -0,0 +1,102 @@ +commit db32fc27e7bdfb5468200a94e9152bcc1c971d25 +Author: DJ Delorie +Date: Thu Mar 11 12:50:02 2021 -0500 + + test-container: Always copy test-specific support files [BZ #27537] + + There's a small chance that a fresh checkout will result in some of + the test-specific container files will have the same timestamp and + size, which breaks the rsync logic in test-container, resulting in + tests running with the wrong support files. + + This patch changes the rsync logic to always copy the test-specific + files, which normally would always be copied anyway. The rsync logic + for the testroot itself is unchanged. + + (cherry picked from commit 20bee7134801cc932ff87fac511289b92fc94944) + +diff --git a/support/test-container.c b/support/test-container.c +index 28cc44d9f1e28c10..94498d39019a4776 100644 +--- a/support/test-container.c ++++ b/support/test-container.c +@@ -481,7 +481,7 @@ need_sync (char *ap, char *bp, struct stat *a, struct stat *b) + } + + static void +-rsync_1 (path_buf * src, path_buf * dest, int and_delete) ++rsync_1 (path_buf * src, path_buf * dest, int and_delete, int force_copies) + { + DIR *dir; + struct dirent *de; +@@ -491,8 +491,9 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete) + r_append ("/", dest); + + if (verbose) +- printf ("sync %s to %s %s\n", src->buf, dest->buf, +- and_delete ? "and delete" : ""); ++ printf ("sync %s to %s%s%s\n", src->buf, dest->buf, ++ and_delete ? " and delete" : "", ++ force_copies ? " (forced)" : ""); + + size_t staillen = src->len; + +@@ -521,10 +522,10 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete) + missing. */ + lstat (dest->buf, &d); + +- if (! need_sync (src->buf, dest->buf, &s, &d)) ++ if (! force_copies && ! need_sync (src->buf, dest->buf, &s, &d)) + { + if (S_ISDIR (s.st_mode)) +- rsync_1 (src, dest, and_delete); ++ rsync_1 (src, dest, and_delete, force_copies); + continue; + } + +@@ -559,7 +560,7 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete) + if (verbose) + printf ("+D %s\n", dest->buf); + maybe_xmkdir (dest->buf, (s.st_mode & 0777) | 0700); +- rsync_1 (src, dest, and_delete); ++ rsync_1 (src, dest, and_delete, force_copies); + break; + + case S_IFLNK: +@@ -639,12 +640,12 @@ rsync_1 (path_buf * src, path_buf * dest, int and_delete) + } + + static void +-rsync (char *src, char *dest, int and_delete) ++rsync (char *src, char *dest, int and_delete, int force_copies) + { + r_setup (src, &spath); + r_setup (dest, &dpath); + +- rsync_1 (&spath, &dpath, and_delete); ++ rsync_1 (&spath, &dpath, and_delete, force_copies); + } + + +@@ -846,11 +847,11 @@ main (int argc, char **argv) + do_ldconfig = true; + + rsync (pristine_root_path, new_root_path, +- file_exists (concat (command_root, "/preclean.req", NULL))); ++ file_exists (concat (command_root, "/preclean.req", NULL)), 0); + + if (stat (command_root, &st) >= 0 + && S_ISDIR (st.st_mode)) +- rsync (command_root, new_root_path, 0); ++ rsync (command_root, new_root_path, 0, 1); + + new_objdir_path = xstrdup (concat (new_root_path, + support_objdir_root, NULL)); +@@ -1044,7 +1045,7 @@ main (int argc, char **argv) + + /* Child has exited, we can post-clean the test root. */ + printf("running post-clean rsync\n"); +- rsync (pristine_root_path, new_root_path, 1); ++ rsync (pristine_root_path, new_root_path, 1, 0); + + if (WIFEXITED (status)) + exit (WEXITSTATUS (status)); diff --git a/glibc.spec b/glibc.spec index 03f9aad..003abf4 100644 --- a/glibc.spec +++ b/glibc.spec @@ -96,7 +96,7 @@ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 4%{?dist} +Release: 5%{?dist} # In general, GPLv2+ is used by programs, LGPLv2+ is used for # libraries. @@ -165,6 +165,15 @@ Patch38: glibc-upstream-2.33-7.patch Patch39: glibc-upstream-2.33-8.patch Patch40: glibc-upstream-2.33-9.patch Patch41: glibc-upstream-2.33-10.patch +Patch42: glibc-upstream-2.33-11.patch +Patch43: glibc-upstream-2.33-12.patch +Patch44: glibc-upstream-2.33-13.patch +Patch45: glibc-upstream-2.33-14.patch +Patch46: glibc-upstream-2.33-15.patch +Patch47: glibc-upstream-2.33-16.patch +Patch48: glibc-upstream-2.33-17.patch +Patch49: glibc-upstream-2.33-18.patch +Patch50: glibc-upstream-2.33-19.patch ############################################################################## # Continued list of core "glibc" package information: @@ -2300,6 +2309,19 @@ fi %files -f compat-libpthread-nonshared.filelist -n compat-libpthread-nonshared %changelog +* Tue Mar 16 2021 Florian Weimer - 2.33-5 +- Import patches from the upstream glibc 2.33 branch, up to commit + db32fc27e7bdfb5468200a94e9152bcc1c971d25: +- test-container: Always copy test-specific support files [BZ #27537] +- nptl: Remove private futex optimization [BZ #27304] +- pthread_once hangs when init routine throws an exception [BZ #18435] +- elf: ld.so --help calls _dl_init_paths without a main map (#1609351) +- elf: Always set l in _dl_init_paths (bug 23462) +- x86: Handle _SC_LEVEL1_ICACHE_LINESIZE [BZ #27444] +- io: Return EBAFD for negative file descriptor on fstat (BZ #27559) +- nscd: Fix double free in netgroupcache [BZ #27462] +- x86: Set minimum x86-64 level marker [BZ #27318] + * Thu Mar 4 2021 Florian Weimer - 2.33-4 - Import patch from the upstream glibc 2.33 branch, up to commit 3e880d733753183696d1a81c34caef3a9add2b0c.