SHA256
3
0
forked from pool/glibc

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 <sys/platform/x86.h> 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 <sys/vtimes.h> 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
This commit is contained in:
Andreas Schwab 2021-02-02 11:37:02 +00:00 committed by Git OBS Bridge
parent 5f38c0099e
commit aa7f55e9fc
23 changed files with 406 additions and 3567 deletions

View File

@ -1,25 +0,0 @@
From d4136903a29baabeec8987b53081def8b4a49826 Mon Sep 17 00:00:00 2001
From: Guillaume Gardet <guillaume.gardet@arm.com>
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

View File

@ -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
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <iconv.h>
+#include <stdio.h>
+#include <support/check.h>
+
+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 <support/test-driver.c>
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;

View File

@ -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 <drepper@redhat.com>, 2002.
-

View File

@ -1,35 +0,0 @@
From b5eeca8cfd9d0fd92b5633a88901d9ff27f2b496 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@linux-m68k.org>
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);

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:1627ea54f5a1a8467032563393e0901077626dc66f37f10ee6363bb722222836
size 16744512

View File

@ -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-----

3
glibc-2.33.tar.xz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:2e2556000e105dbd57f0b6b2a32ff2cf173bde4f0d85dffccfd8b7e51a0677ff
size 17031280

16
glibc-2.33.tar.xz.sig Normal file
View File

@ -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-----

View File

@ -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)
{

View File

@ -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\

View File

@ -1,3 +1,44 @@
-------------------------------------------------------------------
Tue Feb 2 09:33:28 UTC 2021 - Andreas Schwab <schwab@suse.de>
- 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 <sys/platform/x86.h> 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 <sys/vtimes.h> 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 <schwab@suse.de>
@ -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 <schwab@suse.de>
- 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 <schwab@suse.de>

View File

@ -92,7 +92,6 @@ XavWgG39OPlPqENUx7GIRgQYEQIABgUCPh6PKQAKCRDa9zUKfrvWJYxEAJ9FFDtc
GPG keys of Paul Eggert <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 <ianw>
@ -885,3 +896,275 @@ IqV+O8CuGx6PRLjNuqKbZljpLxpFbD3gndtK8lH43BuzfgY9MPg+
=FC1k
-----END PGP PUBLIC KEY BLOCK-----
GPG keys of Dmitry V. Levin <ldv>
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
PBg=
=Rd5j
-----END PGP PUBLIC KEY BLOCK-----

View File

@ -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//')
@ -236,26 +236,6 @@ 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
@ -264,10 +244,6 @@ Patch1009: get-nprocs-cpu-online-parsing.patch
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/*

View File

@ -1,82 +0,0 @@
From 9a99c682144bdbd40792ebf822fe9264e0376fb5 Mon Sep 17 00:00:00 2001
From: Arjun Shankar <arjun@redhat.com>
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 <carlos@redhat.com>
---
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; \

View File

@ -1,147 +0,0 @@
From 228edd356f03bf62dcf2b1335f25d43c602ee68d Mon Sep 17 00:00:00 2001
From: Michael Colavita <mcolavita@fb.com>
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
+ <http://www.gnu.org/licenses/>. */
+
+/* Derived from BZ #26923 */
+#include <errno.h>
+#include <iconv.h>
+#include <stdio.h>
+#include <support/check.h>
+
+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 <support/test-driver.c>

View File

@ -1,28 +0,0 @@
From 23af890b3f04e80da783ba64e6b6d94822e01d54 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ond=C5=99ej=20Ho=C5=A1ek?= <ondra.hosek@gmail.com>
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

View File

@ -1,237 +0,0 @@
From fe62c4d173f3cc1ac64f01e75a8f421b2f092cdb Mon Sep 17 00:00:00 2001
From: Arjun Shankar <arjun@redhat.com>
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <support/check.h>
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 <support/test-driver.c>

View File

@ -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)

View File

@ -1,42 +0,0 @@
From 4350db8d5e45dc4ec63e5fabc6bdc3a9425769dc Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@suse.de>
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

View File

@ -1,124 +0,0 @@
From 681900d29683722b1cb0a8e565a0585846ec5a61 Mon Sep 17 00:00:00 2001
From: Florian Weimer <fweimer@redhat.com>
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
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdio.h>
+#include <string.h>
+#include <support/check.h>
+
+/* 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 <support/test-driver.c>

File diff suppressed because it is too large Load Diff

View File

@ -1,117 +0,0 @@
From 518db378cedc755f0ae311a1bc0487a4264f4bf0 Mon Sep 17 00:00:00 2001
From: Andreas Schwab <schwab@suse.de>
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);
}

View File

@ -1,796 +0,0 @@
From 9b139b6b81a5def91bec01f30301acc95fbf0289 Mon Sep 17 00:00:00 2001
From: "Dmitry V. Levin" <ldv@altlinux.org>
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 <adhemerval.zanella@linaro.org>
(cherry picked from commit 574500a108be1d2a6a0dc97a075c9e0a98371aba)
From c4aeedea598a1bd80f52ca9ebd07fe447680d491 Mon Sep 17 00:00:00 2001
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
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 <adhemerval.zanella@linaro.org>
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
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#include <support/check.h>
+#include <support/temp_file.h>
+
+#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 <support/test-driver.c>
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
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/ipc.h>
+#include <sys/sem.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+
+#include <support/check.h>
+#include <support/temp_file.h>
+
+/* 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 <support/test-driver.c>
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
+ <https://www.gnu.org/licenses/>. */
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <inttypes.h>
+#include <limits.h>
+
+#include <support/check.h>
+#include <support/temp_file.h>
+
+#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 <support/test-driver.c>
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 <stdlib.h>
#include <errno.h>
#include <string.h>
+#include <stdbool.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>