From aa7f55e9fcefe9042f393ad6697c1f7dd891e9eaf3d94c277f597bbf7ecb33d0 Mon Sep 17 00:00:00 2001 From: Andreas Schwab Date: Tue, 2 Feb 2021 11:37:02 +0000 Subject: [PATCH] Accepting request 868599 from home:Andreas_Schwab:Factory - Update to glibc 2.33 * The dynamic linker accepts the --list-tunables argument which prints all the supported tunables. * The dynamic linker accepts the --argv0 argument and provides opportunity to change argv[0] string. * The dynamic linker loads optimized implementations of shared objects from subdirectories under the glibc-hwcaps directory on the library search path if the system's capabilities meet the requirements for that subdirectory. * The new --help option of the dynamic linker provides usage and information and library search path diagnostics. * The mallinfo2 function is added to report statistics as per mallinfo, but with larger field widths to accurately report values that are larger than fit in an integer. * Add to provide query macros for x86 CPU features. * A new fortification level _FORTIFY_SOURCE=3 is available. * The mallinfo function is marked deprecated. * When dlopen is used in statically linked programs, alternative library implementations from HWCAP subdirectories are no longer loaded. * The deprecated header and the function vtimes have been removed. * On s390(x), the type float_t is now derived from the macro __FLT_EVAL_METHOD__ that is defined by the compiler, instead of being hardcoded to double. * A future version of glibc will stop loading shared objects from the "tls" subdirectories on the library search path, the subdirectory that corresponds to the AT_PLATFORM system name, and also stop employing the legacy AT_HWCAP search mechanism. * CVE-2021-3326: An assertion failure during conversion from the ISO-20220-JP-3 character set using the iconv function has been fixed. OBS-URL: https://build.opensuse.org/request/show/868599 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=577 --- aarch64-static-pie.patch | 25 - euc-kr-overrun.patch | 134 --- fix-locking-in-_IO_cleanup.patch | 2 +- get-nprocs-cpu-online-parsing.patch | 35 - glibc-2.32.tar.xz | 3 - glibc-2.32.tar.xz.sig | 16 - glibc-2.33.tar.xz | 3 + glibc-2.33.tar.xz.sig | 16 + glibc-nsswitch-usr.diff | 26 +- glibc-version.diff | 2 +- glibc.changes | 43 +- glibc.keyring | 359 +++++- glibc.spec | 58 +- iconv-redundant-shift.patch | 82 -- iconv-ucs4-loop-bounds.patch | 147 --- ifunc-fma4.patch | 28 - intl-codeset-suffixes.patch | 237 ---- ldconfig-concurrency.patch | 2 +- nscd-gc-cycle.patch | 42 - printf-long-double-non-normal.patch | 124 -- strerrorname-np.patch | 1676 --------------------------- syslog-locking.patch | 117 -- sysvipc.patch | 796 ------------- 23 files changed, 406 insertions(+), 3567 deletions(-) delete mode 100644 aarch64-static-pie.patch delete mode 100644 euc-kr-overrun.patch delete mode 100644 get-nprocs-cpu-online-parsing.patch delete mode 100644 glibc-2.32.tar.xz delete mode 100644 glibc-2.32.tar.xz.sig create mode 100644 glibc-2.33.tar.xz create mode 100644 glibc-2.33.tar.xz.sig delete mode 100644 iconv-redundant-shift.patch delete mode 100644 iconv-ucs4-loop-bounds.patch delete mode 100644 ifunc-fma4.patch delete mode 100644 intl-codeset-suffixes.patch delete mode 100644 nscd-gc-cycle.patch delete mode 100644 printf-long-double-non-normal.patch delete mode 100644 strerrorname-np.patch delete mode 100644 syslog-locking.patch delete mode 100644 sysvipc.patch diff --git a/aarch64-static-pie.patch b/aarch64-static-pie.patch deleted file mode 100644 index 6319e46..0000000 --- a/aarch64-static-pie.patch +++ /dev/null @@ -1,25 +0,0 @@ -From d4136903a29baabeec8987b53081def8b4a49826 Mon Sep 17 00:00:00 2001 -From: Guillaume Gardet -Date: Mon, 14 Dec 2020 15:38:22 +0000 -Subject: [PATCH] aarch64: fix static PIE start code for BTI [BZ #27068] - -A bti c was missing from rcrt1.o which made all -static-pie -binaries fail at program startup on BTI enabled systems. - -Fixes bug 27068. ---- - sysdeps/aarch64/start.S | 1 + - 1 file changed, 1 insertion(+) - -Index: glibc-2.32/sysdeps/aarch64/start.S -=================================================================== ---- glibc-2.32.orig/sysdeps/aarch64/start.S -+++ glibc-2.32/sysdeps/aarch64/start.S -@@ -101,6 +101,7 @@ _start: - because crt1.o and rcrt1.o share code and the later must avoid the - use of GOT relocations before __libc_start_main is called. */ - __wrap_main: -+ BTI_C - b main - #endif - diff --git a/euc-kr-overrun.patch b/euc-kr-overrun.patch deleted file mode 100644 index ffc993d..0000000 --- a/euc-kr-overrun.patch +++ /dev/null @@ -1,134 +0,0 @@ -Fix buffer overrun in EUC-KR conversion module (bug 24973) - -The byte 0xfe as input to the EUC-KR conversion denotes a user-defined -area and is not allowed. The from_euc_kr function used to skip two bytes -when told to skip over the unknown designation, potentially running over -the buffer end. - - [BZ #24973] - * iconvdata/ksc5601.h (ksc5601_to_ucs4): Check for available bytes - first. - * iconvdata/euc-kr.c (BODY for FROM_LOOP): Don't check for unknown - two-byte codes here. - * iconvdata/Makefile (tests): Add bug-iconv13. - * iconvdata/bug-iconv13.c: New file. ---- - iconvdata/Makefile | 2 +- - iconvdata/bug-iconv13.c | 53 +++++++++++++++++++++++++++++++++++++++++ - iconvdata/euc-kr.c | 6 +---- - iconvdata/ksc5601.h | 6 ++--- - 4 files changed, 58 insertions(+), 9 deletions(-) - create mode 100644 iconvdata/bug-iconv13.c - -Index: glibc-2.32/iconvdata/Makefile -=================================================================== ---- glibc-2.32.orig/iconvdata/Makefile -+++ glibc-2.32/iconvdata/Makefile -@@ -73,7 +73,8 @@ modules.so := $(addsuffix .so, $(modules - ifeq (yes,$(build-shared)) - tests = bug-iconv1 bug-iconv2 tst-loading tst-e2big tst-iconv4 bug-iconv4 \ - tst-iconv6 bug-iconv5 bug-iconv6 tst-iconv7 bug-iconv8 bug-iconv9 \ -- bug-iconv10 bug-iconv11 bug-iconv12 tst-iconv-big5-hkscs-to-2ucs4 -+ bug-iconv10 bug-iconv11 bug-iconv12 tst-iconv-big5-hkscs-to-2ucs4 \ -+ bug-iconv13 - ifeq ($(have-thread-library),yes) - tests += bug-iconv3 - endif -Index: glibc-2.32/iconvdata/bug-iconv13.c -=================================================================== ---- /dev/null -+++ glibc-2.32/iconvdata/bug-iconv13.c -@@ -0,0 +1,53 @@ -+/* bug 24973: Test EUC-KR module -+ Copyright (C) 2019 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 int -+do_test (void) -+{ -+ iconv_t cd = iconv_open ("UTF-8//IGNORE", "EUC-KR"); -+ TEST_VERIFY_EXIT (cd != (iconv_t) -1); -+ -+ /* 0xfe (->0x7e : row 94) and 0xc9 (->0x49 : row 41) are user-defined -+ areas, which are not allowed and should be skipped over due to -+ //IGNORE. The trailing 0xfe also is an incomplete sequence, which -+ should be checked first. */ -+ char input[4] = { '\xc9', '\xa1', '\0', '\xfe' }; -+ char *inptr = input; -+ size_t insize = sizeof (input); -+ char output[4]; -+ char *outptr = output; -+ size_t outsize = sizeof (output); -+ -+ /* This used to crash due to buffer overrun. */ -+ TEST_VERIFY (iconv (cd, &inptr, &insize, &outptr, &outsize) == (size_t) -1); -+ TEST_VERIFY (errno == EINVAL); -+ /* The conversion should produce one character, the converted null -+ character. */ -+ TEST_VERIFY (sizeof (output) - outsize == 1); -+ -+ TEST_VERIFY_EXIT (iconv_close (cd) != -1); -+ -+ return 0; -+} -+ -+#include -Index: glibc-2.32/iconvdata/euc-kr.c -=================================================================== ---- glibc-2.32.orig/iconvdata/euc-kr.c -+++ glibc-2.32/iconvdata/euc-kr.c -@@ -80,11 +80,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned c - \ - if (ch <= 0x9f) \ - ++inptr; \ -- /* 0xfe(->0x7e : row 94) and 0xc9(->0x59 : row 41) are \ -- user-defined areas. */ \ -- else if (__builtin_expect (ch == 0xa0, 0) \ -- || __builtin_expect (ch > 0xfe, 0) \ -- || __builtin_expect (ch == 0xc9, 0)) \ -+ else if (__glibc_unlikely (ch == 0xa0)) \ - { \ - /* This is illegal. */ \ - STANDARD_FROM_LOOP_ERR_HANDLER (1); \ -Index: glibc-2.32/iconvdata/ksc5601.h -=================================================================== ---- glibc-2.32.orig/iconvdata/ksc5601.h -+++ glibc-2.32/iconvdata/ksc5601.h -@@ -50,15 +50,15 @@ ksc5601_to_ucs4 (const unsigned char **s - unsigned char ch2; - int idx; - -+ if (avail < 2) -+ return 0; -+ - /* row 94(0x7e) and row 41(0x49) are user-defined area in KS C 5601 */ - - if (ch < offset || (ch - offset) <= 0x20 || (ch - offset) >= 0x7e - || (ch - offset) == 0x49) - return __UNKNOWN_10646_CHAR; - -- if (avail < 2) -- return 0; -- - ch2 = (*s)[1]; - if (ch2 < offset || (ch2 - offset) <= 0x20 || (ch2 - offset) >= 0x7f) - return __UNKNOWN_10646_CHAR; diff --git a/fix-locking-in-_IO_cleanup.patch b/fix-locking-in-_IO_cleanup.patch index 97d1cf7..51a9582 100644 --- a/fix-locking-in-_IO_cleanup.patch +++ b/fix-locking-in-_IO_cleanup.patch @@ -144,7 +144,7 @@ Index: glibc-2.32/sysdeps/pthread/tst-stdio1.c --- glibc-2.32.orig/sysdeps/pthread/tst-stdio1.c +++ /dev/null @@ -1,56 +0,0 @@ --/* Copyright (C) 2002-2020 Free Software Foundation, Inc. +-/* Copyright (C) 2002-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper , 2002. - diff --git a/get-nprocs-cpu-online-parsing.patch b/get-nprocs-cpu-online-parsing.patch deleted file mode 100644 index c65e26f..0000000 --- a/get-nprocs-cpu-online-parsing.patch +++ /dev/null @@ -1,35 +0,0 @@ -From b5eeca8cfd9d0fd92b5633a88901d9ff27f2b496 Mon Sep 17 00:00:00 2001 -From: Andreas Schwab -Date: Tue, 8 Dec 2020 19:17:41 +0100 -Subject: [PATCH] Fix parsing of /sys/devices/system/cpu/online (bug 25859) - -The file contains comma-separated ranges, not spaces. ---- - sysdeps/unix/sysv/linux/getsysstats.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -Index: glibc-2.32/sysdeps/unix/sysv/linux/getsysstats.c -=================================================================== ---- glibc-2.32.orig/sysdeps/unix/sysv/linux/getsysstats.c -+++ glibc-2.32/sysdeps/unix/sysv/linux/getsysstats.c -@@ -143,6 +143,7 @@ __get_nprocs (void) - char *re = buffer_end; - - const int flags = O_RDONLY | O_CLOEXEC; -+ /* This file contains comma-separated ranges. */ - int fd = __open_nocancel ("/sys/devices/system/cpu/online", flags); - char *l; - int result = 0; -@@ -175,10 +176,10 @@ __get_nprocs (void) - result += m - n + 1; - - l = endp; -- while (l < re && isspace (*l)) -+ if (l < re && *l == ',') - ++l; - } -- while (l < re); -+ while (l < re && *l != '\n'); - - __close_nocancel_nostatus (fd); - diff --git a/glibc-2.32.tar.xz b/glibc-2.32.tar.xz deleted file mode 100644 index 5f5fbda..0000000 --- a/glibc-2.32.tar.xz +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1627ea54f5a1a8467032563393e0901077626dc66f37f10ee6363bb722222836 -size 16744512 diff --git a/glibc-2.32.tar.xz.sig b/glibc-2.32.tar.xz.sig deleted file mode 100644 index fe02c44..0000000 --- a/glibc-2.32.tar.xz.sig +++ /dev/null @@ -1,16 +0,0 @@ ------BEGIN PGP SIGNATURE----- - -iQIzBAABCAAdFiEEcnNUKzmWLfeymZMUFnkrTqJTQPgFAl8rekMACgkQFnkrTqJT -QPhHYhAAkiVohx/PgarNM+CWOjVAfI/vjvZ9ETUNvSpdKDkTKqScwJyRMxSHGHqW -ri1WBv+NRq5HHwpceEHw3PrAT22sDMHEiB9A7Aeu4Yf1TimZ9+tvZdzUPQBnbbZT -3vE5LZmCepoX+kRWKpUPS8hGwwlZQbR/OKgAwOa/mHnK1A5ySvRryELPoBhlSpL2 -PyDUmnwvfNPkF3RsLf1GGAKUrgQqg9dYbJwRUaukOn0+VKiLmVLsYZIdBdYt589M -Cfj7IUdNfY1wb0CpZJWZZGRtkopxYvRDeb6g7LCoe16zUAzEUhXdumlxeXYSh7Ge -ouqdln7a0GHtQS90sdrFeHgqqhbCfxn4bvKs9Ny33T1I4Al4mI5PiPiryjsPpdjH -TA5uNKAyFRmy5WuPCFTirRGy6EldrAQ1o/2icbqHhknzz+/9ctUr0mVW3supCmSZ -DoLp5SG3CjGY9phTZcobBlIFuaFTEU8jV80LiK5glc/GTHa4czPxnc0MXaxy8WWF -taZZZ67IAbY/EfuVfQC1NPTHOmrEszfxKQ8CYKisfGP/XYNfYLyjdf7JyyjkKHEH -xt904YYMsi6aw2lsq39Ajb3Ub3BZ63QEYPuD9yp0BizwTaQTnX5rtXROqxDkwdSi -hauXkCvU1ubuBJ3s+u9ljxveWV6TGHfDgqkxmJj2SpYgBYwBcXw= -=vBEx ------END PGP SIGNATURE----- diff --git a/glibc-2.33.tar.xz b/glibc-2.33.tar.xz new file mode 100644 index 0000000..3aa75aa --- /dev/null +++ b/glibc-2.33.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e2556000e105dbd57f0b6b2a32ff2cf173bde4f0d85dffccfd8b7e51a0677ff +size 17031280 diff --git a/glibc-2.33.tar.xz.sig b/glibc-2.33.tar.xz.sig new file mode 100644 index 0000000..acff9ab --- /dev/null +++ b/glibc-2.33.tar.xz.sig @@ -0,0 +1,16 @@ +-----BEGIN PGP SIGNATURE----- + +iQIzBAABCAAdFiEEcnNUKzmWLfeymZMUFnkrTqJTQPgFAmAYVMMACgkQFnkrTqJT +QPhWfg//VIXR1NrrEU0ekkojS0C+yFpxElmNa3yQ2mGiDLYHyOW8tEbuHLIbmDvx +psOIKudL86+JzVX9PmO6dZ1AteG2S3wHzv8dw4w5BC3EtvQJBZz7pXwEV+1t3CYR +SQZ6o1HuN/zcPZ0hvUSsmIBcCrGCg8tCcgc6A5VzIZdXno+WrvnnGioXwLp8BT/q +ZtWPQCGNidyzIOg9RjXyXkVzElW3Ym6/4kM4VttOT0D2zJ1w3b5Cj07P8GkQY0i9 +iqkMGFHiDlPczHiVzQ85qKiVB9mCM/HNPkAIZaoM4ZzceFvde3BAFsIOzFSPpLjz +bodG2Sk7C3hoF8d1I8MtcmKhZbw8L1J5pl9qXS1tTpJO5DVupkIxc1pE3kvm5SkS +WjSti2xIXwGtC7nPkJVXNt8oRGfF6dJXoFgGEIkiEUShVmjO5AZxXq0Vt+GQw69i +I8QkFJ1PRcNToP1ephBaUS2jLg2OjpO7iITPOhwxKY9C8d59I50p0Zg52RC2t23c +ZAm2p96kf4O1RfpcBvAkdgyytoAu/hUvsZT+A6sbSej5WbJEInKavDllHQsBz/sm +LgdiA4KeEaiuoKu+NzLY378ZmQ5Sr9vZ/FAprS3xcAJ7k/kr2/Fb43V3AFV8zI0H +1khHp7g5yyMZqNCSAT8MxHMHknRVb5wJ3dtp/nXH1TbsWZeUp4M= +=FTNO +-----END PGP SIGNATURE----- diff --git a/glibc-nsswitch-usr.diff b/glibc-nsswitch-usr.diff index ff86d7e..57c81a9 100644 --- a/glibc-nsswitch-usr.diff +++ b/glibc-nsswitch-usr.diff @@ -1,15 +1,13 @@ -Index: glibc-2.31/nss/nsswitch.c +Index: glibc-2.31/nss/nss_database.c =================================================================== ---- glibc-2.31.orig/nss/nsswitch.c -+++ glibc-2.31/nss/nsswitch.c -@@ -134,6 +134,10 @@ __nss_database_lookup2 (const char *data - /* Read config file. */ - service_table = nss_parse_file (_PATH_NSSWITCH_CONF); - -+ /* Retry with the OS vendor provided config file. */ -+ if (service_table == NULL) -+ service_table = nss_parse_file ("/usr" _PATH_NSSWITCH_CONF); -+ - /* Test whether configuration data is available. */ - if (service_table != NULL) - { +--- glibc-2.31.orig/nss/nss_database.c ++++ glibc-2.31/nss/nss_database.c +@@ -294,6 +294,8 @@ nss_database_reload (struct nss_database_data *staging, + struct file_change_detection *initial) + { + FILE *fp = fopen (_PATH_NSSWITCH_CONF, "rce"); ++ if (fp == NULL) ++ fp = fopen ("/usr" _PATH_NSSWITCH_CONF, "rce"); + if (fp == NULL) + switch (errno) + { diff --git a/glibc-version.diff b/glibc-version.diff index 939f0ff..946c2de 100644 --- a/glibc-version.diff +++ b/glibc-version.diff @@ -8,7 +8,7 @@ Index: glibc-2.27/csu/version.c static const char banner[] = -"GNU C Library "PKGVERSION RELEASE" release version "VERSION".\n\ +"GNU C Library "PKGVERSION RELEASE" release version "VERSION" (git "GITID").\n\ - Copyright (C) 2020 Free Software Foundation, Inc.\n\ + Copyright (C) 2021 Free Software Foundation, Inc.\n\ This is free software; see the source for copying conditions.\n\ There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\ PARTICULAR PURPOSE.\n\ diff --git a/glibc.changes b/glibc.changes index fdf61c9..e805c2c 100644 --- a/glibc.changes +++ b/glibc.changes @@ -1,3 +1,44 @@ +------------------------------------------------------------------- +Tue Feb 2 09:33:28 UTC 2021 - Andreas Schwab + +- Update to glibc 2.33 + * The dynamic linker accepts the --list-tunables argument which prints + all the supported tunables. + * The dynamic linker accepts the --argv0 argument and provides opportunity + to change argv[0] string. + * The dynamic linker loads optimized implementations of shared objects + from subdirectories under the glibc-hwcaps directory on the library + search path if the system's capabilities meet the requirements for + that subdirectory. + * The new --help option of the dynamic linker provides usage and + information and library search path diagnostics. + * The mallinfo2 function is added to report statistics as per mallinfo, + but with larger field widths to accurately report values that are + larger than fit in an integer. + * Add to provide query macros for x86 CPU features. + * A new fortification level _FORTIFY_SOURCE=3 is available. + * The mallinfo function is marked deprecated. + * When dlopen is used in statically linked programs, alternative library + implementations from HWCAP subdirectories are no longer loaded. + * The deprecated header and the function vtimes have been + removed. + * On s390(x), the type float_t is now derived from the macro + __FLT_EVAL_METHOD__ that is defined by the compiler, instead of being + hardcoded to double. + * A future version of glibc will stop loading shared objects from the + "tls" subdirectories on the library search path, the subdirectory that + corresponds to the AT_PLATFORM system name, and also stop employing + the legacy AT_HWCAP search mechanism. + * CVE-2021-3326: An assertion failure during conversion from the + ISO-20220-JP-3 character set using the iconv function has been fixed. +- Remove obsolete, unused /etc/default/nss +- aarch64-static-pie.patch, euc-kr-overrun.patch, + get-nprocs-cpu-online-parsing.patch, iconv-redundant-shift.patch, + iconv-ucs4-loop-bounds.patch, ifunc-fma4.patch, + intl-codeset-suffixes.patch, nscd-gc-cycle.patch, + printf-long-double-non-normal.patch, strerrorname-np.patch, + syslog-locking.patch, sysvipc.patch: Removed + ------------------------------------------------------------------- Tue Jan 19 13:52:09 UTC 2021 - Andreas Schwab @@ -196,7 +237,7 @@ Tue Nov 26 11:34:45 CET 2019 - kukuk@suse.de Mon Oct 14 13:36:30 UTC 2019 - Andreas Schwab - euc-kr-overrun.patch: Fix buffer overrun in EUC-KR conversion module - (BZ #24973) + (CVE-2019-25013, BZ #24973) ------------------------------------------------------------------- Thu Oct 10 14:39:24 UTC 2019 - Andreas Schwab diff --git a/glibc.keyring b/glibc.keyring index 352550c..4defade 100644 --- a/glibc.keyring +++ b/glibc.keyring @@ -92,7 +92,6 @@ XavWgG39OPlPqENUx7GIRgQYEQIABgUCPh6PKQAKCRDa9zUKfrvWJYxEAJ9FFDtc GPG keys of Paul Eggert -----BEGIN PGP PUBLIC KEY BLOCK----- -Version: GnuPG v1.4.10 (GNU/Linux) mQINBEyAcmQBEADAAyH2xoTu7ppG5D3a8FMZEon74dCvc4+q1XA2J2tBy2pwaTqf hpxxdGA9Jj50UJ3PD4bSUEgN8tLZ0san47l5XTAFLi2456ciSl5m8sKaHlGdt9Xm @@ -105,43 +104,55 @@ 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 -WtkGoi8buNcby4U= -=AL6o +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 +Ck90PXknuFDDsYHfDo5smf9lo6YXx7N9 +=QLCc -----END PGP PUBLIC KEY BLOCK----- GPG keys of Ian Wienand @@ -885,3 +896,275 @@ IqV+O8CuGx6PRLjNuqKbZljpLxpFbD3gndtK8lH43BuzfgY9MPg+ =FC1k -----END PGP PUBLIC KEY BLOCK----- +GPG keys of Dmitry V. Levin +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +PBg= +=Rd5j +-----END PGP PUBLIC KEY BLOCK----- diff --git a/glibc.spec b/glibc.spec index 3476e9c..79fe3a4 100644 --- a/glibc.spec +++ b/glibc.spec @@ -1,5 +1,5 @@ # -# spec file for package glibc +# spec file for package glibc%{name_suffix} # # Copyright (c) 2021 SUSE LLC # @@ -54,7 +54,7 @@ ExclusiveArch: do_not_build Name: glibc%{name_suffix} Summary: Standard Shared Libraries (from the GNU C Library) -License: LGPL-2.1-or-later AND LGPL-2.1-or-later WITH GCC-exception-2.0 AND GPL-2.0-or-later +License: GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-2.1-or-later WITH GCC-exception-2.0 Group: System/Libraries BuildRequires: audit-devel BuildRequires: bison @@ -125,10 +125,10 @@ BuildArch: i686 %define enablekernel 4.15 %endif -Version: 2.32 +Version: 2.33 Release: 0 %if !%{build_snapshot} -%define git_id 0a8262a1b2 +%define git_id 9826b03b74 %define libversion %version %else %define git_id %(echo %version | sed 's/.*\.g//') @@ -148,7 +148,7 @@ Source5: nsswitch.conf Source7: bindresvport.blacklist Source9: glibc.rpmlintrc Source10: baselibs.conf -# For systemd +# For systemd Source20: nscd.conf Source21: nscd.service @@ -236,38 +236,14 @@ Patch306: glibc-fix-double-loopback.diff ### # Patches from upstream ### -# PATCH-FIX-UPSTREAM Correct locking and cancellation cleanup in syslog functions (BZ #26100) -Patch1000: syslog-locking.patch -# PATCH-FIX-UPSTREAM x86-64: Fix FMA4 detection in ifunc (BZ #26534) -Patch1001: ifunc-fma4.patch -# PATCH-FIX-UPSTREAM intl: Handle translation output codesets with suffixes (BZ #26383) -Patch1002: intl-codeset-suffixes.patch -# PATCH-FIX-UPSTREAM string: Fix strerrorname_np return value (BZ #26555) -Patch1003: strerrorname-np.patch -# PATCH-FIX-UPSTREAM sysvipc: Fix SEM_STAT_ANY kernel argument pass (BZ #26637, BZ #26639, BZ #26636) -Patch1004: sysvipc.patch -# PATCH-FIX-UPSTREAM aarch64: fix static PIE start code for BTI (BZ #27068) -Patch1005: aarch64-static-pie.patch -# PATCH-FIX-UPSTREAM iconv: Accept redundant shift sequences in IBM1364 (CVE-2020-27618, BZ #26224) -Patch1006: iconv-redundant-shift.patch -# PATCH-FIX-UPSTREAM iconv: Fix incorrect UCS4 inner loop bounds (CVE-2020-29562, BZ#26923) -Patch1007: iconv-ucs4-loop-bounds.patch -# PATCH-FIX-UPSTREAM x86: Harden printf against non-normal long double values (CVE-2020-29573, BZ #26649) -Patch1008: printf-long-double-non-normal.patch -# PATCH-FIX-UPSTREAM Fix parsing of /sys/devices/system/cpu/online (BZ #25859) -Patch1009: get-nprocs-cpu-online-parsing.patch -### +### # Patches awaiting upstream approval ### # PATCH-FIX-UPSTREAM Always to locking when accessing streams (BZ #15142) Patch2000: fix-locking-in-_IO_cleanup.patch # PATCH-FIX-UPSTREAM Avoid concurrency problem in ldconfig (BZ #23973) Patch2001: ldconfig-concurrency.patch -# PATCH-FIX-UPSTREAM Fix buffer overrun in EUC-KR conversion module (BZ #24973) -Patch2002: euc-kr-overrun.patch -# PATCH-FIX-UPSTREAM nscd: bump GC cycle during cache pruning (BZ #26130) -Patch2003: nscd-gc-cycle.patch # Non-glibc patches # PATCH-FIX-OPENSUSE Remove debianisms from manpages @@ -306,7 +282,7 @@ Summary: Info Files for the GNU C Library License: GFDL-1.1-only Group: Documentation/Other Requires(post): %{install_info_prereq} -Requires(preun): %{install_info_prereq} +Requires(preun):%{install_info_prereq} BuildArch: noarch %description info @@ -380,7 +356,7 @@ performance with NIS, NIS+, and LDAP. %package profile Summary: Libc Profiling and Debugging Versions -License: LGPL-2.1-or-later AND LGPL-2.1-or-later WITH GCC-exception-2.0 AND GPL-2.0-or-later +License: GPL-2.0-or-later AND LGPL-2.1-or-later AND LGPL-2.1-or-later WITH GCC-exception-2.0 Group: Development/Libraries/C and C++ Requires: glibc = %{version} # bug437293 @@ -430,6 +406,7 @@ The glibc-devel-static package contains the C library static libraries for -static linking. You don't need these, unless you link statically, which is highly discouraged. + # makedb requires libselinux. We add this program in a separate # package so that glibc does not require libselinux. %package extra @@ -468,21 +445,8 @@ makedb: A program to create a database for nss %patch304 -p1 %patch306 -p1 -%patch1000 -p1 -%patch1001 -p1 -%patch1002 -p1 -%patch1003 -p1 -%patch1004 -p1 -%patch1005 -p1 -%patch1006 -p1 -%patch1007 -p1 -%patch1008 -p1 -%patch1009 -p1 - %patch2000 -p1 %patch2001 -p1 -%patch2002 -p1 -%patch2003 -p1 %patch3000 @@ -735,9 +699,6 @@ install -D -m 644 %{SOURCE5} %{buildroot}%{_prefix}/etc/nsswitch.conf install -m 644 %{SOURCE5} %{buildroot}/etc %endif -mkdir -p %{buildroot}/etc/default -install -m 644 nis/nss %{buildroot}/etc/default/ - mkdir -p %{buildroot}%{_includedir}/resolv install -m 0644 resolv/mapv4v6addr.h %{buildroot}%{_includedir}/resolv/ install -m 0644 resolv/mapv4v6hostent.h %{buildroot}%{_includedir}/resolv/ @@ -981,7 +942,6 @@ exit 0 %endif %attr(0644,root,root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /etc/gai.conf %doc posix/gai.conf -%config(noreplace) /etc/default/nss %doc %{_mandir}/man1/gencat.1.gz %doc %{_mandir}/man1/getconf.1.gz %doc %{_mandir}/man5/* diff --git a/iconv-redundant-shift.patch b/iconv-redundant-shift.patch deleted file mode 100644 index 58e52b6..0000000 --- a/iconv-redundant-shift.patch +++ /dev/null @@ -1,82 +0,0 @@ -From 9a99c682144bdbd40792ebf822fe9264e0376fb5 Mon Sep 17 00:00:00 2001 -From: Arjun Shankar -Date: Wed, 4 Nov 2020 12:19:38 +0100 -Subject: [PATCH] iconv: Accept redundant shift sequences in IBM1364 [BZ - #26224] - -The IBM1364, IBM1371, IBM1388, IBM1390 and IBM1399 character sets -share converter logic (iconvdata/ibm1364.c) which would reject -redundant shift sequences when processing input in these character -sets. This led to a hang in the iconv program (CVE-2020-27618). - -This commit adjusts the converter to ignore redundant shift sequences -and adds test cases for iconv_prog hangs that would be triggered upon -their rejection. This brings the implementation in line with other -converters that also ignore redundant shift sequences (e.g. IBM930 -etc., fixed in commit 692de4b3960d). - -Reviewed-by: Carlos O'Donell ---- - NEWS | 4 +++- - iconv/tst-iconv_prog.sh | 16 ++++++++++------ - iconvdata/ibm1364.c | 14 ++------------ - 3 files changed, 15 insertions(+), 19 deletions(-) - -Index: glibc-2.32/iconv/tst-iconv_prog.sh -=================================================================== ---- glibc-2.32.orig/iconv/tst-iconv_prog.sh -+++ glibc-2.32/iconv/tst-iconv_prog.sh -@@ -102,12 +102,16 @@ hangarray=( - "\x00\x80;-c;IBM1161;UTF-8//TRANSLIT//IGNORE" - "\x00\xdb;-c;IBM1162;UTF-8//TRANSLIT//IGNORE" - "\x00\x70;-c;IBM12712;UTF-8//TRANSLIT//IGNORE" --# These are known hangs that are yet to be fixed: --# "\x00\x0f;-c;IBM1364;UTF-8" --# "\x00\x0f;-c;IBM1371;UTF-8" --# "\x00\x0f;-c;IBM1388;UTF-8" --# "\x00\x0f;-c;IBM1390;UTF-8" --# "\x00\x0f;-c;IBM1399;UTF-8" -+"\x00\x0f;-c;IBM1364;UTF-8" -+"\x0e\x0e;-c;IBM1364;UTF-8" -+"\x00\x0f;-c;IBM1371;UTF-8" -+"\x0e\x0e;-c;IBM1371;UTF-8" -+"\x00\x0f;-c;IBM1388;UTF-8" -+"\x0e\x0e;-c;IBM1388;UTF-8" -+"\x00\x0f;-c;IBM1390;UTF-8" -+"\x0e\x0e;-c;IBM1390;UTF-8" -+"\x00\x0f;-c;IBM1399;UTF-8" -+"\x0e\x0e;-c;IBM1399;UTF-8" - "\x00\x53;-c;IBM16804;UTF-8//TRANSLIT//IGNORE" - "\x00\x41;-c;IBM274;UTF-8//TRANSLIT//IGNORE" - "\x00\x41;-c;IBM275;UTF-8//TRANSLIT//IGNORE" -Index: glibc-2.32/iconvdata/ibm1364.c -=================================================================== ---- glibc-2.32.orig/iconvdata/ibm1364.c -+++ glibc-2.32/iconvdata/ibm1364.c -@@ -158,24 +158,14 @@ enum - \ - if (__builtin_expect (ch, 0) == SO) \ - { \ -- /* Shift OUT, change to DBCS converter. */ \ -- if (curcs == db) \ -- { \ -- result = __GCONV_ILLEGAL_INPUT; \ -- break; \ -- } \ -+ /* Shift OUT, change to DBCS converter (redundant escape okay). */ \ - curcs = db; \ - ++inptr; \ - continue; \ - } \ - if (__builtin_expect (ch, 0) == SI) \ - { \ -- /* Shift IN, change to SBCS converter. */ \ -- if (curcs == sb) \ -- { \ -- result = __GCONV_ILLEGAL_INPUT; \ -- break; \ -- } \ -+ /* Shift IN, change to SBCS converter (redundant escape okay). */ \ - curcs = sb; \ - ++inptr; \ - continue; \ diff --git a/iconv-ucs4-loop-bounds.patch b/iconv-ucs4-loop-bounds.patch deleted file mode 100644 index ac7be10..0000000 --- a/iconv-ucs4-loop-bounds.patch +++ /dev/null @@ -1,147 +0,0 @@ -From 228edd356f03bf62dcf2b1335f25d43c602ee68d Mon Sep 17 00:00:00 2001 -From: Michael Colavita -Date: Thu, 19 Nov 2020 11:44:40 -0500 -Subject: [PATCH] iconv: Fix incorrect UCS4 inner loop bounds (BZ#26923) - -Previously, in UCS4 conversion routines we limit the number of -characters we examine to the minimum of the number of characters in the -input and the number of characters in the output. This is not the -correct behavior when __GCONV_IGNORE_ERRORS is set, as we do not consume -an output character when we skip a code unit. Instead, track the input -and output pointers and terminate the loop when either reaches its -limit. - -This resolves assertion failures when resetting the input buffer in a step of -iconv, which assumes that the input will be fully consumed given sufficient -output space. ---- - iconv/Makefile | 2 +- - iconv/gconv_simple.c | 16 ++++---------- - iconv/tst-iconv8.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 55 insertions(+), 13 deletions(-) - create mode 100644 iconv/tst-iconv8.c - -Index: glibc-2.32/iconv/Makefile -=================================================================== ---- glibc-2.32.orig/iconv/Makefile -+++ glibc-2.32/iconv/Makefile -@@ -44,7 +44,7 @@ CFLAGS-linereader.c += -DNO_TRANSLITERAT - CFLAGS-simple-hash.c += -I../locale - - tests = tst-iconv1 tst-iconv2 tst-iconv3 tst-iconv4 tst-iconv5 tst-iconv6 \ -- tst-iconv7 tst-iconv-mt tst-iconv-opt -+ tst-iconv7 tst-iconv8 tst-iconv-mt tst-iconv-opt - - others = iconv_prog iconvconfig - install-others-programs = $(inst_bindir)/iconv -Index: glibc-2.32/iconv/gconv_simple.c -=================================================================== ---- glibc-2.32.orig/iconv/gconv_simple.c -+++ glibc-2.32/iconv/gconv_simple.c -@@ -239,11 +239,9 @@ ucs4_internal_loop (struct __gconv_step - int flags = step_data->__flags; - const unsigned char *inptr = *inptrp; - unsigned char *outptr = *outptrp; -- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4; - int result; -- size_t cnt; - -- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) -+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4) - { - uint32_t inval; - -@@ -307,11 +305,9 @@ ucs4_internal_loop_unaligned (struct __g - int flags = step_data->__flags; - const unsigned char *inptr = *inptrp; - unsigned char *outptr = *outptrp; -- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4; - int result; -- size_t cnt; - -- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) -+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4) - { - if (__glibc_unlikely (inptr[0] > 0x80)) - { -@@ -613,11 +609,9 @@ ucs4le_internal_loop (struct __gconv_ste - int flags = step_data->__flags; - const unsigned char *inptr = *inptrp; - unsigned char *outptr = *outptrp; -- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4; - int result; -- size_t cnt; - -- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) -+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4) - { - uint32_t inval; - -@@ -684,11 +678,9 @@ ucs4le_internal_loop_unaligned (struct _ - int flags = step_data->__flags; - const unsigned char *inptr = *inptrp; - unsigned char *outptr = *outptrp; -- size_t n_convert = MIN (inend - inptr, outend - outptr) / 4; - int result; -- size_t cnt; - -- for (cnt = 0; cnt < n_convert; ++cnt, inptr += 4) -+ for (; inptr + 4 <= inend && outptr + 4 <= outend; inptr += 4) - { - if (__glibc_unlikely (inptr[3] > 0x80)) - { -Index: glibc-2.32/iconv/tst-iconv8.c -=================================================================== ---- /dev/null -+++ glibc-2.32/iconv/tst-iconv8.c -@@ -0,0 +1,50 @@ -+/* Test iconv behavior on UCS4 conversions with //IGNORE. -+ Copyright (C) 2020 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 -+ . */ -+ -+/* Derived from BZ #26923 */ -+#include -+#include -+#include -+#include -+ -+static int -+do_test (void) -+{ -+ iconv_t cd = iconv_open ("UTF-8//IGNORE", "ISO-10646/UCS4/"); -+ TEST_VERIFY_EXIT (cd != (iconv_t) -1); -+ -+ /* -+ * Convert sequence beginning with an irreversible character into buffer that -+ * is too small. -+ */ -+ char input[12] = "\xe1\x80\xa1" "AAAAAAAAA"; -+ char *inptr = input; -+ size_t insize = sizeof (input); -+ char output[6]; -+ char *outptr = output; -+ size_t outsize = sizeof (output); -+ -+ TEST_VERIFY (iconv (cd, &inptr, &insize, &outptr, &outsize) == -1); -+ TEST_VERIFY (errno == E2BIG); -+ -+ TEST_VERIFY_EXIT (iconv_close (cd) != -1); -+ -+ return 0; -+} -+ -+#include diff --git a/ifunc-fma4.patch b/ifunc-fma4.patch deleted file mode 100644 index 1590cfe..0000000 --- a/ifunc-fma4.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 23af890b3f04e80da783ba64e6b6d94822e01d54 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Ond=C5=99ej=20Ho=C5=A1ek?= -Date: Wed, 26 Aug 2020 04:26:50 +0200 -Subject: [PATCH] x86-64: Fix FMA4 detection in ifunc [BZ #26534] - -A typo in commit 107e6a3c2212ba7a3a4ec7cae8d82d73f7c95d0b causes the -FMA4 code path to be taken on systems that support FMA, even if they do -not support FMA4. Fix this to detect FMA4. ---- - sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h b/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h -index 7659758972..e5fd5ac9cb 100644 ---- a/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h -+++ b/sysdeps/x86_64/fpu/multiarch/ifunc-fma4.h -@@ -32,7 +32,7 @@ IFUNC_SELECTOR (void) - && CPU_FEATURE_USABLE_P (cpu_features, AVX2)) - return OPTIMIZE (fma); - -- if (CPU_FEATURE_USABLE_P (cpu_features, FMA)) -+ if (CPU_FEATURE_USABLE_P (cpu_features, FMA4)) - return OPTIMIZE (fma4); - - return OPTIMIZE (sse2); --- -2.28.0 - diff --git a/intl-codeset-suffixes.patch b/intl-codeset-suffixes.patch deleted file mode 100644 index e6747cf..0000000 --- a/intl-codeset-suffixes.patch +++ /dev/null @@ -1,237 +0,0 @@ -From fe62c4d173f3cc1ac64f01e75a8f421b2f092cdb Mon Sep 17 00:00:00 2001 -From: Arjun Shankar -Date: Fri, 25 Sep 2020 14:47:06 +0200 -Subject: [PATCH] intl: Handle translation output codesets with suffixes [BZ - #26383] - -Commit 91927b7c7643 (Rewrite iconv option parsing [BZ #19519]) did not -handle cases where the output codeset for translations (via the `gettext' -family of functions) might have a caller specified encoding suffix such as -TRANSLIT or IGNORE. This led to a regression where translations did not -work when the codeset had a suffix. - -This commit fixes the above issue by parsing any suffixes passed to -__dcigettext and adds two new test-cases to intl/tst-codeset.c to -verify correct behaviour. The iconv-internal function __gconv_create_spec -and the static iconv-internal function gconv_destroy_spec are now visible -internally within glibc and used in intl/dcigettext.c. - -(cherry picked from commit 7d4ec75e111291851620c6aa2c4460647b7fd50d) ---- - -Index: glibc-2.32/iconv/Versions -=================================================================== ---- glibc-2.32.orig/iconv/Versions -+++ glibc-2.32/iconv/Versions -@@ -6,7 +6,9 @@ libc { - GLIBC_PRIVATE { - # functions shared with iconv program - __gconv_get_alias_db; __gconv_get_cache; __gconv_get_modules_db; -- __gconv_open; __gconv_create_spec; -+ -+ # functions used elsewhere in glibc -+ __gconv_open; __gconv_create_spec; __gconv_destroy_spec; - - # function used by the gconv modules - __gconv_transliterate; -Index: glibc-2.32/iconv/gconv_charset.c -=================================================================== ---- glibc-2.32.orig/iconv/gconv_charset.c -+++ glibc-2.32/iconv/gconv_charset.c -@@ -216,3 +216,13 @@ out: - return ret; - } - libc_hidden_def (__gconv_create_spec) -+ -+ -+void -+__gconv_destroy_spec (struct gconv_spec *conv_spec) -+{ -+ free (conv_spec->fromcode); -+ free (conv_spec->tocode); -+ return; -+} -+libc_hidden_def (__gconv_destroy_spec) -Index: glibc-2.32/iconv/gconv_charset.h -=================================================================== ---- glibc-2.32.orig/iconv/gconv_charset.h -+++ glibc-2.32/iconv/gconv_charset.h -@@ -48,33 +48,6 @@ - #define GCONV_IGNORE_ERRORS_SUFFIX "IGNORE" - - --/* This function accepts the charset names of the source and destination of the -- conversion and populates *conv_spec with an equivalent conversion -- specification that may later be used by __gconv_open. The charset names -- might contain options in the form of suffixes that alter the conversion, -- e.g. "ISO-10646/UTF-8/TRANSLIT". It processes the charset names, ignoring -- and truncating any suffix options in fromcode, and processing and truncating -- any suffix options in tocode. Supported suffix options ("TRANSLIT" or -- "IGNORE") when found in tocode lead to the corresponding flag in *conv_spec -- to be set to true. Unrecognized suffix options are silently discarded. If -- the function succeeds, it returns conv_spec back to the caller. It returns -- NULL upon failure. */ --struct gconv_spec * --__gconv_create_spec (struct gconv_spec *conv_spec, const char *fromcode, -- const char *tocode); --libc_hidden_proto (__gconv_create_spec) -- -- --/* This function frees all heap memory allocated by __gconv_create_spec. */ --static void __attribute__ ((unused)) --gconv_destroy_spec (struct gconv_spec *conv_spec) --{ -- free (conv_spec->fromcode); -- free (conv_spec->tocode); -- return; --} -- -- - /* This function copies in-order, characters from the source 's' that are - either alpha-numeric or one in one of these: "_-.,:/" - into the destination - 'wp' while dropping all other characters. In the process, it converts all -Index: glibc-2.32/iconv/gconv_int.h -=================================================================== ---- glibc-2.32.orig/iconv/gconv_int.h -+++ glibc-2.32/iconv/gconv_int.h -@@ -152,6 +152,27 @@ extern int __gconv_open (struct gconv_sp - __gconv_t *handle, int flags); - libc_hidden_proto (__gconv_open) - -+/* This function accepts the charset names of the source and destination of the -+ conversion and populates *conv_spec with an equivalent conversion -+ specification that may later be used by __gconv_open. The charset names -+ might contain options in the form of suffixes that alter the conversion, -+ e.g. "ISO-10646/UTF-8/TRANSLIT". It processes the charset names, ignoring -+ and truncating any suffix options in fromcode, and processing and truncating -+ any suffix options in tocode. Supported suffix options ("TRANSLIT" or -+ "IGNORE") when found in tocode lead to the corresponding flag in *conv_spec -+ to be set to true. Unrecognized suffix options are silently discarded. If -+ the function succeeds, it returns conv_spec back to the caller. It returns -+ NULL upon failure. */ -+extern struct gconv_spec * -+__gconv_create_spec (struct gconv_spec *conv_spec, const char *fromcode, -+ const char *tocode); -+libc_hidden_proto (__gconv_create_spec) -+ -+/* This function frees all heap memory allocated by __gconv_create_spec. */ -+extern void -+__gconv_destroy_spec (struct gconv_spec *conv_spec); -+libc_hidden_proto (__gconv_destroy_spec) -+ - /* Free resources associated with transformation descriptor CD. */ - extern int __gconv_close (__gconv_t cd) - attribute_hidden; -Index: glibc-2.32/iconv/iconv_open.c -=================================================================== ---- glibc-2.32.orig/iconv/iconv_open.c -+++ glibc-2.32/iconv/iconv_open.c -@@ -39,7 +39,7 @@ iconv_open (const char *tocode, const ch - - int res = __gconv_open (&conv_spec, &cd, 0); - -- gconv_destroy_spec (&conv_spec); -+ __gconv_destroy_spec (&conv_spec); - - if (__builtin_expect (res, __GCONV_OK) != __GCONV_OK) - { -Index: glibc-2.32/iconv/iconv_prog.c -=================================================================== ---- glibc-2.32.orig/iconv/iconv_prog.c -+++ glibc-2.32/iconv/iconv_prog.c -@@ -184,7 +184,7 @@ main (int argc, char *argv[]) - /* Let's see whether we have these coded character sets. */ - res = __gconv_open (&conv_spec, &cd, 0); - -- gconv_destroy_spec (&conv_spec); -+ __gconv_destroy_spec (&conv_spec); - - if (res != __GCONV_OK) - { -Index: glibc-2.32/intl/dcigettext.c -=================================================================== ---- glibc-2.32.orig/intl/dcigettext.c -+++ glibc-2.32/intl/dcigettext.c -@@ -1121,15 +1121,18 @@ _nl_find_msg (struct loaded_l10nfile *do - - # ifdef _LIBC - -- struct gconv_spec conv_spec -- = { .fromcode = norm_add_slashes (charset, ""), -- .tocode = norm_add_slashes (outcharset, ""), -- /* We always want to use transliteration. */ -- .translit = true, -- .ignore = false -- }; -+ struct gconv_spec conv_spec; -+ -+ __gconv_create_spec (&conv_spec, charset, outcharset); -+ -+ /* We always want to use transliteration. */ -+ conv_spec.translit = true; -+ - int r = __gconv_open (&conv_spec, &convd->conv, - GCONV_AVOID_NOCONV); -+ -+ __gconv_destroy_spec (&conv_spec); -+ - if (__builtin_expect (r != __GCONV_OK, 0)) - { - /* If the output encoding is the same there is -Index: glibc-2.32/intl/tst-codeset.c -=================================================================== ---- glibc-2.32.orig/intl/tst-codeset.c -+++ glibc-2.32/intl/tst-codeset.c -@@ -22,13 +22,11 @@ - #include - #include - #include -+#include - - static int - do_test (void) - { -- char *s; -- int result = 0; -- - unsetenv ("LANGUAGE"); - unsetenv ("OUTPUT_CHARSET"); - setlocale (LC_ALL, "de_DE.ISO-8859-1"); -@@ -36,25 +34,21 @@ do_test (void) - bindtextdomain ("codeset", OBJPFX "domaindir"); - - /* Here we expect output in ISO-8859-1. */ -- s = gettext ("cheese"); -- if (strcmp (s, "K\344se")) -- { -- printf ("call 1 returned: %s\n", s); -- result = 1; -- } -+ TEST_COMPARE_STRING (gettext ("cheese"), "K\344se"); - -+ /* Here we expect output in UTF-8. */ - bind_textdomain_codeset ("codeset", "UTF-8"); -+ TEST_COMPARE_STRING (gettext ("cheese"), "K\303\244se"); - -- /* Here we expect output in UTF-8. */ -- s = gettext ("cheese"); -- if (strcmp (s, "K\303\244se")) -- { -- printf ("call 2 returned: %s\n", s); -- result = 1; -- } -+ /* `a with umlaut' is transliterated to `ae'. */ -+ bind_textdomain_codeset ("codeset", "ASCII//TRANSLIT"); -+ TEST_COMPARE_STRING (gettext ("cheese"), "Kaese"); -+ -+ /* Transliteration also works by default even if not set. */ -+ bind_textdomain_codeset ("codeset", "ASCII"); -+ TEST_COMPARE_STRING (gettext ("cheese"), "Kaese"); - -- return result; -+ return 0; - } - --#define TEST_FUNCTION do_test () --#include "../test-skeleton.c" -+#include diff --git a/ldconfig-concurrency.patch b/ldconfig-concurrency.patch index 70bae44..87790c6 100644 --- a/ldconfig-concurrency.patch +++ b/ldconfig-concurrency.patch @@ -25,7 +25,7 @@ Index: glibc-2.29/elf/cache.c @@ -481,6 +481,7 @@ save_cache (const char *cache_name) free (file_entries_new); free (file_entries); - free (strings); + free (strings_finalized.strings); + free (temp_name); while (entries) diff --git a/nscd-gc-cycle.patch b/nscd-gc-cycle.patch deleted file mode 100644 index b987e20..0000000 --- a/nscd-gc-cycle.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 4350db8d5e45dc4ec63e5fabc6bdc3a9425769dc Mon Sep 17 00:00:00 2001 -From: Andreas Schwab -Date: Wed, 17 Jun 2020 16:05:13 +0200 -Subject: [PATCH] nscd: bump GC cycle during cache pruning (bug 26130) - -While nscd prunes a cache it becomes inconsistent temporarily, which is -visible to clients if that cache is shared. Bump the GC cycle counter so -that the clients notice the modification window. ---- - nscd/cache.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/nscd/cache.c b/nscd/cache.c -index 94163d9ce3..2ceac94c23 100644 ---- a/nscd/cache.c -+++ b/nscd/cache.c -@@ -453,6 +453,11 @@ prune_cache (struct database_dyn *table, time_t now, int fd) - pthread_rwlock_wrlock (&table->lock); - } - -+ /* Now we start modifying the data. Make sure all readers of the -+ data are aware of this and temporarily don't use the data. */ -+ ++table->head->gc_cycle; -+ assert ((table->head->gc_cycle & 1) == 1); -+ - while (first <= last) - { - if (mark[first]) -@@ -493,6 +498,10 @@ prune_cache (struct database_dyn *table, time_t now, int fd) - ++first; - } - -+ /* Now we are done modifying the data. */ -+ ++table->head->gc_cycle; -+ assert ((table->head->gc_cycle & 1) == 0); -+ - /* It's all done. */ - pthread_rwlock_unlock (&table->lock); - --- -2.26.2 - diff --git a/printf-long-double-non-normal.patch b/printf-long-double-non-normal.patch deleted file mode 100644 index 7565f91..0000000 --- a/printf-long-double-non-normal.patch +++ /dev/null @@ -1,124 +0,0 @@ -From 681900d29683722b1cb0a8e565a0585846ec5a61 Mon Sep 17 00:00:00 2001 -From: Florian Weimer -Date: Tue, 22 Sep 2020 19:07:48 +0200 -Subject: [PATCH] x86: Harden printf against non-normal long double values (bug - 26649) - -The behavior of isnan/__builtin_isnan on bit patterns that do not -correspond to something that the CPU would produce from valid inputs -is currently under-defined in the toolchain. (The GCC built-in and -glibc disagree.) - -The isnan check in PRINTF_FP_FETCH in stdio-common/printf_fp.c -assumes the GCC behavior that returns true for non-normal numbers -which are not specified as NaN. (The glibc implementation returns -false for such numbers.) - -At present, passing non-normal numbers to __mpn_extract_long_double -causes this function to produce irregularly shaped multi-precision -integers, triggering undefined behavior in __printf_fp_l. - -With GCC 10 and glibc 2.32, this behavior is not visible because -__builtin_isnan is used, which avoids calling -__mpn_extract_long_double in this case. This commit updates the -implementation of __mpn_extract_long_double so that regularly shaped -multi-precision integers are produced in this case, avoiding -undefined behavior in __printf_fp_l. ---- - sysdeps/x86/Makefile | 4 ++ - sysdeps/x86/ldbl2mpn.c | 8 ++++ - sysdeps/x86/tst-ldbl-nonnormal-printf.c | 52 +++++++++++++++++++++++++ - 3 files changed, 64 insertions(+) - create mode 100644 sysdeps/x86/tst-ldbl-nonnormal-printf.c - -Index: glibc-2.32/sysdeps/i386/ldbl2mpn.c -=================================================================== ---- glibc-2.32.orig/sysdeps/i386/ldbl2mpn.c -+++ glibc-2.32/sysdeps/i386/ldbl2mpn.c -@@ -115,6 +115,14 @@ __mpn_extract_long_double (mp_ptr res_pt - && res_ptr[N - 1] == 0) - /* Pseudo zero. */ - *expt = 0; -+ else -+ /* Unlike other floating point formats, the most significant bit -+ is explicit and expected to be set for normal numbers. Set it -+ in case it is cleared in the input. Otherwise, callers will -+ not be able to produce the expected multi-precision integer -+ layout by shifting. */ -+ res_ptr[N - 1] |= (mp_limb_t) 1 << (LDBL_MANT_DIG - 1 -+ - ((N - 1) * BITS_PER_MP_LIMB)); - - return N; - } -Index: glibc-2.32/sysdeps/x86/Makefile -=================================================================== ---- glibc-2.32.orig/sysdeps/x86/Makefile -+++ glibc-2.32/sysdeps/x86/Makefile -@@ -9,6 +9,10 @@ tests += tst-get-cpu-features tst-get-cp - tests-static += tst-get-cpu-features-static - endif - -+ifeq ($(subdir),math) -+tests += tst-ldbl-nonnormal-printf -+endif # $(subdir) == math -+ - ifeq ($(subdir),setjmp) - gen-as-const-headers += jmp_buf-ssp.sym - sysdep_routines += __longjmp_cancel -Index: glibc-2.32/sysdeps/x86/tst-ldbl-nonnormal-printf.c -=================================================================== ---- /dev/null -+++ glibc-2.32/sysdeps/x86/tst-ldbl-nonnormal-printf.c -@@ -0,0 +1,52 @@ -+/* Test printf with x86-specific non-normal long double value. -+ Copyright (C) 2020 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 -+ -+/* Fill the stack with non-zero values. This makes a crash in -+ snprintf more likely. */ -+static void __attribute__ ((noinline, noclone)) -+fill_stack (void) -+{ -+ char buffer[65536]; -+ memset (buffer, 0xc0, sizeof (buffer)); -+ asm ("" ::: "memory"); -+} -+ -+static int -+do_test (void) -+{ -+ fill_stack (); -+ -+ long double value; -+ memcpy (&value, "\x00\x04\x00\x00\x00\x00\x00\x00\x00\x04", 10); -+ -+ char buf[30]; -+ int ret = snprintf (buf, sizeof (buf), "%Lg", value); -+ TEST_COMPARE (ret, strlen (buf)); -+ if (strcmp (buf, "nan") != 0) -+ /* If snprintf does not recognize the non-normal number as a NaN, -+ it has added the missing explicit MSB. */ -+ TEST_COMPARE_STRING (buf, "3.02201e-4624"); -+ return 0; -+} -+ -+#include diff --git a/strerrorname-np.patch b/strerrorname-np.patch deleted file mode 100644 index 6c658f6..0000000 --- a/strerrorname-np.patch +++ /dev/null @@ -1,1676 +0,0 @@ -From 69beb5cbf85cae1c61fe7432500ac10880dc7b07 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Mon, 31 Aug 2020 11:53:51 -0300 -Subject: [PATCH] string: Fix strerrorname_np return value [BZ #26555] - -It returns the string of the error constant, not its description (as -strerrordesc_np). To handle the Hurd error mapping, the ERR_MAP was -removed from errlist.h to errlist.c. - -Also, the testcase test-strerr (added on 325081b9eb2) was not added -on the check build neither it builds correctly. This patch also -changed it to decouple from errlist.h, the expected return values -are added explicitly for both both strerrorname_np and strerrordesc_np -directly. - -Checked on x86_64-linux-gnu and i686-linux-gnu. I also run a make -check for i686-gnu. - -(cherry picked from commit cef95fdc2e4002ee6357d8d40ef73c8d875720e3) - -Index: glibc-2.32/stdio-common/Makefile -=================================================================== ---- glibc-2.32.orig/stdio-common/Makefile -+++ glibc-2.32/stdio-common/Makefile -@@ -69,7 +69,8 @@ tests := tstscanf test_rdwr test-popen t - tst-printf-bz25691 \ - tst-vfprintf-width-prec-alloc \ - tst-printf-fp-free \ -- tst-printf-fp-leak -+ tst-printf-fp-leak \ -+ test-strerr - - - test-srcs = tst-unbputc tst-printf tst-printfsz-islongdouble -Index: glibc-2.32/stdio-common/errlist.c -=================================================================== ---- glibc-2.32.orig/stdio-common/errlist.c -+++ glibc-2.32/stdio-common/errlist.c -@@ -20,9 +20,13 @@ - #include - #include - -+#ifndef ERR_MAP -+# define ERR_MAP(n) n -+#endif -+ - const char *const _sys_errlist_internal[] = - { --#define _S(n, str) [n] = str, -+#define _S(n, str) [ERR_MAP(n)] = str, - #include - #undef _S - }; -@@ -41,20 +45,21 @@ static const union sys_errname_t - { - #define MSGSTRFIELD1(line) str##line - #define MSGSTRFIELD(line) MSGSTRFIELD1(line) --#define _S(n, str) char MSGSTRFIELD(__LINE__)[sizeof(str)]; -+#define _S(n, str) char MSGSTRFIELD(__LINE__)[sizeof(#n)]; - #include - #undef _S - }; - char str[0]; - } _sys_errname = { { --#define _S(n, s) s, -+#define _S(n, s) #n, - #include - #undef _S - } }; - - static const unsigned short _sys_errnameidx[] = - { --#define _S(n, s) [n] = offsetof(union sys_errname_t, MSGSTRFIELD(__LINE__)), -+#define _S(n, s) \ -+ [ERR_MAP(n)] = offsetof(union sys_errname_t, MSGSTRFIELD(__LINE__)), - #include - #undef _S - }; -Index: glibc-2.32/stdio-common/test-strerr.c -=================================================================== ---- glibc-2.32.orig/stdio-common/test-strerr.c -+++ glibc-2.32/stdio-common/test-strerr.c -@@ -18,46 +18,672 @@ - - #include - #include --#include - - #include - #include - --#define N_(name) name -- --static const char *const errlist[] = -- { --/* This file is auto-generated from errlist.def. */ --#include -- }; -- --#define MSGSTR_T errname_t --#define MSGSTR errname --#define MSGIDX errnameidx --#include --#undef MSGSTR --#undef MSGIDX -- - static int - do_test (void) - { -- TEST_VERIFY (strerrordesc_np (-1) == NULL); -- TEST_VERIFY (strerrordesc_np (array_length (errlist)) == NULL); -- for (size_t i = 0; i < array_length (errlist); i++) -- { -- if (errlist[i] == NULL) -- continue; -- TEST_COMPARE_STRING (strerrordesc_np (i), errlist[i]); -- } -+ TEST_COMPARE_STRING (strerrordesc_np (0), "Success"); -+ TEST_COMPARE_STRING (strerrorname_np (0), "0"); - -- TEST_VERIFY (strerrorname_np (-1) == NULL); -- TEST_VERIFY (strerrorname_np (array_length (errlist)) == NULL); -- for (size_t i = 0; i < array_length (errlist); i++) -- { -- if (errlist[i] == NULL) -- continue; -- TEST_COMPARE_STRING (strerrorname_np (i), errname.str + errnameidx[i]); -- } -+#ifdef EPERM -+ TEST_COMPARE_STRING (strerrordesc_np (EPERM), "Operation not permitted"); -+ TEST_COMPARE_STRING (strerrorname_np (EPERM), "EPERM"); -+#endif -+#ifdef ENOENT -+ TEST_COMPARE_STRING (strerrordesc_np (ENOENT), -+ "No such file or directory"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOENT), "ENOENT"); -+#endif -+#ifdef ESRCH -+ TEST_COMPARE_STRING (strerrordesc_np (ESRCH), "No such process"); -+ TEST_COMPARE_STRING (strerrorname_np (ESRCH), "ESRCH"); -+#endif -+#ifdef EINTR -+ TEST_COMPARE_STRING (strerrordesc_np (EINTR), "Interrupted system call"); -+ TEST_COMPARE_STRING (strerrorname_np (EINTR), "EINTR"); -+#endif -+#ifdef EIO -+ TEST_COMPARE_STRING (strerrordesc_np (EIO), "Input/output error"); -+ TEST_COMPARE_STRING (strerrorname_np (EIO), "EIO"); -+#endif -+#ifdef ENXIO -+ TEST_COMPARE_STRING (strerrordesc_np (ENXIO), "No such device or address"); -+ TEST_COMPARE_STRING (strerrorname_np (ENXIO), "ENXIO"); -+#endif -+#ifdef E2BIG -+ TEST_COMPARE_STRING (strerrordesc_np (E2BIG), "Argument list too long"); -+ TEST_COMPARE_STRING (strerrorname_np (E2BIG), "E2BIG"); -+#endif -+#ifdef ENOEXEC -+ TEST_COMPARE_STRING (strerrordesc_np (ENOEXEC), "Exec format error"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOEXEC), "ENOEXEC"); -+#endif -+#ifdef EBADF -+ TEST_COMPARE_STRING (strerrordesc_np (EBADF), "Bad file descriptor"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADF), "EBADF"); -+#endif -+#ifdef ECHILD -+ TEST_COMPARE_STRING (strerrordesc_np (ECHILD), "No child processes"); -+ TEST_COMPARE_STRING (strerrorname_np (ECHILD), "ECHILD"); -+#endif -+#ifdef EDEADLK -+ TEST_COMPARE_STRING (strerrordesc_np (EDEADLK), -+ "Resource deadlock avoided"); -+ TEST_COMPARE_STRING (strerrorname_np (EDEADLK), "EDEADLK"); -+#endif -+#ifdef ENOMEM -+ TEST_COMPARE_STRING (strerrordesc_np (ENOMEM), "Cannot allocate memory"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOMEM), "ENOMEM"); -+#endif -+#ifdef EACCES -+ TEST_COMPARE_STRING (strerrordesc_np (EACCES), "Permission denied"); -+ TEST_COMPARE_STRING (strerrorname_np (EACCES), "EACCES"); -+#endif -+#ifdef EFAULT -+ TEST_COMPARE_STRING (strerrordesc_np (EFAULT), "Bad address"); -+ TEST_COMPARE_STRING (strerrorname_np (EFAULT), "EFAULT"); -+#endif -+#ifdef ENOTBLK -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTBLK), "Block device required"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTBLK), "ENOTBLK"); -+#endif -+#ifdef EBUSY -+ TEST_COMPARE_STRING (strerrordesc_np (EBUSY), "Device or resource busy"); -+ TEST_COMPARE_STRING (strerrorname_np (EBUSY), "EBUSY"); -+#endif -+#ifdef EEXIST -+ TEST_COMPARE_STRING (strerrordesc_np (EEXIST), "File exists"); -+ TEST_COMPARE_STRING (strerrorname_np (EEXIST), "EEXIST"); -+#endif -+#ifdef EXDEV -+ TEST_COMPARE_STRING (strerrordesc_np (EXDEV), "Invalid cross-device link"); -+ TEST_COMPARE_STRING (strerrorname_np (EXDEV), "EXDEV"); -+#endif -+#ifdef ENODEV -+ TEST_COMPARE_STRING (strerrordesc_np (ENODEV), "No such device"); -+ TEST_COMPARE_STRING (strerrorname_np (ENODEV), "ENODEV"); -+#endif -+#ifdef ENOTDIR -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTDIR), "Not a directory"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTDIR), "ENOTDIR"); -+#endif -+#ifdef EISDIR -+ TEST_COMPARE_STRING (strerrordesc_np (EISDIR), "Is a directory"); -+ TEST_COMPARE_STRING (strerrorname_np (EISDIR), "EISDIR"); -+#endif -+#ifdef EINVAL -+ TEST_COMPARE_STRING (strerrordesc_np (EINVAL), "Invalid argument"); -+ TEST_COMPARE_STRING (strerrorname_np (EINVAL), "EINVAL"); -+#endif -+#ifdef EMFILE -+ TEST_COMPARE_STRING (strerrordesc_np (EMFILE), "Too many open files"); -+ TEST_COMPARE_STRING (strerrorname_np (EMFILE), "EMFILE"); -+#endif -+#ifdef ENFILE -+ TEST_COMPARE_STRING (strerrordesc_np (ENFILE), -+ "Too many open files in system"); -+ TEST_COMPARE_STRING (strerrorname_np (ENFILE), "ENFILE"); -+#endif -+#ifdef ENOTTY -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTTY), -+ "Inappropriate ioctl for device"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTTY), "ENOTTY"); -+#endif -+#ifdef ETXTBSY -+ TEST_COMPARE_STRING (strerrordesc_np (ETXTBSY), "Text file busy"); -+ TEST_COMPARE_STRING (strerrorname_np (ETXTBSY), "ETXTBSY"); -+#endif -+#ifdef EFBIG -+ TEST_COMPARE_STRING (strerrordesc_np (EFBIG), "File too large"); -+ TEST_COMPARE_STRING (strerrorname_np (EFBIG), "EFBIG"); -+#endif -+#ifdef ENOSPC -+ TEST_COMPARE_STRING (strerrordesc_np (ENOSPC), "No space left on device"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOSPC), "ENOSPC"); -+#endif -+#ifdef ESPIPE -+ TEST_COMPARE_STRING (strerrordesc_np (ESPIPE), "Illegal seek"); -+ TEST_COMPARE_STRING (strerrorname_np (ESPIPE), "ESPIPE"); -+#endif -+#ifdef EROFS -+ TEST_COMPARE_STRING (strerrordesc_np (EROFS), "Read-only file system"); -+ TEST_COMPARE_STRING (strerrorname_np (EROFS), "EROFS"); -+#endif -+#ifdef EMLINK -+ TEST_COMPARE_STRING (strerrordesc_np (EMLINK), "Too many links"); -+ TEST_COMPARE_STRING (strerrorname_np (EMLINK), "EMLINK"); -+#endif -+#ifdef EPIPE -+ TEST_COMPARE_STRING (strerrordesc_np (EPIPE), "Broken pipe"); -+ TEST_COMPARE_STRING (strerrorname_np (EPIPE), "EPIPE"); -+#endif -+#ifdef EDOM -+ TEST_COMPARE_STRING (strerrordesc_np (EDOM), -+ "Numerical argument out of domain"); -+ TEST_COMPARE_STRING (strerrorname_np (EDOM), "EDOM"); -+#endif -+#ifdef ERANGE -+ TEST_COMPARE_STRING (strerrordesc_np (ERANGE), -+ "Numerical result out of range"); -+ TEST_COMPARE_STRING (strerrorname_np (ERANGE), "ERANGE"); -+#endif -+#ifdef EAGAIN -+ TEST_COMPARE_STRING (strerrordesc_np (EAGAIN), -+ "Resource temporarily unavailable"); -+ TEST_COMPARE_STRING (strerrorname_np (EAGAIN), "EAGAIN"); -+#endif -+#ifdef EINPROGRESS -+ TEST_COMPARE_STRING (strerrordesc_np (EINPROGRESS), -+ "Operation now in progress"); -+ TEST_COMPARE_STRING (strerrorname_np (EINPROGRESS), "EINPROGRESS"); -+#endif -+#ifdef EALREADY -+ TEST_COMPARE_STRING (strerrordesc_np (EALREADY), -+ "Operation already in progress"); -+ TEST_COMPARE_STRING (strerrorname_np (EALREADY), "EALREADY"); -+#endif -+#ifdef ENOTSOCK -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTSOCK), -+ "Socket operation on non-socket"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTSOCK), "ENOTSOCK"); -+#endif -+#ifdef EMSGSIZE -+ TEST_COMPARE_STRING (strerrordesc_np (EMSGSIZE), "Message too long"); -+ TEST_COMPARE_STRING (strerrorname_np (EMSGSIZE), "EMSGSIZE"); -+#endif -+#ifdef EPROTOTYPE -+ TEST_COMPARE_STRING (strerrordesc_np (EPROTOTYPE), -+ "Protocol wrong type for socket"); -+ TEST_COMPARE_STRING (strerrorname_np (EPROTOTYPE), "EPROTOTYPE"); -+#endif -+#ifdef ENOPROTOOPT -+ TEST_COMPARE_STRING (strerrordesc_np (ENOPROTOOPT), -+ "Protocol not available"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOPROTOOPT), "ENOPROTOOPT"); -+#endif -+#ifdef EPROTONOSUPPORT -+ TEST_COMPARE_STRING (strerrordesc_np (EPROTONOSUPPORT), -+ "Protocol not supported"); -+ TEST_COMPARE_STRING (strerrorname_np (EPROTONOSUPPORT), "EPROTONOSUPPORT"); -+#endif -+#ifdef ESOCKTNOSUPPORT -+ TEST_COMPARE_STRING (strerrordesc_np (ESOCKTNOSUPPORT), -+ "Socket type not supported"); -+ TEST_COMPARE_STRING (strerrorname_np (ESOCKTNOSUPPORT), "ESOCKTNOSUPPORT"); -+#endif -+#ifdef EOPNOTSUPP -+ TEST_COMPARE_STRING (strerrordesc_np (EOPNOTSUPP), -+ "Operation not supported"); -+ TEST_COMPARE_STRING (strerrorname_np (EOPNOTSUPP), "EOPNOTSUPP"); -+#endif -+#ifdef EPFNOSUPPORT -+ TEST_COMPARE_STRING (strerrordesc_np (EPFNOSUPPORT), -+ "Protocol family not supported"); -+ TEST_COMPARE_STRING (strerrorname_np (EPFNOSUPPORT), "EPFNOSUPPORT"); -+#endif -+#ifdef EAFNOSUPPORT -+ TEST_COMPARE_STRING (strerrordesc_np (EAFNOSUPPORT), -+ "Address family not supported by protocol"); -+ TEST_COMPARE_STRING (strerrorname_np (EAFNOSUPPORT), "EAFNOSUPPORT"); -+#endif -+#ifdef EADDRINUSE -+ TEST_COMPARE_STRING (strerrordesc_np (EADDRINUSE), -+ "Address already in use"); -+ TEST_COMPARE_STRING (strerrorname_np (EADDRINUSE), "EADDRINUSE"); -+#endif -+#ifdef EADDRNOTAVAIL -+ TEST_COMPARE_STRING (strerrordesc_np (EADDRNOTAVAIL), -+ "Cannot assign requested address"); -+ TEST_COMPARE_STRING (strerrorname_np (EADDRNOTAVAIL), "EADDRNOTAVAIL"); -+#endif -+#ifdef ENETDOWN -+ TEST_COMPARE_STRING (strerrordesc_np (ENETDOWN), "Network is down"); -+ TEST_COMPARE_STRING (strerrorname_np (ENETDOWN), "ENETDOWN"); -+#endif -+#ifdef ENETUNREACH -+ TEST_COMPARE_STRING (strerrordesc_np (ENETUNREACH), -+ "Network is unreachable"); -+ TEST_COMPARE_STRING (strerrorname_np (ENETUNREACH), "ENETUNREACH"); -+#endif -+#ifdef ENETRESET -+ TEST_COMPARE_STRING (strerrordesc_np (ENETRESET), -+ "Network dropped connection on reset"); -+ TEST_COMPARE_STRING (strerrorname_np (ENETRESET), "ENETRESET"); -+#endif -+#ifdef ECONNABORTED -+ TEST_COMPARE_STRING (strerrordesc_np (ECONNABORTED), -+ "Software caused connection abort"); -+ TEST_COMPARE_STRING (strerrorname_np (ECONNABORTED), "ECONNABORTED"); -+#endif -+#ifdef ECONNRESET -+ TEST_COMPARE_STRING (strerrordesc_np (ECONNRESET), -+ "Connection reset by peer"); -+ TEST_COMPARE_STRING (strerrorname_np (ECONNRESET), "ECONNRESET"); -+#endif -+#ifdef ENOBUFS -+ TEST_COMPARE_STRING (strerrordesc_np (ENOBUFS), -+ "No buffer space available"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOBUFS), "ENOBUFS"); -+#endif -+#ifdef EISCONN -+ TEST_COMPARE_STRING (strerrordesc_np (EISCONN), -+ "Transport endpoint is already connected"); -+ TEST_COMPARE_STRING (strerrorname_np (EISCONN), "EISCONN"); -+#endif -+#ifdef ENOTCONN -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTCONN), -+ "Transport endpoint is not connected"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTCONN), "ENOTCONN"); -+#endif -+#ifdef EDESTADDRREQ -+ TEST_COMPARE_STRING (strerrordesc_np (EDESTADDRREQ), -+ "Destination address required"); -+ TEST_COMPARE_STRING (strerrorname_np (EDESTADDRREQ), "EDESTADDRREQ"); -+#endif -+#ifdef ESHUTDOWN -+ TEST_COMPARE_STRING (strerrordesc_np (ESHUTDOWN), -+ "Cannot send after transport endpoint shutdown"); -+ TEST_COMPARE_STRING (strerrorname_np (ESHUTDOWN), "ESHUTDOWN"); -+#endif -+#ifdef ETOOMANYREFS -+ TEST_COMPARE_STRING (strerrordesc_np (ETOOMANYREFS), -+ "Too many references: cannot splice"); -+ TEST_COMPARE_STRING (strerrorname_np (ETOOMANYREFS), "ETOOMANYREFS"); -+#endif -+#ifdef ETIMEDOUT -+ TEST_COMPARE_STRING (strerrordesc_np (ETIMEDOUT), "Connection timed out"); -+ TEST_COMPARE_STRING (strerrorname_np (ETIMEDOUT), "ETIMEDOUT"); -+#endif -+#ifdef ECONNREFUSED -+ TEST_COMPARE_STRING (strerrordesc_np (ECONNREFUSED), "Connection refused"); -+ TEST_COMPARE_STRING (strerrorname_np (ECONNREFUSED), "ECONNREFUSED"); -+#endif -+#ifdef ELOOP -+ TEST_COMPARE_STRING (strerrordesc_np (ELOOP), -+ "Too many levels of symbolic links"); -+ TEST_COMPARE_STRING (strerrorname_np (ELOOP), "ELOOP"); -+#endif -+#ifdef ENAMETOOLONG -+ TEST_COMPARE_STRING (strerrordesc_np (ENAMETOOLONG), "File name too long"); -+ TEST_COMPARE_STRING (strerrorname_np (ENAMETOOLONG), "ENAMETOOLONG"); -+#endif -+#ifdef EHOSTDOWN -+ TEST_COMPARE_STRING (strerrordesc_np (EHOSTDOWN), "Host is down"); -+ TEST_COMPARE_STRING (strerrorname_np (EHOSTDOWN), "EHOSTDOWN"); -+#endif -+#ifdef EHOSTUNREACH -+ TEST_COMPARE_STRING (strerrordesc_np (EHOSTUNREACH), "No route to host"); -+ TEST_COMPARE_STRING (strerrorname_np (EHOSTUNREACH), "EHOSTUNREACH"); -+#endif -+#ifdef ENOTEMPTY -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTEMPTY), "Directory not empty"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTEMPTY), "ENOTEMPTY"); -+#endif -+#ifdef EUSERS -+ TEST_COMPARE_STRING (strerrordesc_np (EUSERS), "Too many users"); -+ TEST_COMPARE_STRING (strerrorname_np (EUSERS), "EUSERS"); -+#endif -+#ifdef EDQUOT -+ TEST_COMPARE_STRING (strerrordesc_np (EDQUOT), "Disk quota exceeded"); -+ TEST_COMPARE_STRING (strerrorname_np (EDQUOT), "EDQUOT"); -+#endif -+#ifdef ESTALE -+ TEST_COMPARE_STRING (strerrordesc_np (ESTALE), "Stale file handle"); -+ TEST_COMPARE_STRING (strerrorname_np (ESTALE), "ESTALE"); -+#endif -+#ifdef EREMOTE -+ TEST_COMPARE_STRING (strerrordesc_np (EREMOTE), "Object is remote"); -+ TEST_COMPARE_STRING (strerrorname_np (EREMOTE), "EREMOTE"); -+#endif -+#ifdef ENOLCK -+ TEST_COMPARE_STRING (strerrordesc_np (ENOLCK), "No locks available"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOLCK), "ENOLCK"); -+#endif -+#ifdef ENOSYS -+ TEST_COMPARE_STRING (strerrordesc_np (ENOSYS), "Function not implemented"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOSYS), "ENOSYS"); -+#endif -+#ifdef EILSEQ -+ TEST_COMPARE_STRING (strerrordesc_np (EILSEQ), -+ "Invalid or incomplete multibyte or wide character"); -+ TEST_COMPARE_STRING (strerrorname_np (EILSEQ), "EILSEQ"); -+#endif -+#ifdef EBADMSG -+ TEST_COMPARE_STRING (strerrordesc_np (EBADMSG), "Bad message"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADMSG), "EBADMSG"); -+#endif -+#ifdef EIDRM -+ TEST_COMPARE_STRING (strerrordesc_np (EIDRM), "Identifier removed"); -+ TEST_COMPARE_STRING (strerrorname_np (EIDRM), "EIDRM"); -+#endif -+#ifdef EMULTIHOP -+ TEST_COMPARE_STRING (strerrordesc_np (EMULTIHOP), "Multihop attempted"); -+ TEST_COMPARE_STRING (strerrorname_np (EMULTIHOP), "EMULTIHOP"); -+#endif -+#ifdef ENODATA -+ TEST_COMPARE_STRING (strerrordesc_np (ENODATA), "No data available"); -+ TEST_COMPARE_STRING (strerrorname_np (ENODATA), "ENODATA"); -+#endif -+#ifdef ENOLINK -+ TEST_COMPARE_STRING (strerrordesc_np (ENOLINK), "Link has been severed"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOLINK), "ENOLINK"); -+#endif -+#ifdef ENOMSG -+ TEST_COMPARE_STRING (strerrordesc_np (ENOMSG), -+ "No message of desired type"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOMSG), "ENOMSG"); -+#endif -+#ifdef ENOSR -+ TEST_COMPARE_STRING (strerrordesc_np (ENOSR), "Out of streams resources"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOSR), "ENOSR"); -+#endif -+#ifdef ENOSTR -+ TEST_COMPARE_STRING (strerrordesc_np (ENOSTR), "Device not a stream"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOSTR), "ENOSTR"); -+#endif -+#ifdef EOVERFLOW -+ TEST_COMPARE_STRING (strerrordesc_np (EOVERFLOW), -+ "Value too large for defined data type"); -+ TEST_COMPARE_STRING (strerrorname_np (EOVERFLOW), "EOVERFLOW"); -+#endif -+#ifdef EPROTO -+ TEST_COMPARE_STRING (strerrordesc_np (EPROTO), "Protocol error"); -+ TEST_COMPARE_STRING (strerrorname_np (EPROTO), "EPROTO"); -+#endif -+#ifdef ETIME -+ TEST_COMPARE_STRING (strerrordesc_np (ETIME), "Timer expired"); -+ TEST_COMPARE_STRING (strerrorname_np (ETIME), "ETIME"); -+#endif -+#ifdef ECANCELED -+ TEST_COMPARE_STRING (strerrordesc_np (ECANCELED), "Operation canceled"); -+ TEST_COMPARE_STRING (strerrorname_np (ECANCELED), "ECANCELED"); -+#endif -+#ifdef EOWNERDEAD -+ TEST_COMPARE_STRING (strerrordesc_np (EOWNERDEAD), "Owner died"); -+ TEST_COMPARE_STRING (strerrorname_np (EOWNERDEAD), "EOWNERDEAD"); -+#endif -+#ifdef ENOTRECOVERABLE -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTRECOVERABLE), -+ "State not recoverable"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTRECOVERABLE), "ENOTRECOVERABLE"); -+#endif -+#ifdef ERESTART -+ TEST_COMPARE_STRING (strerrordesc_np (ERESTART), -+ "Interrupted system call should be restarted"); -+ TEST_COMPARE_STRING (strerrorname_np (ERESTART), "ERESTART"); -+#endif -+#ifdef ECHRNG -+ TEST_COMPARE_STRING (strerrordesc_np (ECHRNG), -+ "Channel number out of range"); -+ TEST_COMPARE_STRING (strerrorname_np (ECHRNG), "ECHRNG"); -+#endif -+#ifdef EL2NSYNC -+ TEST_COMPARE_STRING (strerrordesc_np (EL2NSYNC), -+ "Level 2 not synchronized"); -+ TEST_COMPARE_STRING (strerrorname_np (EL2NSYNC), "EL2NSYNC"); -+#endif -+#ifdef EL3HLT -+ TEST_COMPARE_STRING (strerrordesc_np (EL3HLT), "Level 3 halted"); -+ TEST_COMPARE_STRING (strerrorname_np (EL3HLT), "EL3HLT"); -+#endif -+#ifdef EL3RST -+ TEST_COMPARE_STRING (strerrordesc_np (EL3RST), "Level 3 reset"); -+ TEST_COMPARE_STRING (strerrorname_np (EL3RST), "EL3RST"); -+#endif -+#ifdef ELNRNG -+ TEST_COMPARE_STRING (strerrordesc_np (ELNRNG), "Link number out of range"); -+ TEST_COMPARE_STRING (strerrorname_np (ELNRNG), "ELNRNG"); -+#endif -+#ifdef EUNATCH -+ TEST_COMPARE_STRING (strerrordesc_np (EUNATCH), -+ "Protocol driver not attached"); -+ TEST_COMPARE_STRING (strerrorname_np (EUNATCH), "EUNATCH"); -+#endif -+#ifdef ENOCSI -+ TEST_COMPARE_STRING (strerrordesc_np (ENOCSI), -+ "No CSI structure available"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOCSI), "ENOCSI"); -+#endif -+#ifdef EL2HLT -+ TEST_COMPARE_STRING (strerrordesc_np (EL2HLT), "Level 2 halted"); -+ TEST_COMPARE_STRING (strerrorname_np (EL2HLT), "EL2HLT"); -+#endif -+#ifdef EBADE -+ TEST_COMPARE_STRING (strerrordesc_np (EBADE), "Invalid exchange"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADE), "EBADE"); -+#endif -+#ifdef EBADR -+ TEST_COMPARE_STRING (strerrordesc_np (EBADR), -+ "Invalid request descriptor"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADR), "EBADR"); -+#endif -+#ifdef EXFULL -+ TEST_COMPARE_STRING (strerrordesc_np (EXFULL), "Exchange full"); -+ TEST_COMPARE_STRING (strerrorname_np (EXFULL), "EXFULL"); -+#endif -+#ifdef ENOANO -+ TEST_COMPARE_STRING (strerrordesc_np (ENOANO), "No anode"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOANO), "ENOANO"); -+#endif -+#ifdef EBADRQC -+ TEST_COMPARE_STRING (strerrordesc_np (EBADRQC), "Invalid request code"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADRQC), "EBADRQC"); -+#endif -+#ifdef EBADSLT -+ TEST_COMPARE_STRING (strerrordesc_np (EBADSLT), "Invalid slot"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADSLT), "EBADSLT"); -+#endif -+#ifdef EBFONT -+ TEST_COMPARE_STRING (strerrordesc_np (EBFONT), "Bad font file format"); -+ TEST_COMPARE_STRING (strerrorname_np (EBFONT), "EBFONT"); -+#endif -+#ifdef ENONET -+ TEST_COMPARE_STRING (strerrordesc_np (ENONET), -+ "Machine is not on the network"); -+ TEST_COMPARE_STRING (strerrorname_np (ENONET), "ENONET"); -+#endif -+#ifdef ENOPKG -+ TEST_COMPARE_STRING (strerrordesc_np (ENOPKG), "Package not installed"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOPKG), "ENOPKG"); -+#endif -+#ifdef EADV -+ TEST_COMPARE_STRING (strerrordesc_np (EADV), "Advertise error"); -+ TEST_COMPARE_STRING (strerrorname_np (EADV), "EADV"); -+#endif -+#ifdef ESRMNT -+ TEST_COMPARE_STRING (strerrordesc_np (ESRMNT), "Srmount error"); -+ TEST_COMPARE_STRING (strerrorname_np (ESRMNT), "ESRMNT"); -+#endif -+#ifdef ECOMM -+ TEST_COMPARE_STRING (strerrordesc_np (ECOMM), -+ "Communication error on send"); -+ TEST_COMPARE_STRING (strerrorname_np (ECOMM), "ECOMM"); -+#endif -+#ifdef EDOTDOT -+ TEST_COMPARE_STRING (strerrordesc_np (EDOTDOT), "RFS specific error"); -+ TEST_COMPARE_STRING (strerrorname_np (EDOTDOT), "EDOTDOT"); -+#endif -+#ifdef ENOTUNIQ -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTUNIQ), -+ "Name not unique on network"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTUNIQ), "ENOTUNIQ"); -+#endif -+#ifdef EBADFD -+ TEST_COMPARE_STRING (strerrordesc_np (EBADFD), -+ "File descriptor in bad state"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADFD), "EBADFD"); -+#endif -+#ifdef EREMCHG -+ TEST_COMPARE_STRING (strerrordesc_np (EREMCHG), "Remote address changed"); -+ TEST_COMPARE_STRING (strerrorname_np (EREMCHG), "EREMCHG"); -+#endif -+#ifdef ELIBACC -+ TEST_COMPARE_STRING (strerrordesc_np (ELIBACC), -+ "Can not access a needed shared library"); -+ TEST_COMPARE_STRING (strerrorname_np (ELIBACC), "ELIBACC"); -+#endif -+#ifdef ELIBBAD -+ TEST_COMPARE_STRING (strerrordesc_np (ELIBBAD), -+ "Accessing a corrupted shared library"); -+ TEST_COMPARE_STRING (strerrorname_np (ELIBBAD), "ELIBBAD"); -+#endif -+#ifdef ELIBSCN -+ TEST_COMPARE_STRING (strerrordesc_np (ELIBSCN), -+ ".lib section in a.out corrupted"); -+ TEST_COMPARE_STRING (strerrorname_np (ELIBSCN), "ELIBSCN"); -+#endif -+#ifdef ELIBMAX -+ TEST_COMPARE_STRING (strerrordesc_np (ELIBMAX), -+ "Attempting to link in too many shared libraries"); -+ TEST_COMPARE_STRING (strerrorname_np (ELIBMAX), "ELIBMAX"); -+#endif -+#ifdef ELIBEXEC -+ TEST_COMPARE_STRING (strerrordesc_np (ELIBEXEC), -+ "Cannot exec a shared library directly"); -+ TEST_COMPARE_STRING (strerrorname_np (ELIBEXEC), "ELIBEXEC"); -+#endif -+#ifdef ESTRPIPE -+ TEST_COMPARE_STRING (strerrordesc_np (ESTRPIPE), "Streams pipe error"); -+ TEST_COMPARE_STRING (strerrorname_np (ESTRPIPE), "ESTRPIPE"); -+#endif -+#ifdef EUCLEAN -+ TEST_COMPARE_STRING (strerrordesc_np (EUCLEAN), -+ "Structure needs cleaning"); -+ TEST_COMPARE_STRING (strerrorname_np (EUCLEAN), "EUCLEAN"); -+#endif -+#ifdef ENOTNAM -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTNAM), -+ "Not a XENIX named type file"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTNAM), "ENOTNAM"); -+#endif -+#ifdef ENAVAIL -+ TEST_COMPARE_STRING (strerrordesc_np (ENAVAIL), -+ "No XENIX semaphores available"); -+ TEST_COMPARE_STRING (strerrorname_np (ENAVAIL), "ENAVAIL"); -+#endif -+#ifdef EISNAM -+ TEST_COMPARE_STRING (strerrordesc_np (EISNAM), "Is a named type file"); -+ TEST_COMPARE_STRING (strerrorname_np (EISNAM), "EISNAM"); -+#endif -+#ifdef EREMOTEIO -+ TEST_COMPARE_STRING (strerrordesc_np (EREMOTEIO), "Remote I/O error"); -+ TEST_COMPARE_STRING (strerrorname_np (EREMOTEIO), "EREMOTEIO"); -+#endif -+#ifdef ENOMEDIUM -+ TEST_COMPARE_STRING (strerrordesc_np (ENOMEDIUM), "No medium found"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOMEDIUM), "ENOMEDIUM"); -+#endif -+#ifdef EMEDIUMTYPE -+ TEST_COMPARE_STRING (strerrordesc_np (EMEDIUMTYPE), "Wrong medium type"); -+ TEST_COMPARE_STRING (strerrorname_np (EMEDIUMTYPE), "EMEDIUMTYPE"); -+#endif -+#ifdef ENOKEY -+ TEST_COMPARE_STRING (strerrordesc_np (ENOKEY), -+ "Required key not available"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOKEY), "ENOKEY"); -+#endif -+#ifdef EKEYEXPIRED -+ TEST_COMPARE_STRING (strerrordesc_np (EKEYEXPIRED), "Key has expired"); -+ TEST_COMPARE_STRING (strerrorname_np (EKEYEXPIRED), "EKEYEXPIRED"); -+#endif -+#ifdef EKEYREVOKED -+ TEST_COMPARE_STRING (strerrordesc_np (EKEYREVOKED), -+ "Key has been revoked"); -+ TEST_COMPARE_STRING (strerrorname_np (EKEYREVOKED), "EKEYREVOKED"); -+#endif -+#ifdef EKEYREJECTED -+ TEST_COMPARE_STRING (strerrordesc_np (EKEYREJECTED), -+ "Key was rejected by service"); -+ TEST_COMPARE_STRING (strerrorname_np (EKEYREJECTED), "EKEYREJECTED"); -+#endif -+#ifdef ERFKILL -+ TEST_COMPARE_STRING (strerrordesc_np (ERFKILL), -+ "Operation not possible due to RF-kill"); -+ TEST_COMPARE_STRING (strerrorname_np (ERFKILL), "ERFKILL"); -+#endif -+#ifdef EHWPOISON -+ TEST_COMPARE_STRING (strerrordesc_np (EHWPOISON), -+ "Memory page has hardware error"); -+ TEST_COMPARE_STRING (strerrorname_np (EHWPOISON), "EHWPOISON"); -+#endif -+#ifdef EBADRPC -+ TEST_COMPARE_STRING (strerrordesc_np (EBADRPC), "RPC struct is bad"); -+ TEST_COMPARE_STRING (strerrorname_np (EBADRPC), "EBADRPC"); -+#endif -+#ifdef EFTYPE -+ TEST_COMPARE_STRING (strerrordesc_np (EFTYPE), -+ "Inappropriate file type or format"); -+ TEST_COMPARE_STRING (strerrorname_np (EFTYPE), "EFTYPE"); -+#endif -+#ifdef EPROCUNAVAIL -+ TEST_COMPARE_STRING (strerrordesc_np (EPROCUNAVAIL), -+ "RPC bad procedure for program"); -+ TEST_COMPARE_STRING (strerrorname_np (EPROCUNAVAIL), "EPROCUNAVAIL"); -+#endif -+#ifdef EAUTH -+ TEST_COMPARE_STRING (strerrordesc_np (EAUTH), "Authentication error"); -+ TEST_COMPARE_STRING (strerrorname_np (EAUTH), "EAUTH"); -+#endif -+#ifdef EDIED -+ TEST_COMPARE_STRING (strerrordesc_np (EDIED), "Translator died"); -+ TEST_COMPARE_STRING (strerrorname_np (EDIED), "EDIED"); -+#endif -+#ifdef ERPCMISMATCH -+ TEST_COMPARE_STRING (strerrordesc_np (ERPCMISMATCH), "RPC version wrong"); -+ TEST_COMPARE_STRING (strerrorname_np (ERPCMISMATCH), "ERPCMISMATCH"); -+#endif -+#ifdef EGREGIOUS -+ TEST_COMPARE_STRING (strerrordesc_np (EGREGIOUS), -+ "You really blew it this time"); -+ TEST_COMPARE_STRING (strerrorname_np (EGREGIOUS), "EGREGIOUS"); -+#endif -+#ifdef EPROCLIM -+ TEST_COMPARE_STRING (strerrordesc_np (EPROCLIM), "Too many processes"); -+ TEST_COMPARE_STRING (strerrorname_np (EPROCLIM), "EPROCLIM"); -+#endif -+#ifdef EGRATUITOUS -+ TEST_COMPARE_STRING (strerrordesc_np (EGRATUITOUS), "Gratuitous error"); -+ TEST_COMPARE_STRING (strerrorname_np (EGRATUITOUS), "EGRATUITOUS"); -+#endif -+#if defined (ENOTSUP) && ENOTSUP != EOPNOTSUPP -+ TEST_COMPARE_STRING (strerrordesc_np (ENOTSUP), "Not supported"); -+ TEST_COMPARE_STRING (strerrorname_np (ENOTSUP), "ENOTSUP"); -+#endif -+#ifdef EPROGMISMATCH -+ TEST_COMPARE_STRING (strerrordesc_np (EPROGMISMATCH), -+ "RPC program version wrong"); -+ TEST_COMPARE_STRING (strerrorname_np (EPROGMISMATCH), "EPROGMISMATCH"); -+#endif -+#ifdef EBACKGROUND -+ TEST_COMPARE_STRING (strerrordesc_np (EBACKGROUND), -+ "Inappropriate operation for background process"); -+ TEST_COMPARE_STRING (strerrorname_np (EBACKGROUND), "EBACKGROUND"); -+#endif -+#ifdef EIEIO -+ TEST_COMPARE_STRING (strerrordesc_np (EIEIO), "Computer bought the farm"); -+ TEST_COMPARE_STRING (strerrorname_np (EIEIO), "EIEIO"); -+#endif -+#if defined (EWOULDBLOCK) && EWOULDBLOCK != EAGAIN -+ TEST_COMPARE_STRING (strerrordesc_np (EWOULDBLOCK), -+ "Operation would block"); -+ TEST_COMPARE_STRING (strerrorname_np (EWOULDBLOCK), "EWOULDBLOCK"); -+#endif -+#ifdef ENEEDAUTH -+ TEST_COMPARE_STRING (strerrordesc_np (ENEEDAUTH), "Need authenticator"); -+ TEST_COMPARE_STRING (strerrorname_np (ENEEDAUTH), "ENEEDAUTH"); -+#endif -+#ifdef ED -+ TEST_COMPARE_STRING (strerrordesc_np (ED), "?"); -+ TEST_COMPARE_STRING (strerrorname_np (ED), "ED"); -+#endif -+#ifdef EPROGUNAVAIL -+ TEST_COMPARE_STRING (strerrordesc_np (EPROGUNAVAIL), -+ "RPC program not available"); -+ TEST_COMPARE_STRING (strerrorname_np (EPROGUNAVAIL), "EPROGUNAVAIL"); -+#endif - - return 0; - } -Index: glibc-2.32/sysdeps/gnu/errlist.h -=================================================================== ---- glibc-2.32.orig/sysdeps/gnu/errlist.h -+++ glibc-2.32/sysdeps/gnu/errlist.h -@@ -1,24 +1,21 @@ --#ifndef ERR_MAP --#define ERR_MAP(value) value --#endif --_S(ERR_MAP(0), N_("Success")) -+_S(0, N_("Success")) - #ifdef EPERM - /* - TRANS Only the owner of the file (or other resource) - TRANS or processes with special privileges can perform the operation. */ --_S(ERR_MAP(EPERM), N_("Operation not permitted")) -+_S(EPERM, N_("Operation not permitted")) - #endif - #ifdef ENOENT - /* - TRANS This is a ``file doesn't exist'' error - TRANS for ordinary files that are referenced in contexts where they are - TRANS expected to already exist. */ --_S(ERR_MAP(ENOENT), N_("No such file or directory")) -+_S(ENOENT, N_("No such file or directory")) - #endif - #ifdef ESRCH - /* - TRANS No process matches the specified process ID. */ --_S(ERR_MAP(ESRCH), N_("No such process")) -+_S(ESRCH, N_("No such process")) - #endif - #ifdef EINTR - /* -@@ -29,12 +26,12 @@ TRANS - TRANS You can choose to have functions resume after a signal that is handled, - TRANS rather than failing with @code{EINTR}; see @ref{Interrupted - TRANS Primitives}. */ --_S(ERR_MAP(EINTR), N_("Interrupted system call")) -+_S(EINTR, N_("Interrupted system call")) - #endif - #ifdef EIO - /* - TRANS Usually used for physical read or write errors. */ --_S(ERR_MAP(EIO), N_("Input/output error")) -+_S(EIO, N_("Input/output error")) - #endif - #ifdef ENXIO - /* -@@ -43,7 +40,7 @@ TRANS represented by a file you specifie - TRANS This can mean that the device file was installed incorrectly, or that - TRANS the physical device is missing or not correctly attached to the - TRANS computer. */ --_S(ERR_MAP(ENXIO), N_("No such device or address")) -+_S(ENXIO, N_("No such device or address")) - #endif - #ifdef E2BIG - /* -@@ -51,27 +48,27 @@ TRANS Used when the arguments passed to - TRANS being executed with one of the @code{exec} functions (@pxref{Executing a - TRANS File}) occupy too much memory space. This condition never arises on - TRANS @gnuhurdsystems{}. */ --_S(ERR_MAP(E2BIG), N_("Argument list too long")) -+_S(E2BIG, N_("Argument list too long")) - #endif - #ifdef ENOEXEC - /* - TRANS Invalid executable file format. This condition is detected by the - TRANS @code{exec} functions; see @ref{Executing a File}. */ --_S(ERR_MAP(ENOEXEC), N_("Exec format error")) -+_S(ENOEXEC, N_("Exec format error")) - #endif - #ifdef EBADF - /* - TRANS For example, I/O on a descriptor that has been - TRANS closed or reading from a descriptor open only for writing (or vice - TRANS versa). */ --_S(ERR_MAP(EBADF), N_("Bad file descriptor")) -+_S(EBADF, N_("Bad file descriptor")) - #endif - #ifdef ECHILD - /* - TRANS This error happens on operations that are - TRANS supposed to manipulate child processes, when there aren't any processes - TRANS to manipulate. */ --_S(ERR_MAP(ECHILD), N_("No child processes")) -+_S(ECHILD, N_("No child processes")) - #endif - #ifdef EDEADLK - /* -@@ -79,74 +76,74 @@ TRANS Allocating a system resource would - TRANS deadlock situation. The system does not guarantee that it will notice - TRANS all such situations. This error means you got lucky and the system - TRANS noticed; it might just hang. @xref{File Locks}, for an example. */ --_S(ERR_MAP(EDEADLK), N_("Resource deadlock avoided")) -+_S(EDEADLK, N_("Resource deadlock avoided")) - #endif - #ifdef ENOMEM - /* - TRANS The system cannot allocate more virtual memory - TRANS because its capacity is full. */ --_S(ERR_MAP(ENOMEM), N_("Cannot allocate memory")) -+_S(ENOMEM, N_("Cannot allocate memory")) - #endif - #ifdef EACCES - /* - TRANS The file permissions do not allow the attempted operation. */ --_S(ERR_MAP(EACCES), N_("Permission denied")) -+_S(EACCES, N_("Permission denied")) - #endif - #ifdef EFAULT - /* - TRANS An invalid pointer was detected. - TRANS On @gnuhurdsystems{}, this error never happens; you get a signal instead. */ --_S(ERR_MAP(EFAULT), N_("Bad address")) -+_S(EFAULT, N_("Bad address")) - #endif - #ifdef ENOTBLK - /* - TRANS A file that isn't a block special file was given in a situation that - TRANS requires one. For example, trying to mount an ordinary file as a file - TRANS system in Unix gives this error. */ --_S(ERR_MAP(ENOTBLK), N_("Block device required")) -+_S(ENOTBLK, N_("Block device required")) - #endif - #ifdef EBUSY - /* - TRANS A system resource that can't be shared is already in use. - TRANS For example, if you try to delete a file that is the root of a currently - TRANS mounted filesystem, you get this error. */ --_S(ERR_MAP(EBUSY), N_("Device or resource busy")) -+_S(EBUSY, N_("Device or resource busy")) - #endif - #ifdef EEXIST - /* - TRANS An existing file was specified in a context where it only - TRANS makes sense to specify a new file. */ --_S(ERR_MAP(EEXIST), N_("File exists")) -+_S(EEXIST, N_("File exists")) - #endif - #ifdef EXDEV - /* - TRANS An attempt to make an improper link across file systems was detected. - TRANS This happens not only when you use @code{link} (@pxref{Hard Links}) but - TRANS also when you rename a file with @code{rename} (@pxref{Renaming Files}). */ --_S(ERR_MAP(EXDEV), N_("Invalid cross-device link")) -+_S(EXDEV, N_("Invalid cross-device link")) - #endif - #ifdef ENODEV - /* - TRANS The wrong type of device was given to a function that expects a - TRANS particular sort of device. */ --_S(ERR_MAP(ENODEV), N_("No such device")) -+_S(ENODEV, N_("No such device")) - #endif - #ifdef ENOTDIR - /* - TRANS A file that isn't a directory was specified when a directory is required. */ --_S(ERR_MAP(ENOTDIR), N_("Not a directory")) -+_S(ENOTDIR, N_("Not a directory")) - #endif - #ifdef EISDIR - /* - TRANS You cannot open a directory for writing, - TRANS or create or remove hard links to it. */ --_S(ERR_MAP(EISDIR), N_("Is a directory")) -+_S(EISDIR, N_("Is a directory")) - #endif - #ifdef EINVAL - /* - TRANS This is used to indicate various kinds of problems - TRANS with passing the wrong argument to a library function. */ --_S(ERR_MAP(EINVAL), N_("Invalid argument")) -+_S(EINVAL, N_("Invalid argument")) - #endif - #ifdef EMFILE - /* -@@ -157,20 +154,20 @@ TRANS In BSD and GNU, the number of open - TRANS limit that can usually be increased. If you get this error, you might - TRANS want to increase the @code{RLIMIT_NOFILE} limit or make it unlimited; - TRANS @pxref{Limits on Resources}. */ --_S(ERR_MAP(EMFILE), N_("Too many open files")) -+_S(EMFILE, N_("Too many open files")) - #endif - #ifdef ENFILE - /* - TRANS There are too many distinct file openings in the entire system. Note - TRANS that any number of linked channels count as just one file opening; see - TRANS @ref{Linked Channels}. This error never occurs on @gnuhurdsystems{}. */ --_S(ERR_MAP(ENFILE), N_("Too many open files in system")) -+_S(ENFILE, N_("Too many open files in system")) - #endif - #ifdef ENOTTY - /* - TRANS Inappropriate I/O control operation, such as trying to set terminal - TRANS modes on an ordinary file. */ --_S(ERR_MAP(ENOTTY), N_("Inappropriate ioctl for device")) -+_S(ENOTTY, N_("Inappropriate ioctl for device")) - #endif - #ifdef ETXTBSY - /* -@@ -179,35 +176,35 @@ TRANS write to a file that is currently - TRANS debugger to run a program is considered having it open for writing and - TRANS will cause this error. (The name stands for ``text file busy''.) This - TRANS is not an error on @gnuhurdsystems{}; the text is copied as necessary. */ --_S(ERR_MAP(ETXTBSY), N_("Text file busy")) -+_S(ETXTBSY, N_("Text file busy")) - #endif - #ifdef EFBIG - /* - TRANS The size of a file would be larger than allowed by the system. */ --_S(ERR_MAP(EFBIG), N_("File too large")) -+_S(EFBIG, N_("File too large")) - #endif - #ifdef ENOSPC - /* - TRANS Write operation on a file failed because the - TRANS disk is full. */ --_S(ERR_MAP(ENOSPC), N_("No space left on device")) -+_S(ENOSPC, N_("No space left on device")) - #endif - #ifdef ESPIPE - /* - TRANS Invalid seek operation (such as on a pipe). */ --_S(ERR_MAP(ESPIPE), N_("Illegal seek")) -+_S(ESPIPE, N_("Illegal seek")) - #endif - #ifdef EROFS - /* - TRANS An attempt was made to modify something on a read-only file system. */ --_S(ERR_MAP(EROFS), N_("Read-only file system")) -+_S(EROFS, N_("Read-only file system")) - #endif - #ifdef EMLINK - /* - TRANS The link count of a single file would become too large. - TRANS @code{rename} can cause this error if the file being renamed already has - TRANS as many links as it can take (@pxref{Renaming Files}). */ --_S(ERR_MAP(EMLINK), N_("Too many links")) -+_S(EMLINK, N_("Too many links")) - #endif - #ifdef EPIPE - /* -@@ -216,19 +213,19 @@ TRANS Every library function that return - TRANS @code{SIGPIPE} signal; this signal terminates the program if not handled - TRANS or blocked. Thus, your program will never actually see @code{EPIPE} - TRANS unless it has handled or blocked @code{SIGPIPE}. */ --_S(ERR_MAP(EPIPE), N_("Broken pipe")) -+_S(EPIPE, N_("Broken pipe")) - #endif - #ifdef EDOM - /* - TRANS Used by mathematical functions when an argument value does - TRANS not fall into the domain over which the function is defined. */ --_S(ERR_MAP(EDOM), N_("Numerical argument out of domain")) -+_S(EDOM, N_("Numerical argument out of domain")) - #endif - #ifdef ERANGE - /* - TRANS Used by mathematical functions when the result value is - TRANS not representable because of overflow or underflow. */ --_S(ERR_MAP(ERANGE), N_("Numerical result out of range")) -+_S(ERANGE, N_("Numerical result out of range")) - #endif - #ifdef EAGAIN - /* -@@ -261,7 +258,7 @@ TRANS Such shortages are usually fairly - TRANS so usually an interactive program should report the error to the user - TRANS and return to its command loop. - TRANS @end itemize */ --_S(ERR_MAP(EAGAIN), N_("Resource temporarily unavailable")) -+_S(EAGAIN, N_("Resource temporarily unavailable")) - #endif - #ifdef EINPROGRESS - /* -@@ -273,47 +270,47 @@ TRANS the operation has begun and will t - TRANS the object before the call completes return @code{EALREADY}. You can - TRANS use the @code{select} function to find out when the pending operation - TRANS has completed; @pxref{Waiting for I/O}. */ --_S(ERR_MAP(EINPROGRESS), N_("Operation now in progress")) -+_S(EINPROGRESS, N_("Operation now in progress")) - #endif - #ifdef EALREADY - /* - TRANS An operation is already in progress on an object that has non-blocking - TRANS mode selected. */ --_S(ERR_MAP(EALREADY), N_("Operation already in progress")) -+_S(EALREADY, N_("Operation already in progress")) - #endif - #ifdef ENOTSOCK - /* - TRANS A file that isn't a socket was specified when a socket is required. */ --_S(ERR_MAP(ENOTSOCK), N_("Socket operation on non-socket")) -+_S(ENOTSOCK, N_("Socket operation on non-socket")) - #endif - #ifdef EMSGSIZE - /* - TRANS The size of a message sent on a socket was larger than the supported - TRANS maximum size. */ --_S(ERR_MAP(EMSGSIZE), N_("Message too long")) -+_S(EMSGSIZE, N_("Message too long")) - #endif - #ifdef EPROTOTYPE - /* - TRANS The socket type does not support the requested communications protocol. */ --_S(ERR_MAP(EPROTOTYPE), N_("Protocol wrong type for socket")) -+_S(EPROTOTYPE, N_("Protocol wrong type for socket")) - #endif - #ifdef ENOPROTOOPT - /* - TRANS You specified a socket option that doesn't make sense for the - TRANS particular protocol being used by the socket. @xref{Socket Options}. */ --_S(ERR_MAP(ENOPROTOOPT), N_("Protocol not available")) -+_S(ENOPROTOOPT, N_("Protocol not available")) - #endif - #ifdef EPROTONOSUPPORT - /* - TRANS The socket domain does not support the requested communications protocol - TRANS (perhaps because the requested protocol is completely invalid). - TRANS @xref{Creating a Socket}. */ --_S(ERR_MAP(EPROTONOSUPPORT), N_("Protocol not supported")) -+_S(EPROTONOSUPPORT, N_("Protocol not supported")) - #endif - #ifdef ESOCKTNOSUPPORT - /* - TRANS The socket type is not supported. */ --_S(ERR_MAP(ESOCKTNOSUPPORT), N_("Socket type not supported")) -+_S(ESOCKTNOSUPPORT, N_("Socket type not supported")) - #endif - #ifdef EOPNOTSUPP - /* -@@ -323,71 +320,71 @@ TRANS implemented for all communications - TRANS error can happen for many calls when the object does not support the - TRANS particular operation; it is a generic indication that the server knows - TRANS nothing to do for that call. */ --_S(ERR_MAP(EOPNOTSUPP), N_("Operation not supported")) -+_S(EOPNOTSUPP, N_("Operation not supported")) - #endif - #ifdef EPFNOSUPPORT - /* - TRANS The socket communications protocol family you requested is not supported. */ --_S(ERR_MAP(EPFNOSUPPORT), N_("Protocol family not supported")) -+_S(EPFNOSUPPORT, N_("Protocol family not supported")) - #endif - #ifdef EAFNOSUPPORT - /* - TRANS The address family specified for a socket is not supported; it is - TRANS inconsistent with the protocol being used on the socket. @xref{Sockets}. */ --_S(ERR_MAP(EAFNOSUPPORT), N_("Address family not supported by protocol")) -+_S(EAFNOSUPPORT, N_("Address family not supported by protocol")) - #endif - #ifdef EADDRINUSE - /* - TRANS The requested socket address is already in use. @xref{Socket Addresses}. */ --_S(ERR_MAP(EADDRINUSE), N_("Address already in use")) -+_S(EADDRINUSE, N_("Address already in use")) - #endif - #ifdef EADDRNOTAVAIL - /* - TRANS The requested socket address is not available; for example, you tried - TRANS to give a socket a name that doesn't match the local host name. - TRANS @xref{Socket Addresses}. */ --_S(ERR_MAP(EADDRNOTAVAIL), N_("Cannot assign requested address")) -+_S(EADDRNOTAVAIL, N_("Cannot assign requested address")) - #endif - #ifdef ENETDOWN - /* - TRANS A socket operation failed because the network was down. */ --_S(ERR_MAP(ENETDOWN), N_("Network is down")) -+_S(ENETDOWN, N_("Network is down")) - #endif - #ifdef ENETUNREACH - /* - TRANS A socket operation failed because the subnet containing the remote host - TRANS was unreachable. */ --_S(ERR_MAP(ENETUNREACH), N_("Network is unreachable")) -+_S(ENETUNREACH, N_("Network is unreachable")) - #endif - #ifdef ENETRESET - /* - TRANS A network connection was reset because the remote host crashed. */ --_S(ERR_MAP(ENETRESET), N_("Network dropped connection on reset")) -+_S(ENETRESET, N_("Network dropped connection on reset")) - #endif - #ifdef ECONNABORTED - /* - TRANS A network connection was aborted locally. */ --_S(ERR_MAP(ECONNABORTED), N_("Software caused connection abort")) -+_S(ECONNABORTED, N_("Software caused connection abort")) - #endif - #ifdef ECONNRESET - /* - TRANS A network connection was closed for reasons outside the control of the - TRANS local host, such as by the remote machine rebooting or an unrecoverable - TRANS protocol violation. */ --_S(ERR_MAP(ECONNRESET), N_("Connection reset by peer")) -+_S(ECONNRESET, N_("Connection reset by peer")) - #endif - #ifdef ENOBUFS - /* - TRANS The kernel's buffers for I/O operations are all in use. In GNU, this - TRANS error is always synonymous with @code{ENOMEM}; you may get one or the - TRANS other from network operations. */ --_S(ERR_MAP(ENOBUFS), N_("No buffer space available")) -+_S(ENOBUFS, N_("No buffer space available")) - #endif - #ifdef EISCONN - /* - TRANS You tried to connect a socket that is already connected. - TRANS @xref{Connecting}. */ --_S(ERR_MAP(EISCONN), N_("Transport endpoint is already connected")) -+_S(EISCONN, N_("Transport endpoint is already connected")) - #endif - #ifdef ENOTCONN - /* -@@ -395,74 +392,74 @@ TRANS The socket is not connected to any - TRANS try to transmit data over a socket, without first specifying a - TRANS destination for the data. For a connectionless socket (for datagram - TRANS protocols, such as UDP), you get @code{EDESTADDRREQ} instead. */ --_S(ERR_MAP(ENOTCONN), N_("Transport endpoint is not connected")) -+_S(ENOTCONN, N_("Transport endpoint is not connected")) - #endif - #ifdef EDESTADDRREQ - /* - TRANS No default destination address was set for the socket. You get this - TRANS error when you try to transmit data over a connectionless socket, - TRANS without first specifying a destination for the data with @code{connect}. */ --_S(ERR_MAP(EDESTADDRREQ), N_("Destination address required")) -+_S(EDESTADDRREQ, N_("Destination address required")) - #endif - #ifdef ESHUTDOWN - /* - TRANS The socket has already been shut down. */ --_S(ERR_MAP(ESHUTDOWN), N_("Cannot send after transport endpoint shutdown")) -+_S(ESHUTDOWN, N_("Cannot send after transport endpoint shutdown")) - #endif - #ifdef ETOOMANYREFS --_S(ERR_MAP(ETOOMANYREFS), N_("Too many references: cannot splice")) -+_S(ETOOMANYREFS, N_("Too many references: cannot splice")) - #endif - #ifdef ETIMEDOUT - /* - TRANS A socket operation with a specified timeout received no response during - TRANS the timeout period. */ --_S(ERR_MAP(ETIMEDOUT), N_("Connection timed out")) -+_S(ETIMEDOUT, N_("Connection timed out")) - #endif - #ifdef ECONNREFUSED - /* - TRANS A remote host refused to allow the network connection (typically because - TRANS it is not running the requested service). */ --_S(ERR_MAP(ECONNREFUSED), N_("Connection refused")) -+_S(ECONNREFUSED, N_("Connection refused")) - #endif - #ifdef ELOOP - /* - TRANS Too many levels of symbolic links were encountered in looking up a file name. - TRANS This often indicates a cycle of symbolic links. */ --_S(ERR_MAP(ELOOP), N_("Too many levels of symbolic links")) -+_S(ELOOP, N_("Too many levels of symbolic links")) - #endif - #ifdef ENAMETOOLONG - /* - TRANS Filename too long (longer than @code{PATH_MAX}; @pxref{Limits for - TRANS Files}) or host name too long (in @code{gethostname} or - TRANS @code{sethostname}; @pxref{Host Identification}). */ --_S(ERR_MAP(ENAMETOOLONG), N_("File name too long")) -+_S(ENAMETOOLONG, N_("File name too long")) - #endif - #ifdef EHOSTDOWN - /* - TRANS The remote host for a requested network connection is down. */ --_S(ERR_MAP(EHOSTDOWN), N_("Host is down")) -+_S(EHOSTDOWN, N_("Host is down")) - #endif - /* - TRANS The remote host for a requested network connection is not reachable. */ - #ifdef EHOSTUNREACH --_S(ERR_MAP(EHOSTUNREACH), N_("No route to host")) -+_S(EHOSTUNREACH, N_("No route to host")) - #endif - #ifdef ENOTEMPTY - /* - TRANS Directory not empty, where an empty directory was expected. Typically, - TRANS this error occurs when you are trying to delete a directory. */ --_S(ERR_MAP(ENOTEMPTY), N_("Directory not empty")) -+_S(ENOTEMPTY, N_("Directory not empty")) - #endif - #ifdef EUSERS - /* - TRANS The file quota system is confused because there are too many users. - TRANS @c This can probably happen in a GNU system when using NFS. */ --_S(ERR_MAP(EUSERS), N_("Too many users")) -+_S(EUSERS, N_("Too many users")) - #endif - #ifdef EDQUOT - /* - TRANS The user's disk quota was exceeded. */ --_S(ERR_MAP(EDQUOT), N_("Disk quota exceeded")) -+_S(EDQUOT, N_("Disk quota exceeded")) - #endif - #ifdef ESTALE - /* -@@ -471,7 +468,7 @@ TRANS file system which is due to file s - TRANS for NFS file systems or corruption in other file systems. - TRANS Repairing this condition usually requires unmounting, possibly repairing - TRANS and remounting the file system. */ --_S(ERR_MAP(ESTALE), N_("Stale file handle")) -+_S(ESTALE, N_("Stale file handle")) - #endif - #ifdef EREMOTE - /* -@@ -479,7 +476,7 @@ TRANS An attempt was made to NFS-mount a - TRANS already specifies an NFS-mounted file. - TRANS (This is an error on some operating systems, but we expect it to work - TRANS properly on @gnuhurdsystems{}, making this error code impossible.) */ --_S(ERR_MAP(EREMOTE), N_("Object is remote")) -+_S(EREMOTE, N_("Object is remote")) - #endif - #ifdef ENOLCK - /* -@@ -487,7 +484,7 @@ TRANS This is used by the file locking f - TRANS @ref{File Locks}. This error is never generated by @gnuhurdsystems{}, but - TRANS it can result from an operation to an NFS server running another - TRANS operating system. */ --_S(ERR_MAP(ENOLCK), N_("No locks available")) -+_S(ENOLCK, N_("No locks available")) - #endif - #ifdef ENOSYS - /* -@@ -496,46 +493,46 @@ TRANS not implemented at all, either in - TRANS operating system. When you get this error, you can be sure that this - TRANS particular function will always fail with @code{ENOSYS} unless you - TRANS install a new version of the C library or the operating system. */ --_S(ERR_MAP(ENOSYS), N_("Function not implemented")) -+_S(ENOSYS, N_("Function not implemented")) - #endif - #ifdef EILSEQ - /* - TRANS While decoding a multibyte character the function came along an invalid - TRANS or an incomplete sequence of bytes or the given wide character is invalid. */ --_S(ERR_MAP(EILSEQ), N_("Invalid or incomplete multibyte or wide character")) -+_S(EILSEQ, N_("Invalid or incomplete multibyte or wide character")) - #endif - #ifdef EBADMSG --_S(ERR_MAP(EBADMSG), N_("Bad message")) -+_S(EBADMSG, N_("Bad message")) - #endif - #ifdef EIDRM --_S(ERR_MAP(EIDRM), N_("Identifier removed")) -+_S(EIDRM, N_("Identifier removed")) - #endif - #ifdef EMULTIHOP --_S(ERR_MAP(EMULTIHOP), N_("Multihop attempted")) -+_S(EMULTIHOP, N_("Multihop attempted")) - #endif - #ifdef ENODATA --_S(ERR_MAP(ENODATA), N_("No data available")) -+_S(ENODATA, N_("No data available")) - #endif - #ifdef ENOLINK --_S(ERR_MAP(ENOLINK), N_("Link has been severed")) -+_S(ENOLINK, N_("Link has been severed")) - #endif - #ifdef ENOMSG --_S(ERR_MAP(ENOMSG), N_("No message of desired type")) -+_S(ENOMSG, N_("No message of desired type")) - #endif - #ifdef ENOSR --_S(ERR_MAP(ENOSR), N_("Out of streams resources")) -+_S(ENOSR, N_("Out of streams resources")) - #endif - #ifdef ENOSTR --_S(ERR_MAP(ENOSTR), N_("Device not a stream")) -+_S(ENOSTR, N_("Device not a stream")) - #endif - #ifdef EOVERFLOW --_S(ERR_MAP(EOVERFLOW), N_("Value too large for defined data type")) -+_S(EOVERFLOW, N_("Value too large for defined data type")) - #endif - #ifdef EPROTO --_S(ERR_MAP(EPROTO), N_("Protocol error")) -+_S(EPROTO, N_("Protocol error")) - #endif - #ifdef ETIME --_S(ERR_MAP(ETIME), N_("Timer expired")) -+_S(ETIME, N_("Timer expired")) - #endif - #ifdef ECANCELED - /* -@@ -543,148 +540,148 @@ TRANS An asynchronous operation was canc - TRANS completed. @xref{Asynchronous I/O}. When you call @code{aio_cancel}, - TRANS the normal result is for the operations affected to complete with this - TRANS error; @pxref{Cancel AIO Operations}. */ --_S(ERR_MAP(ECANCELED), N_("Operation canceled")) -+_S(ECANCELED, N_("Operation canceled")) - #endif - #ifdef EOWNERDEAD --_S(ERR_MAP(EOWNERDEAD), N_("Owner died")) -+_S(EOWNERDEAD, N_("Owner died")) - #endif - #ifdef ENOTRECOVERABLE --_S(ERR_MAP(ENOTRECOVERABLE), N_("State not recoverable")) -+_S(ENOTRECOVERABLE, N_("State not recoverable")) - #endif - #ifdef ERESTART --_S(ERR_MAP(ERESTART), N_("Interrupted system call should be restarted")) -+_S(ERESTART, N_("Interrupted system call should be restarted")) - #endif - #ifdef ECHRNG --_S(ERR_MAP(ECHRNG), N_("Channel number out of range")) -+_S(ECHRNG, N_("Channel number out of range")) - #endif - #ifdef EL2NSYNC --_S(ERR_MAP(EL2NSYNC), N_("Level 2 not synchronized")) -+_S(EL2NSYNC, N_("Level 2 not synchronized")) - #endif - #ifdef EL3HLT --_S(ERR_MAP(EL3HLT), N_("Level 3 halted")) -+_S(EL3HLT, N_("Level 3 halted")) - #endif - #ifdef EL3RST --_S(ERR_MAP(EL3RST), N_("Level 3 reset")) -+_S(EL3RST, N_("Level 3 reset")) - #endif - #ifdef ELNRNG --_S(ERR_MAP(ELNRNG), N_("Link number out of range")) -+_S(ELNRNG, N_("Link number out of range")) - #endif - #ifdef EUNATCH --_S(ERR_MAP(EUNATCH), N_("Protocol driver not attached")) -+_S(EUNATCH, N_("Protocol driver not attached")) - #endif - #ifdef ENOCSI --_S(ERR_MAP(ENOCSI), N_("No CSI structure available")) -+_S(ENOCSI, N_("No CSI structure available")) - #endif - #ifdef EL2HLT --_S(ERR_MAP(EL2HLT), N_("Level 2 halted")) -+_S(EL2HLT, N_("Level 2 halted")) - #endif - #ifdef EBADE --_S(ERR_MAP(EBADE), N_("Invalid exchange")) -+_S(EBADE, N_("Invalid exchange")) - #endif - #ifdef EBADR --_S(ERR_MAP(EBADR), N_("Invalid request descriptor")) -+_S(EBADR, N_("Invalid request descriptor")) - #endif - #ifdef EXFULL --_S(ERR_MAP(EXFULL), N_("Exchange full")) -+_S(EXFULL, N_("Exchange full")) - #endif - #ifdef ENOANO --_S(ERR_MAP(ENOANO), N_("No anode")) -+_S(ENOANO, N_("No anode")) - #endif - #ifdef EBADRQC --_S(ERR_MAP(EBADRQC), N_("Invalid request code")) -+_S(EBADRQC, N_("Invalid request code")) - #endif - #ifdef EBADSLT --_S(ERR_MAP(EBADSLT), N_("Invalid slot")) -+_S(EBADSLT, N_("Invalid slot")) - #endif - #ifdef EBFONT --_S(ERR_MAP(EBFONT), N_("Bad font file format")) -+_S(EBFONT, N_("Bad font file format")) - #endif - #ifdef ENONET --_S(ERR_MAP(ENONET), N_("Machine is not on the network")) -+_S(ENONET, N_("Machine is not on the network")) - #endif - #ifdef ENOPKG --_S(ERR_MAP(ENOPKG), N_("Package not installed")) -+_S(ENOPKG, N_("Package not installed")) - #endif - #ifdef EADV --_S(ERR_MAP(EADV), N_("Advertise error")) -+_S(EADV, N_("Advertise error")) - #endif - #ifdef ESRMNT --_S(ERR_MAP(ESRMNT), N_("Srmount error")) -+_S(ESRMNT, N_("Srmount error")) - #endif - #ifdef ECOMM --_S(ERR_MAP(ECOMM), N_("Communication error on send")) -+_S(ECOMM, N_("Communication error on send")) - #endif - #ifdef EDOTDOT --_S(ERR_MAP(EDOTDOT), N_("RFS specific error")) -+_S(EDOTDOT, N_("RFS specific error")) - #endif - #ifdef ENOTUNIQ --_S(ERR_MAP(ENOTUNIQ), N_("Name not unique on network")) -+_S(ENOTUNIQ, N_("Name not unique on network")) - #endif - #ifdef EBADFD --_S(ERR_MAP(EBADFD), N_("File descriptor in bad state")) -+_S(EBADFD, N_("File descriptor in bad state")) - #endif - #ifdef EREMCHG --_S(ERR_MAP(EREMCHG), N_("Remote address changed")) -+_S(EREMCHG, N_("Remote address changed")) - #endif - #ifdef ELIBACC --_S(ERR_MAP(ELIBACC), N_("Can not access a needed shared library")) -+_S(ELIBACC, N_("Can not access a needed shared library")) - #endif - #ifdef ELIBBAD --_S(ERR_MAP(ELIBBAD), N_("Accessing a corrupted shared library")) -+_S(ELIBBAD, N_("Accessing a corrupted shared library")) - #endif - #ifdef ELIBSCN --_S(ERR_MAP(ELIBSCN), N_(".lib section in a.out corrupted")) -+_S(ELIBSCN, N_(".lib section in a.out corrupted")) - #endif - #ifdef ELIBMAX --_S(ERR_MAP(ELIBMAX), N_("Attempting to link in too many shared libraries")) -+_S(ELIBMAX, N_("Attempting to link in too many shared libraries")) - #endif - #ifdef ELIBEXEC --_S(ERR_MAP(ELIBEXEC), N_("Cannot exec a shared library directly")) -+_S(ELIBEXEC, N_("Cannot exec a shared library directly")) - #endif - #ifdef ESTRPIPE --_S(ERR_MAP(ESTRPIPE), N_("Streams pipe error")) -+_S(ESTRPIPE, N_("Streams pipe error")) - #endif - #ifdef EUCLEAN --_S(ERR_MAP(EUCLEAN), N_("Structure needs cleaning")) -+_S(EUCLEAN, N_("Structure needs cleaning")) - #endif - #ifdef ENOTNAM --_S(ERR_MAP(ENOTNAM), N_("Not a XENIX named type file")) -+_S(ENOTNAM, N_("Not a XENIX named type file")) - #endif - #ifdef ENAVAIL --_S(ERR_MAP(ENAVAIL), N_("No XENIX semaphores available")) -+_S(ENAVAIL, N_("No XENIX semaphores available")) - #endif - #ifdef EISNAM --_S(ERR_MAP(EISNAM), N_("Is a named type file")) -+_S(EISNAM, N_("Is a named type file")) - #endif - #ifdef EREMOTEIO --_S(ERR_MAP(EREMOTEIO), N_("Remote I/O error")) -+_S(EREMOTEIO, N_("Remote I/O error")) - #endif - #ifdef ENOMEDIUM --_S(ERR_MAP(ENOMEDIUM), N_("No medium found")) -+_S(ENOMEDIUM, N_("No medium found")) - #endif - #ifdef EMEDIUMTYPE --_S(ERR_MAP(EMEDIUMTYPE), N_("Wrong medium type")) -+_S(EMEDIUMTYPE, N_("Wrong medium type")) - #endif - #ifdef ENOKEY --_S(ERR_MAP(ENOKEY), N_("Required key not available")) -+_S(ENOKEY, N_("Required key not available")) - #endif - #ifdef EKEYEXPIRED --_S(ERR_MAP(EKEYEXPIRED), N_("Key has expired")) -+_S(EKEYEXPIRED, N_("Key has expired")) - #endif - #ifdef EKEYREVOKED --_S(ERR_MAP(EKEYREVOKED), N_("Key has been revoked")) -+_S(EKEYREVOKED, N_("Key has been revoked")) - #endif - #ifdef EKEYREJECTED --_S(ERR_MAP(EKEYREJECTED), N_("Key was rejected by service")) -+_S(EKEYREJECTED, N_("Key was rejected by service")) - #endif - #ifdef ERFKILL --_S(ERR_MAP(ERFKILL), N_("Operation not possible due to RF-kill")) -+_S(ERFKILL, N_("Operation not possible due to RF-kill")) - #endif - #ifdef EHWPOISON --_S(ERR_MAP(EHWPOISON), N_("Memory page has hardware error")) -+_S(EHWPOISON, N_("Memory page has hardware error")) - #endif - #ifdef EBADRPC --_S(ERR_MAP(EBADRPC), N_("RPC struct is bad")) -+_S(EBADRPC, N_("RPC struct is bad")) - #endif - #ifdef EFTYPE - /* -@@ -693,40 +690,40 @@ TRANS operation, or a data file had the - TRANS - TRANS On some systems @code{chmod} returns this error if you try to set the - TRANS sticky bit on a non-directory file; @pxref{Setting Permissions}. */ --_S(ERR_MAP(EFTYPE), N_("Inappropriate file type or format")) -+_S(EFTYPE, N_("Inappropriate file type or format")) - #endif - #ifdef EPROCUNAVAIL --_S(ERR_MAP(EPROCUNAVAIL), N_("RPC bad procedure for program")) -+_S(EPROCUNAVAIL, N_("RPC bad procedure for program")) - #endif - #ifdef EAUTH --_S(ERR_MAP(EAUTH), N_("Authentication error")) -+_S(EAUTH, N_("Authentication error")) - #endif - #ifdef EDIED - /* - TRANS On @gnuhurdsystems{}, opening a file returns this error when the file is - TRANS translated by a program and the translator program dies while starting - TRANS up, before it has connected to the file. */ --_S(ERR_MAP(EDIED), N_("Translator died")) -+_S(EDIED, N_("Translator died")) - #endif - #ifdef ERPCMISMATCH --_S(ERR_MAP(ERPCMISMATCH), N_("RPC version wrong")) -+_S(ERPCMISMATCH, N_("RPC version wrong")) - #endif - #ifdef EGREGIOUS - /* - TRANS You did @strong{what}? */ --_S(ERR_MAP(EGREGIOUS), N_("You really blew it this time")) -+_S(EGREGIOUS, N_("You really blew it this time")) - #endif - #ifdef EPROCLIM - /* - TRANS This means that the per-user limit on new process would be exceeded by - TRANS an attempted @code{fork}. @xref{Limits on Resources}, for details on - TRANS the @code{RLIMIT_NPROC} limit. */ --_S(ERR_MAP(EPROCLIM), N_("Too many processes")) -+_S(EPROCLIM, N_("Too many processes")) - #endif - #ifdef EGRATUITOUS - /* - TRANS This error code has no purpose. */ --_S(ERR_MAP(EGRATUITOUS), N_("Gratuitous error")) -+_S(EGRATUITOUS, N_("Gratuitous error")) - #endif - #if defined (ENOTSUP) && ENOTSUP != EOPNOTSUPP - /* -@@ -742,10 +739,10 @@ TRANS values. - TRANS - TRANS If the entire function is not available at all in the implementation, - TRANS it returns @code{ENOSYS} instead. */ --_S(ERR_MAP(ENOTSUP), N_("Not supported")) -+_S(ENOTSUP, N_("Not supported")) - #endif - #ifdef EPROGMISMATCH --_S(ERR_MAP(EPROGMISMATCH), N_("RPC program version wrong")) -+_S(EPROGMISMATCH, N_("RPC program version wrong")) - #endif - #ifdef EBACKGROUND - /* -@@ -755,7 +752,7 @@ TRANS foreground process group of the te - TRANS error because functions such as @code{read} and @code{write} translate - TRANS it into a @code{SIGTTIN} or @code{SIGTTOU} signal. @xref{Job Control}, - TRANS for information on process groups and these signals. */ --_S(ERR_MAP(EBACKGROUND), N_("Inappropriate operation for background process")) -+_S(EBACKGROUND, N_("Inappropriate operation for background process")) - #endif - #ifdef EIEIO - /* -@@ -773,7 +770,7 @@ TRANS @c "bought the farm" means "died". - TRANS @c - TRANS @c Translators, please do not translate this litteraly, translate it into - TRANS @c an idiomatic funny way of saying that the computer died. */ --_S(ERR_MAP(EIEIO), N_("Computer bought the farm")) -+_S(EIEIO, N_("Computer bought the farm")) - #endif - #if defined (EWOULDBLOCK) && EWOULDBLOCK != EAGAIN - /* -@@ -782,18 +779,18 @@ TRANS The values are always the same, on - TRANS - TRANS C libraries in many older Unix systems have @code{EWOULDBLOCK} as a - TRANS separate error code. */ --_S(ERR_MAP(EWOULDBLOCK), N_("Operation would block")) -+_S(EWOULDBLOCK, N_("Operation would block")) - #endif - #ifdef ENEEDAUTH --_S(ERR_MAP(ENEEDAUTH), N_("Need authenticator")) -+_S(ENEEDAUTH, N_("Need authenticator")) - #endif - #ifdef ED - /* - TRANS The experienced user will know what is wrong. - TRANS @c This error code is a joke. Its perror text is part of the joke. - TRANS @c Don't change it. */ --_S(ERR_MAP(ED), N_("?")) -+_S(ED, N_("?")) - #endif - #ifdef EPROGUNAVAIL --_S(ERR_MAP(EPROGUNAVAIL), N_("RPC program not available")) -+_S(EPROGUNAVAIL, N_("RPC program not available")) - #endif diff --git a/syslog-locking.patch b/syslog-locking.patch deleted file mode 100644 index 3db81c9..0000000 --- a/syslog-locking.patch +++ /dev/null @@ -1,117 +0,0 @@ -From 518db378cedc755f0ae311a1bc0487a4264f4bf0 Mon Sep 17 00:00:00 2001 -From: Andreas Schwab -Date: Tue, 23 Jun 2020 12:55:49 +0200 -Subject: [PATCH] Correct locking and cancellation cleanup in syslog functions - (bug 26100) - -Properly serialize the access to the global state shared between the -syslog functions, to avoid races in multithreaded processes. Protect a -local allocation in the __vsyslog_internal function from leaking during -cancellation. ---- - misc/syslog.c | 44 ++++++++++++++++++++++++++++---------------- - 1 file changed, 28 insertions(+), 16 deletions(-) - -Index: glibc-2.32/misc/syslog.c -=================================================================== ---- glibc-2.32.orig/misc/syslog.c -+++ glibc-2.32/misc/syslog.c -@@ -91,14 +91,20 @@ struct cleanup_arg - static void - cancel_handler (void *ptr) - { --#ifndef NO_SIGPIPE - /* Restore the old signal handler. */ - struct cleanup_arg *clarg = (struct cleanup_arg *) ptr; - -- if (clarg != NULL && clarg->oldaction != NULL) -- __sigaction (SIGPIPE, clarg->oldaction, NULL); -+ if (clarg != NULL) -+ { -+#ifndef NO_SIGPIPE -+ if (clarg->oldaction != NULL) -+ __sigaction (SIGPIPE, clarg->oldaction, NULL); - #endif - -+ /* Free the memstream buffer, */ -+ free (clarg->buf); -+ } -+ - /* Free the lock. */ - __libc_lock_unlock (syslog_lock); - } -@@ -169,9 +175,17 @@ __vsyslog_internal(int pri, const char * - pri &= LOG_PRIMASK|LOG_FACMASK; - } - -+ /* Prepare for multiple users. We have to take care: most -+ syscalls we are using are cancellation points. */ -+ struct cleanup_arg clarg; -+ clarg.buf = NULL; -+ clarg.oldaction = NULL; -+ __libc_cleanup_push (cancel_handler, &clarg); -+ __libc_lock_lock (syslog_lock); -+ - /* Check priority against setlogmask values. */ - if ((LOG_MASK (LOG_PRI (pri)) & LogMask) == 0) -- return; -+ goto out; - - /* Set default facility if none specified. */ - if ((pri & LOG_FACMASK) == 0) -@@ -235,6 +249,9 @@ __vsyslog_internal(int pri, const char * - /* Close the memory stream; this will finalize the data - into a malloc'd buffer in BUF. */ - fclose (f); -+ -+ /* Tell the cancellation handler to free this buffer. */ -+ clarg.buf = buf; - } - - /* Output to stderr if requested. */ -@@ -252,22 +269,10 @@ __vsyslog_internal(int pri, const char * - v->iov_len = 1; - } - -- __libc_cleanup_push (free, buf == failbuf ? NULL : buf); -- - /* writev is a cancellation point. */ - (void)__writev(STDERR_FILENO, iov, v - iov + 1); -- -- __libc_cleanup_pop (0); - } - -- /* Prepare for multiple users. We have to take care: open and -- write are cancellation points. */ -- struct cleanup_arg clarg; -- clarg.buf = buf; -- clarg.oldaction = NULL; -- __libc_cleanup_push (cancel_handler, &clarg); -- __libc_lock_lock (syslog_lock); -- - #ifndef NO_SIGPIPE - /* Prepare for a broken connection. */ - memset (&action, 0, sizeof (action)); -@@ -320,6 +325,7 @@ __vsyslog_internal(int pri, const char * - __sigaction (SIGPIPE, &oldaction, (struct sigaction *) NULL); - #endif - -+ out: - /* End of critical section. */ - __libc_cleanup_pop (0); - __libc_lock_unlock (syslog_lock); -@@ -430,8 +436,14 @@ setlogmask (int pmask) - { - int omask; - -+ /* Protect against multiple users. */ -+ __libc_lock_lock (syslog_lock); -+ - omask = LogMask; - if (pmask != 0) - LogMask = pmask; -+ -+ __libc_lock_unlock (syslog_lock); -+ - return (omask); - } diff --git a/sysvipc.patch b/sysvipc.patch deleted file mode 100644 index aab901e..0000000 --- a/sysvipc.patch +++ /dev/null @@ -1,796 +0,0 @@ -From 9b139b6b81a5def91bec01f30301acc95fbf0289 Mon Sep 17 00:00:00 2001 -From: "Dmitry V. Levin" -Date: Tue, 29 Sep 2020 14:10:20 -0300 -Subject: [PATCH] sysvipc: Fix SEM_STAT_ANY kernel argument pass [BZ #26637] - -Handle SEM_STAT_ANY the same way as SEM_STAT so that the buffer argument -of SEM_STAT_ANY is properly passed to the kernel and back. - -The regression testcase checks for Linux specifix SysV ipc message -control extension. For IPC_INFO/SEM_INFO it tries to match the values -against the tunable /proc values and for SEM_STAT/SEM_STAT_ANY it -check if the create message queue is within the global list returned -by the kernel. - -Checked on x86_64-linux-gnu and on i686-linux-gnu (Linux v5.4 and on -Linux v4.15). - -Co-authored-by: Adhemerval Zanella - -(cherry picked from commit 574500a108be1d2a6a0dc97a075c9e0a98371aba) - -From c4aeedea598a1bd80f52ca9ebd07fe447680d491 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Tue, 29 Sep 2020 14:39:56 -0300 -Subject: [PATCH] sysvipc: Fix IPC_INFO and MSG_INFO handling [BZ #26639] - -Both commands are Linux extensions where the third argument is a -'struct msginfo' instead of 'struct msqid_ds' and its information -does not contain any time related fields (so there is no need to -extra conversion for __IPC_TIME64. - -The regression testcase checks for Linux specifix SysV ipc message -control extension. For IPC_INFO/MSG_INFO it tries to match the values -against the tunable /proc values and for MSG_STAT/MSG_STAT_ANY it -check if the create message queue is within the global list returned -by the kernel. - -Checked on x86_64-linux-gnu and on i686-linux-gnu (Linux v5.4 and on -Linux v4.15). - -(cherry picked from commit 20a00dbefca5695cccaa44846a482db8ccdd85ab) - -From 0b9460d22e285432d232f42c7442a3226e1bf830 Mon Sep 17 00:00:00 2001 -From: Adhemerval Zanella -Date: Tue, 29 Sep 2020 14:51:36 -0300 -Subject: [PATCH] sysvipc: Fix IPC_INFO and SHM_INFO handling [BZ #26636] - -Both commands are Linux extensions where the third argument is either -a 'struct shminfo' (IPC_INFO) or a 'struct shm_info' (SHM_INFO) instead -of 'struct shmid_ds'. And their information does not contain any time -related fields, so there is no need to extra conversion for __IPC_TIME64. - -The regression testcase checks for Linux specifix SysV ipc message -control extension. For SHM_INFO it tries to match the values against the -tunable /proc values and for MSG_STAT/MSG_STAT_ANY it check if the create\ -shared memory is within the global list returned by the kernel. - -Checked on x86_64-linux-gnu and on i686-linux-gnu (Linux v5.4 and on -Linux v4.15). - -(cherry picked from commit a49d7fd4f764e97ccaf922e433046590ae52fce9) - -Index: glibc-2.32/sysdeps/unix/sysv/linux/Makefile -=================================================================== ---- glibc-2.32.orig/sysdeps/unix/sysv/linux/Makefile -+++ glibc-2.32/sysdeps/unix/sysv/linux/Makefile -@@ -100,7 +100,7 @@ tests += tst-clone tst-clone2 tst-clone3 - tst-quota tst-sync_file_range tst-sysconf-iov_max tst-ttyname \ - test-errno-linux tst-memfd_create tst-mlock2 tst-pkey \ - tst-rlimit-infinity tst-ofdlocks tst-gettid tst-gettid-kill \ -- tst-tgkill -+ tst-tgkill tst-sysvsem-linux tst-sysvmsg-linux tst-sysvshm-linux - tests-internal += tst-ofdlocks-compat tst-sigcontext-get_pc - - CFLAGS-tst-sigcontext-get_pc.c = -fasynchronous-unwind-tables -Index: glibc-2.32/sysdeps/unix/sysv/linux/msgctl.c -=================================================================== ---- glibc-2.32.orig/sysdeps/unix/sysv/linux/msgctl.c -+++ glibc-2.32/sysdeps/unix/sysv/linux/msgctl.c -@@ -90,8 +90,15 @@ __msgctl64 (int msqid, int cmd, struct _ - struct kernel_msqid64_ds ksemid, *arg = NULL; - if (buf != NULL) - { -- msqid64_to_kmsqid64 (buf, &ksemid); -- arg = &ksemid; -+ /* This is a Linux extension where kernel returns a 'struct msginfo' -+ instead. */ -+ if (cmd == IPC_INFO || cmd == MSG_INFO) -+ arg = (struct kernel_msqid64_ds *) buf; -+ else -+ { -+ msqid64_to_kmsqid64 (buf, &ksemid); -+ arg = &ksemid; -+ } - } - # ifdef __ASSUME_SYSVIPC_BROKEN_MODE_T - if (cmd == IPC_SET) -@@ -169,8 +176,15 @@ __msgctl (int msqid, int cmd, struct msq - struct __msqid64_ds msqid64, *buf64 = NULL; - if (buf != NULL) - { -- msqid_to_msqid64 (&msqid64, buf); -- buf64 = &msqid64; -+ /* This is a Linux extension where kernel returns a 'struct msginfo' -+ instead. */ -+ if (cmd == IPC_INFO || cmd == MSG_INFO) -+ buf64 = (struct __msqid64_ds *) buf; -+ else -+ { -+ msqid_to_msqid64 (&msqid64, buf); -+ buf64 = &msqid64; -+ } - } - - int ret = __msgctl64 (msqid, cmd, buf64); -Index: glibc-2.32/sysdeps/unix/sysv/linux/semctl.c -=================================================================== ---- glibc-2.32.orig/sysdeps/unix/sysv/linux/semctl.c -+++ glibc-2.32/sysdeps/unix/sysv/linux/semctl.c -@@ -102,6 +102,7 @@ semun64_to_ksemun64 (int cmd, union semu - r.array = semun64.array; - break; - case SEM_STAT: -+ case SEM_STAT_ANY: - case IPC_STAT: - case IPC_SET: - r.buf = buf; -@@ -150,6 +151,7 @@ __semctl64 (int semid, int semnum, int c - case IPC_STAT: /* arg.buf */ - case IPC_SET: - case SEM_STAT: -+ case SEM_STAT_ANY: - case IPC_INFO: /* arg.__buf */ - case SEM_INFO: - va_start (ap, cmd); -@@ -238,6 +240,7 @@ semun_to_semun64 (int cmd, union semun s - r.array = semun.array; - break; - case SEM_STAT: -+ case SEM_STAT_ANY: - case IPC_STAT: - case IPC_SET: - r.buf = semid64; -@@ -267,6 +270,7 @@ __semctl (int semid, int semnum, int cmd - case IPC_STAT: /* arg.buf */ - case IPC_SET: - case SEM_STAT: -+ case SEM_STAT_ANY: - case IPC_INFO: /* arg.__buf */ - case SEM_INFO: - va_start (ap, cmd); -@@ -321,6 +325,7 @@ __semctl_mode16 (int semid, int semnum, - case IPC_STAT: /* arg.buf */ - case IPC_SET: - case SEM_STAT: -+ case SEM_STAT_ANY: - case IPC_INFO: /* arg.__buf */ - case SEM_INFO: - va_start (ap, cmd); -@@ -354,6 +359,7 @@ __old_semctl (int semid, int semnum, int - case IPC_STAT: /* arg.buf */ - case IPC_SET: - case SEM_STAT: -+ case SEM_STAT_ANY: - case IPC_INFO: /* arg.__buf */ - case SEM_INFO: - va_start (ap, cmd); -Index: glibc-2.32/sysdeps/unix/sysv/linux/shmctl.c -=================================================================== ---- glibc-2.32.orig/sysdeps/unix/sysv/linux/shmctl.c -+++ glibc-2.32/sysdeps/unix/sysv/linux/shmctl.c -@@ -90,8 +90,15 @@ __shmctl64 (int shmid, int cmd, struct _ - struct kernel_shmid64_ds kshmid, *arg = NULL; - if (buf != NULL) - { -- shmid64_to_kshmid64 (buf, &kshmid); -- arg = &kshmid; -+ /* This is a Linux extension where kernel expects either a -+ 'struct shminfo' (IPC_INFO) or 'struct shm_info' (SHM_INFO). */ -+ if (cmd == IPC_INFO || cmd == SHM_INFO) -+ arg = (struct kernel_shmid64_ds *) buf; -+ else -+ { -+ shmid64_to_kshmid64 (buf, &kshmid); -+ arg = &kshmid; -+ } - } - # ifdef __ASSUME_SYSVIPC_BROKEN_MODE_T - if (cmd == IPC_SET) -@@ -107,7 +114,6 @@ __shmctl64 (int shmid, int cmd, struct _ - - switch (cmd) - { -- case IPC_INFO: - case IPC_STAT: - case SHM_STAT: - case SHM_STAT_ANY: -@@ -168,8 +174,15 @@ __shmctl (int shmid, int cmd, struct shm - struct __shmid64_ds shmid64, *buf64 = NULL; - if (buf != NULL) - { -- shmid_to_shmid64 (&shmid64, buf); -- buf64 = &shmid64; -+ /* This is a Linux extension where kernel expects either a -+ 'struct shminfo' (IPC_INFO) or 'struct shm_info' (SHM_INFO). */ -+ if (cmd == IPC_INFO || cmd == SHM_INFO) -+ buf64 = (struct __shmid64_ds *) buf; -+ else -+ { -+ shmid_to_shmid64 (&shmid64, buf); -+ buf64 = &shmid64; -+ } - } - - int ret = __shmctl64 (shmid, cmd, buf64); -@@ -178,7 +191,6 @@ __shmctl (int shmid, int cmd, struct shm - - switch (cmd) - { -- case IPC_INFO: - case IPC_STAT: - case SHM_STAT: - case SHM_STAT_ANY: -Index: glibc-2.32/sysdeps/unix/sysv/linux/tst-sysvmsg-linux.c -=================================================================== ---- /dev/null -+++ glibc-2.32/sysdeps/unix/sysv/linux/tst-sysvmsg-linux.c -@@ -0,0 +1,177 @@ -+/* Basic tests for Linux SYSV message queue extensions. -+ Copyright (C) 2020 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 -+ -+#define MSGQ_MODE 0644 -+ -+/* These are for the temporary file we generate. */ -+static char *name; -+static int msqid; -+ -+static void -+remove_msq (void) -+{ -+ /* Enforce message queue removal in case of early test failure. -+ Ignore error since the msg may already have being removed. */ -+ msgctl (msqid, IPC_RMID, NULL); -+} -+ -+static void -+do_prepare (int argc, char *argv[]) -+{ -+ TEST_VERIFY_EXIT (create_temp_file ("tst-sysvmsg.", &name) != -1); -+} -+ -+#define PREPARE do_prepare -+ -+struct test_msginfo -+{ -+ int msgmax; -+ int msgmnb; -+ int msgmni; -+}; -+ -+/* It tries to obtain some system-wide SysV messsage queue information from -+ /proc to check against IPC_INFO/MSG_INFO. The /proc only returns the -+ tunables value of MSGMAX, MSGMNB, and MSGMNI. -+ -+ The kernel also returns constant value for MSGSSZ, MSGSEG and also MSGMAP, -+ MSGPOOL, and MSGTQL (for IPC_INFO). The issue to check them is they might -+ change over kernel releases. */ -+ -+static int -+read_proc_file (const char *file) -+{ -+ FILE *f = fopen (file, "r"); -+ if (f == NULL) -+ FAIL_UNSUPPORTED ("/proc is not mounted or %s is not available", file); -+ -+ int v; -+ int r = fscanf (f, "%d", & v); -+ TEST_VERIFY_EXIT (r == 1); -+ -+ fclose (f); -+ return v; -+} -+ -+ -+/* Check if the message queue with IDX (index into the kernel's internal -+ array) matches the one with KEY. The CMD is either MSG_STAT or -+ MSG_STAT_ANY. */ -+ -+static bool -+check_msginfo (int idx, key_t key, int cmd) -+{ -+ struct msqid_ds msginfo; -+ int mid = msgctl (idx, cmd, &msginfo); -+ /* Ignore unused array slot returned by the kernel or information from -+ unknown message queue. */ -+ if ((mid == -1 && errno == EINVAL) || mid != msqid) -+ return false; -+ -+ if (mid == -1) -+ FAIL_EXIT1 ("msgctl with %s failed: %m", -+ cmd == MSG_STAT ? "MSG_STAT" : "MSG_STAT_ANY"); -+ -+ TEST_COMPARE (msginfo.msg_perm.__key, key); -+ TEST_COMPARE (msginfo.msg_perm.mode, MSGQ_MODE); -+ TEST_COMPARE (msginfo.msg_qnum, 0); -+ -+ return true; -+} -+ -+static int -+do_test (void) -+{ -+ atexit (remove_msq); -+ -+ key_t key = ftok (name, 'G'); -+ if (key == -1) -+ FAIL_EXIT1 ("ftok failed: %m"); -+ -+ msqid = msgget (key, MSGQ_MODE | IPC_CREAT); -+ if (msqid == -1) -+ FAIL_EXIT1 ("msgget failed: %m"); -+ -+ struct test_msginfo tipcinfo; -+ tipcinfo.msgmax = read_proc_file ("/proc/sys/kernel/msgmax"); -+ tipcinfo.msgmnb = read_proc_file ("/proc/sys/kernel/msgmnb"); -+ tipcinfo.msgmni = read_proc_file ("/proc/sys/kernel/msgmni"); -+ -+ int msqidx; -+ -+ { -+ struct msginfo ipcinfo; -+ msqidx = msgctl (msqid, IPC_INFO, (struct msqid_ds *) &ipcinfo); -+ if (msqidx == -1) -+ FAIL_EXIT1 ("msgctl with IPC_INFO failed: %m"); -+ -+ TEST_COMPARE (ipcinfo.msgmax, tipcinfo.msgmax); -+ TEST_COMPARE (ipcinfo.msgmnb, tipcinfo.msgmnb); -+ TEST_COMPARE (ipcinfo.msgmni, tipcinfo.msgmni); -+ } -+ -+ /* Same as before but with MSG_INFO. */ -+ { -+ struct msginfo ipcinfo; -+ msqidx = msgctl (msqid, MSG_INFO, (struct msqid_ds *) &ipcinfo); -+ if (msqidx == -1) -+ FAIL_EXIT1 ("msgctl with IPC_INFO failed: %m"); -+ -+ TEST_COMPARE (ipcinfo.msgmax, tipcinfo.msgmax); -+ TEST_COMPARE (ipcinfo.msgmnb, tipcinfo.msgmnb); -+ TEST_COMPARE (ipcinfo.msgmni, tipcinfo.msgmni); -+ } -+ -+ /* We check if the created message queue shows in global list. */ -+ bool found = false; -+ for (int i = 0; i <= msqidx; i++) -+ { -+ /* We can't tell apart if MSG_STAT_ANY is not supported (kernel older -+ than 4.17) or if the index used is invalid. So it just check if the -+ value returned from a valid call matches the created message -+ queue. */ -+ check_msginfo (i, key, MSG_STAT_ANY); -+ -+ if (check_msginfo (i, key, MSG_STAT)) -+ { -+ found = true; -+ break; -+ } -+ } -+ -+ if (!found) -+ FAIL_EXIT1 ("msgctl with MSG_STAT/MSG_STAT_ANY could not find the " -+ "created message queue"); -+ -+ if (msgctl (msqid, IPC_RMID, NULL) == -1) -+ FAIL_EXIT1 ("msgctl failed"); -+ -+ return 0; -+} -+ -+#include -Index: glibc-2.32/sysdeps/unix/sysv/linux/tst-sysvsem-linux.c -=================================================================== ---- /dev/null -+++ glibc-2.32/sysdeps/unix/sysv/linux/tst-sysvsem-linux.c -@@ -0,0 +1,184 @@ -+/* Basic tests for Linux SYSV semaphore extensions. -+ Copyright (C) 2020 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 -+ -+/* These are for the temporary file we generate. */ -+static char *name; -+static int semid; -+ -+static void -+remove_sem (void) -+{ -+ /* Enforce message queue removal in case of early test failure. -+ Ignore error since the sem may already have being removed. */ -+ semctl (semid, 0, IPC_RMID, 0); -+} -+ -+static void -+do_prepare (int argc, char *argv[]) -+{ -+ TEST_VERIFY_EXIT (create_temp_file ("tst-sysvsem.", &name) != -1); -+} -+ -+#define PREPARE do_prepare -+ -+#define SEM_MODE 0644 -+ -+union semun -+{ -+ int val; -+ struct semid_ds *buf; -+ unsigned short *array; -+ struct seminfo *__buf; -+}; -+ -+struct test_seminfo -+{ -+ int semmsl; -+ int semmns; -+ int semopm; -+ int semmni; -+}; -+ -+/* It tries to obtain some system-wide SysV semaphore information from /proc -+ to check against IPC_INFO/SEM_INFO. The /proc only returns the tunables -+ value of SEMMSL, SEMMNS, SEMOPM, and SEMMNI. -+ -+ The kernel also returns constant value for SEMVMX, SEMMNU, SEMMAP, SEMUME, -+ and also SEMUSZ and SEMAEM (for IPC_INFO). The issue to check them is they -+ might change over kernel releases. */ -+ -+static void -+read_sem_stat (struct test_seminfo *tseminfo) -+{ -+ FILE *f = fopen ("/proc/sys/kernel/sem", "r"); -+ if (f == NULL) -+ FAIL_UNSUPPORTED ("/proc is not mounted or /proc/sys/kernel/sem is not " -+ "available"); -+ -+ int r = fscanf (f, "%d %d %d %d", -+ &tseminfo->semmsl, &tseminfo->semmns, &tseminfo->semopm, -+ &tseminfo->semmni); -+ TEST_VERIFY_EXIT (r == 4); -+ -+ fclose (f); -+} -+ -+ -+/* Check if the semaphore with IDX (index into the kernel's internal array) -+ matches the one with KEY. The CMD is either SEM_STAT or SEM_STAT_ANY. */ -+ -+static bool -+check_seminfo (int idx, key_t key, int cmd) -+{ -+ struct semid_ds seminfo; -+ int sid = semctl (idx, 0, cmd, (union semun) { .buf = &seminfo }); -+ /* Ignore unused array slot returned by the kernel or information from -+ unknown semaphores. */ -+ if ((sid == -1 && errno == EINVAL) || sid != semid) -+ return false; -+ -+ if (sid == -1) -+ FAIL_EXIT1 ("semctl with SEM_STAT failed (errno=%d)", errno); -+ -+ TEST_COMPARE (seminfo.sem_perm.__key, key); -+ TEST_COMPARE (seminfo.sem_perm.mode, SEM_MODE); -+ TEST_COMPARE (seminfo.sem_nsems, 1); -+ -+ return true; -+} -+ -+static int -+do_test (void) -+{ -+ atexit (remove_sem); -+ -+ key_t key = ftok (name, 'G'); -+ if (key == -1) -+ FAIL_EXIT1 ("ftok failed: %m"); -+ -+ semid = semget (key, 1, IPC_CREAT | IPC_EXCL | SEM_MODE); -+ if (semid == -1) -+ FAIL_EXIT1 ("semget failed: %m"); -+ -+ struct test_seminfo tipcinfo; -+ read_sem_stat (&tipcinfo); -+ -+ int semidx; -+ -+ { -+ struct seminfo ipcinfo; -+ semidx = semctl (semid, 0, IPC_INFO, (union semun) { .__buf = &ipcinfo }); -+ if (semidx == -1) -+ FAIL_EXIT1 ("semctl with IPC_INFO failed: %m"); -+ -+ TEST_COMPARE (ipcinfo.semmsl, tipcinfo.semmsl); -+ TEST_COMPARE (ipcinfo.semmns, tipcinfo.semmns); -+ TEST_COMPARE (ipcinfo.semopm, tipcinfo.semopm); -+ TEST_COMPARE (ipcinfo.semmni, tipcinfo.semmni); -+ } -+ -+ /* Same as before but with SEM_INFO. */ -+ { -+ struct seminfo ipcinfo; -+ semidx = semctl (semid, 0, SEM_INFO, (union semun) { .__buf = &ipcinfo }); -+ if (semidx == -1) -+ FAIL_EXIT1 ("semctl with IPC_INFO failed: %m"); -+ -+ TEST_COMPARE (ipcinfo.semmsl, tipcinfo.semmsl); -+ TEST_COMPARE (ipcinfo.semmns, tipcinfo.semmns); -+ TEST_COMPARE (ipcinfo.semopm, tipcinfo.semopm); -+ TEST_COMPARE (ipcinfo.semmni, tipcinfo.semmni); -+ } -+ -+ /* We check if the created semaphore shows in the system-wide status. */ -+ bool found = false; -+ for (int i = 0; i <= semidx; i++) -+ { -+ /* We can't tell apart if SEM_STAT_ANY is not supported (kernel older -+ than 4.17) or if the index used is invalid. So it just check if -+ value returned from a valid call matches the created semaphore. */ -+ check_seminfo (i, key, SEM_STAT_ANY); -+ -+ if (check_seminfo (i, key, SEM_STAT)) -+ { -+ found = true; -+ break; -+ } -+ } -+ -+ if (!found) -+ FAIL_EXIT1 ("semctl with SEM_STAT/SEM_STAT_ANY could not find the " -+ "created semaphore"); -+ -+ if (semctl (semid, 0, IPC_RMID, 0) == -1) -+ FAIL_EXIT1 ("semctl failed: %m"); -+ -+ return 0; -+} -+ -+#include -Index: glibc-2.32/sysdeps/unix/sysv/linux/tst-sysvshm-linux.c -=================================================================== ---- /dev/null -+++ glibc-2.32/sysdeps/unix/sysv/linux/tst-sysvshm-linux.c -@@ -0,0 +1,185 @@ -+/* Basic tests for Linux SYSV shared memory extensions. -+ Copyright (C) 2020 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 -+#include -+ -+#define SHM_MODE 0644 -+ -+/* These are for the temporary file we generate. */ -+static char *name; -+static int shmid; -+static long int pgsz; -+ -+static void -+remove_shm (void) -+{ -+ /* Enforce message queue removal in case of early test failure. -+ Ignore error since the shm may already have being removed. */ -+ shmctl (shmid, IPC_RMID, NULL); -+} -+ -+static void -+do_prepare (int argc, char *argv[]) -+{ -+ TEST_VERIFY_EXIT (create_temp_file ("tst-sysvshm.", &name) != -1); -+} -+ -+#define PREPARE do_prepare -+ -+struct test_shminfo -+{ -+ unsigned long int shmall; -+ unsigned long int shmmax; -+ unsigned long int shmmni; -+}; -+ -+/* It tries to obtain some system-wide SysV shared memory information from -+ /proc to check against IPC_INFO/SHM_INFO. The /proc only returns the -+ tunables value of SHMALL, SHMMAX, and SHMMNI. */ -+ -+static uint64_t -+read_proc_file (const char *file) -+{ -+ FILE *f = fopen (file, "r"); -+ if (f == NULL) -+ FAIL_UNSUPPORTED ("/proc is not mounted or %s is not available", file); -+ -+ /* Handle 32-bit binaries running on 64-bit kernels. */ -+ uint64_t v; -+ int r = fscanf (f, "%" SCNu64, &v); -+ TEST_VERIFY_EXIT (r == 1); -+ -+ fclose (f); -+ return v; -+} -+ -+ -+/* Check if the message queue with IDX (index into the kernel's internal -+ array) matches the one with KEY. The CMD is either SHM_STAT or -+ SHM_STAT_ANY. */ -+ -+static bool -+check_shminfo (int idx, key_t key, int cmd) -+{ -+ struct shmid_ds shminfo; -+ int sid = shmctl (idx, cmd, &shminfo); -+ /* Ignore unused array slot returned by the kernel or information from -+ unknown message queue. */ -+ if ((sid == -1 && errno == EINVAL) || sid != shmid) -+ return false; -+ -+ if (sid == -1) -+ FAIL_EXIT1 ("shmctl with %s failed: %m", -+ cmd == SHM_STAT ? "SHM_STAT" : "SHM_STAT_ANY"); -+ -+ TEST_COMPARE (shminfo.shm_perm.__key, key); -+ TEST_COMPARE (shminfo.shm_perm.mode, SHM_MODE); -+ TEST_COMPARE (shminfo.shm_segsz, pgsz); -+ -+ return true; -+} -+ -+static int -+do_test (void) -+{ -+ atexit (remove_shm); -+ -+ pgsz = sysconf (_SC_PAGESIZE); -+ if (pgsz == -1) -+ FAIL_EXIT1 ("sysconf (_SC_PAGESIZE) failed: %m"); -+ -+ key_t key = ftok (name, 'G'); -+ if (key == -1) -+ FAIL_EXIT1 ("ftok failed: %m"); -+ -+ shmid = shmget (key, pgsz, IPC_CREAT | IPC_EXCL | SHM_MODE); -+ if (shmid == -1) -+ FAIL_EXIT1 ("shmget failed: %m"); -+ -+ struct test_shminfo tipcinfo; -+ { -+ uint64_t v = read_proc_file ("/proc/sys/kernel/shmmax"); -+#if LONG_MAX == INT_MAX -+ /* Kernel explicit clamp the value for shmmax on compat symbol (32-bit -+ binaries running on 64-bit kernels). */ -+ if (v > INT_MAX) -+ v = INT_MAX; -+#endif -+ tipcinfo.shmmax = v; -+ } -+ tipcinfo.shmall = read_proc_file ("/proc/sys/kernel/shmall"); -+ tipcinfo.shmmni = read_proc_file ("/proc/sys/kernel/shmmni"); -+ -+ int shmidx; -+ -+ /* Note: SHM_INFO does not return a shminfo, but rather a 'struct shm_info'. -+ It is tricky to verify its values since the syscall returns system wide -+ resources consumed by shared memory. The shmctl implementation handles -+ SHM_INFO as IPC_INFO, so the IPC_INFO test should validate SHM_INFO as -+ well. */ -+ -+ { -+ struct shminfo ipcinfo; -+ shmidx = shmctl (shmid, IPC_INFO, (struct shmid_ds *) &ipcinfo); -+ if (shmidx == -1) -+ FAIL_EXIT1 ("shmctl with IPC_INFO failed: %m"); -+ -+ TEST_COMPARE (ipcinfo.shmall, tipcinfo.shmall); -+ TEST_COMPARE (ipcinfo.shmmax, tipcinfo.shmmax); -+ TEST_COMPARE (ipcinfo.shmmni, tipcinfo.shmmni); -+ } -+ -+ /* We check if the created shared memory shows in the global list. */ -+ bool found = false; -+ for (int i = 0; i <= shmidx; i++) -+ { -+ /* We can't tell apart if SHM_STAT_ANY is not supported (kernel older -+ than 4.17) or if the index used is invalid. So it just check if -+ value returned from a valid call matches the created message -+ queue. */ -+ check_shminfo (i, key, SHM_STAT_ANY); -+ -+ if (check_shminfo (i, key, SHM_STAT)) -+ { -+ found = true; -+ break; -+ } -+ } -+ -+ if (!found) -+ FAIL_EXIT1 ("shmctl with SHM_STAT/SHM_STAT_ANY could not find the " -+ "created shared memory"); -+ -+ if (shmctl (shmid, IPC_RMID, NULL) == -1) -+ FAIL_EXIT1 ("shmctl failed"); -+ -+ return 0; -+} -+ -+#include -Index: glibc-2.32/sysvipc/test-sysvsem.c -=================================================================== ---- glibc-2.32.orig/sysvipc/test-sysvsem.c -+++ glibc-2.32/sysvipc/test-sysvsem.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - #include - #include - #include