Accepting request 868600 from Base:System
- 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. (forwarded request 868599 from Andreas_Schwab) OBS-URL: https://build.opensuse.org/request/show/868600 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/glibc?expand=0&rev=244
This commit is contained in:
commit
553ff7e510
@ -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
|
||||
|
@ -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;
|
@ -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.
|
||||
-
|
||||
|
@ -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);
|
||||
|
@ -1,3 +0,0 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1627ea54f5a1a8467032563393e0901077626dc66f37f10ee6363bb722222836
|
||||
size 16744512
|
@ -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
3
glibc-2.33.tar.xz
Normal 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
16
glibc-2.33.tar.xz.sig
Normal 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-----
|
@ -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)
|
||||
{
|
||||
|
@ -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\
|
||||
|
@ -1,3 +1,50 @@
|
||||
-------------------------------------------------------------------
|
||||
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>
|
||||
|
||||
- Remove support for %optimize_power
|
||||
- Move to power4 baseline on ppc
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Tue Dec 15 16:41:29 UTC 2020 - Andreas Schwab <schwab@suse.de>
|
||||
|
||||
@ -190,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>
|
||||
|
359
glibc.keyring
359
glibc.keyring
@ -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-----
|
||||
|
311
glibc.spec
311
glibc.spec
@ -1,7 +1,7 @@
|
||||
#
|
||||
# spec file for package glibc
|
||||
# spec file for package glibc%{name_suffix}
|
||||
#
|
||||
# Copyright (c) 2020 SUSE LLC
|
||||
# Copyright (c) 2021 SUSE LLC
|
||||
#
|
||||
# All modifications and additions to the file contributed by third parties
|
||||
# remain the property of their copyright owners, unless otherwise agreed
|
||||
@ -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
|
||||
@ -109,29 +109,6 @@ BuildArch: i686
|
||||
|
||||
%define disable_assert 0
|
||||
%define enable_stackguard_randomization 1
|
||||
%ifarch ppc ppc64
|
||||
%define optimize_power 1
|
||||
%ifarch ppc
|
||||
%define powerpc_optimize_base %{nil}
|
||||
%define powerpc_optimize_tune power3
|
||||
%define powerpc_optimize_cpu_power4 1
|
||||
%else
|
||||
%define powerpc_optimize_base %{nil}
|
||||
%define powerpc_optimize_tune power5
|
||||
%define powerpc_optimize_cpu_power4 0
|
||||
%endif
|
||||
# We are not building Power CPU specific optimizations for openSUSE.
|
||||
%define powerpc_optimize_cpu_power6 0
|
||||
%define powerpc_optimize_cpu_power7 0
|
||||
%define powerpc_optimize_cpu_cell 0
|
||||
%else
|
||||
%define optimize_power 0
|
||||
%define powerpc_optimize_base %{nil}
|
||||
%define powerpc_optimize_cpu_power4 0
|
||||
%define powerpc_optimize_cpu_power6 0
|
||||
%define powerpc_optimize_cpu_power7 0
|
||||
%define powerpc_optimize_cpu_cell 0
|
||||
%endif
|
||||
# glibc requires at least kernel 3.2
|
||||
%define enablekernel 3.2
|
||||
# some architectures need a newer kernel
|
||||
@ -148,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//')
|
||||
@ -259,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
|
||||
@ -287,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
|
||||
@ -329,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
|
||||
@ -403,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
|
||||
@ -453,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
|
||||
@ -491,44 +445,11 @@ 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
|
||||
|
||||
#
|
||||
# Inconsistency detected by ld.so: dl-close.c: 719: _dl_close: Assertion `map->l_init_called' failed!
|
||||
#
|
||||
# Glibc 2.8 introduced the HP_TIMING element to the rtld_global_ro struct # definition.
|
||||
# If the base is built without power4 the loader won't have this element in
|
||||
# the struct whereas the power4/5/6/... libc will, so there will be a disconnect
|
||||
# between the size of the rtld_global_ro struct between the two and dl_close
|
||||
# ends up getting called incorrectly when it's actually attempting to call a
|
||||
# resolver function. This is because the GLRO() macro simply attempts to
|
||||
# compute an offset and gets the wrong one.
|
||||
# Building the base glibc with --with-cpu=power4 solves this problem.
|
||||
# But: ppc32 can not default to -mcpu=power4 because it would emit instructions
|
||||
# which are not available on G3, G4 etc.
|
||||
#
|
||||
# We simply remove the power4 files, and build the base glibc for a generic powerpc cpu
|
||||
# Additional cputuned libs can now be used on powerpc32
|
||||
#
|
||||
rm -fv sysdeps/powerpc/powerpc32/power4/hp-timing.c sysdeps/powerpc/powerpc32/power4/hp-timing.h
|
||||
find . -name configure | xargs touch
|
||||
|
||||
%build
|
||||
# Disable LTO due to a usage of top-level assembler that
|
||||
# causes LTO issues (boo#1138807).
|
||||
@ -597,6 +518,7 @@ BuildCCplus="%__cxx"
|
||||
%endif
|
||||
%ifarch ppc ppc64
|
||||
BuildFlags="$(echo $BuildFlags | sed 's#-mminimal-toc##')"
|
||||
BuildFlags+=" -mtune=power5"
|
||||
%endif
|
||||
%ifarch ppc64
|
||||
BuildCC="$BuildCC -m64"
|
||||
@ -617,106 +539,63 @@ BuildCCplus="%__cxx"
|
||||
%define enable_stackguard_randomization 0
|
||||
%endif
|
||||
|
||||
configure_and_build_glibc() {
|
||||
local dirname="$1"; shift
|
||||
local cflags="$1"; shift
|
||||
mkdir "cc-$dirname"
|
||||
cd "cc-$dirname"
|
||||
#
|
||||
# Build base glibc
|
||||
#
|
||||
mkdir cc-base
|
||||
cd cc-base
|
||||
%ifarch %arm aarch64
|
||||
# remove asynchronous-unwind-tables during configure as it causes
|
||||
# some checks to fail spuriously on arm
|
||||
conf_cflags="${cflags/-fasynchronous-unwind-tables/}"
|
||||
conf_cflags="${conf_cflags/-funwind-tables/}"
|
||||
# remove asynchronous-unwind-tables during configure as it causes
|
||||
# some checks to fail spuriously on arm
|
||||
conf_cflags="${BuildFlags/-fasynchronous-unwind-tables/}"
|
||||
conf_cflags="${conf_cflags/-funwind-tables/}"
|
||||
%else
|
||||
conf_cflags="$cflags"
|
||||
conf_cflags="$BuildFlags"
|
||||
%endif
|
||||
|
||||
profile="--disable-profile"
|
||||
%if %{build_profile}
|
||||
if [ "$dirname" = "base" ] ; then
|
||||
profile="--enable-profile"
|
||||
fi
|
||||
profile="--enable-profile"
|
||||
%else
|
||||
profile="--disable-profile"
|
||||
%endif
|
||||
../configure \
|
||||
CFLAGS="$conf_cflags" BUILD_CFLAGS="$conf_cflags" \
|
||||
CC="$BuildCC" CXX="$BuildCCplus" \
|
||||
--prefix=%{_prefix} \
|
||||
--libexecdir=%{_libexecdir} --infodir=%{_infodir} \
|
||||
$profile \
|
||||
"$@" \
|
||||
--build=%{target} --host=%{target} \
|
||||
../configure \
|
||||
CFLAGS="$conf_cflags" BUILD_CFLAGS="$conf_cflags" \
|
||||
CC="$BuildCC" CXX="$BuildCCplus" \
|
||||
--prefix=%{_prefix} \
|
||||
--libexecdir=%{_libexecdir} --infodir=%{_infodir} \
|
||||
$profile \
|
||||
--build=%{target} --host=%{target} \
|
||||
%ifarch armv7hl ppc ppc64 ppc64le i686 x86_64 sparc sparc64 s390 s390x
|
||||
--enable-multi-arch \
|
||||
--enable-multi-arch \
|
||||
%endif
|
||||
%ifarch mipsel
|
||||
--without-fp \
|
||||
--without-fp \
|
||||
%endif
|
||||
%ifarch ppc
|
||||
--with-cpu=power4 \
|
||||
%endif
|
||||
%ifarch ppc64p7
|
||||
--with-cpu=power7 \
|
||||
--with-cpu=power7 \
|
||||
%endif
|
||||
%ifarch x86_64
|
||||
%if %suse_version > 1500
|
||||
--enable-cet \
|
||||
--enable-cet \
|
||||
%endif
|
||||
%endif
|
||||
%if %{enable_stackguard_randomization}
|
||||
--enable-stackguard-randomization \
|
||||
%endif
|
||||
${enable_stack_protector:+--enable-stack-protector=$enable_stack_protector} \
|
||||
--enable-tunables \
|
||||
--enable-kernel=%{enablekernel} \
|
||||
--with-bugurl=http://bugs.opensuse.org \
|
||||
--enable-bind-now \
|
||||
--enable-systemtap \
|
||||
--disable-timezone-tools \
|
||||
--disable-crypt
|
||||
# explicitly set CFLAGS to use the full CFLAGS (not the reduced one for configure)
|
||||
make %{?_smp_mflags} CFLAGS="$cflags" BUILD_CFLAGS="$cflags"
|
||||
cd ..
|
||||
}
|
||||
|
||||
%if !%{optimize_power}
|
||||
#
|
||||
# Build base glibc
|
||||
#
|
||||
configure_and_build_glibc base "$BuildFlags"
|
||||
%else
|
||||
#
|
||||
# Build POWER-optimized glibc
|
||||
#
|
||||
# First, base build:
|
||||
pBuildFlags="$BuildFlags -mtune=%{powerpc_optimize_tune}"
|
||||
%if "%{powerpc_optimize_base}" != ""
|
||||
pBuildFlags+=" -mcpu=%{powerpc_optimize_base}"
|
||||
%endif
|
||||
%if "%{powerpc_optimize_base}" != ""
|
||||
configure_and_build_glibc base "$pBuildFlags" --with-cpu=%{powerpc_optimize_base}
|
||||
%else
|
||||
# Use no default CPU
|
||||
configure_and_build_glibc base "$pBuildFlags"
|
||||
%endif
|
||||
%if %{build_variants}
|
||||
# Then other power variants:
|
||||
for pcpu in \
|
||||
%if %{powerpc_optimize_cpu_power4}
|
||||
power4 \
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_power6}
|
||||
power6 \
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_power7}
|
||||
power7 \
|
||||
%endif
|
||||
; do
|
||||
configure_and_build_glibc $pcpu "$BuildFlags -mcpu=$pcpu" \
|
||||
--with-cpu=$pcpu
|
||||
done
|
||||
# Eventually, special Cell variant:
|
||||
%if %{powerpc_optimize_cpu_cell}
|
||||
configure_and_build_glibc ppc-cell-be "$BuildFlags -mcpu=cell"
|
||||
%endif
|
||||
%endif
|
||||
--enable-stackguard-randomization \
|
||||
%endif
|
||||
${enable_stack_protector:+--enable-stack-protector=$enable_stack_protector} \
|
||||
--enable-tunables \
|
||||
--enable-kernel=%{enablekernel} \
|
||||
--with-bugurl=http://bugs.opensuse.org \
|
||||
--enable-bind-now \
|
||||
--enable-systemtap \
|
||||
--disable-timezone-tools \
|
||||
--disable-crypt
|
||||
# explicitly set CFLAGS to use the full CFLAGS (not the reduced one for configure)
|
||||
make %{?_smp_mflags} CFLAGS="$BuildFlags" BUILD_CFLAGS="$BuildFlags"
|
||||
cd ..
|
||||
|
||||
#
|
||||
# Build html documentation
|
||||
@ -786,62 +665,8 @@ export STRIP_KEEP_SYMTAB=*.so*
|
||||
# Install base glibc
|
||||
make %{?_smp_mflags} install_root=%{buildroot} install -C cc-base
|
||||
|
||||
install_optimized_variant() {
|
||||
local dirname="$1"; shift
|
||||
local subdir="$1"; shift
|
||||
local subdir_up="$1"; shift
|
||||
|
||||
cd "cc-$dirname"
|
||||
destdir=$RPM_BUILD_ROOT/%{_lib}/$subdir
|
||||
mkdir -p $destdir
|
||||
# Don't run a complete make install, we know which libraries
|
||||
# we want
|
||||
for lib in libc math/libm nptl/libpthread rt/librt nptl_db/libthread_db
|
||||
do
|
||||
libbase=${lib#*/}
|
||||
libbaseso=$(basename $RPM_BUILD_ROOT/%{_lib}/${libbase}-*.so)
|
||||
# Only install if different from base lib
|
||||
if cmp -s ${lib}.so ../cc-base/${lib}.so; then
|
||||
ln -sf $subdir_up/$libbaseso $destdir/$libbaseso
|
||||
else
|
||||
cp -a ${lib}.so $destdir/$libbaseso
|
||||
fi
|
||||
done
|
||||
cd ..
|
||||
cc-base/elf/ldconfig -vn $destdir
|
||||
}
|
||||
|
||||
# Install power-optimized glibc
|
||||
%if %{optimize_power}
|
||||
%if %{powerpc_optimize_cpu_power4}
|
||||
install_optimized_variant power4 power4 ".."
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_power6}
|
||||
install_optimized_variant power6 power6 ".."
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_power7}
|
||||
install_optimized_variant power7 power7 ".."
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_cell}
|
||||
install_optimized_variant ppc-cell-be ppc-cell-be ".."
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_power6}
|
||||
# power6 is compatible with power6x
|
||||
# doing a directory symlink doesnt work, ldconfig follows them and accepts only the first real dir
|
||||
if test -d %{buildroot}/%{_lib}/power6; then
|
||||
mkdir -p %{buildroot}/%{_lib}/power6x
|
||||
for i in %{buildroot}/%{_lib}/power6/*.so; do
|
||||
b=$(basename $i)
|
||||
ln -vs ../power6/$b %{buildroot}/%{_lib}/power6x/$b
|
||||
done
|
||||
cc-base/elf/ldconfig -vn %{buildroot}/%{_lib}/power6x
|
||||
fi
|
||||
%endif
|
||||
%endif
|
||||
|
||||
# Install locales
|
||||
%if %{build_locales}
|
||||
# XXX Do not install locales in parallel!
|
||||
cd cc-base
|
||||
# localedef creates hardlinks to other locales if possible
|
||||
# this will not work if we generate them in parallel.
|
||||
@ -874,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/
|
||||
@ -1042,19 +864,11 @@ remove_dirs = {
|
||||
"/%{_lib}/i686/",
|
||||
%endif
|
||||
%ifarch ppc ppc64
|
||||
%if !%{powerpc_optimize_cpu_power4}
|
||||
"/%{_lib}/power4/", "/%{_lib}/ppc970/",
|
||||
%endif
|
||||
"/%{_lib}/power5/", "/%{_lib}/power5+/",
|
||||
%if !%{powerpc_optimize_cpu_power6}
|
||||
"/%{_lib}/power6/", "/%{_lib}/power6x/",
|
||||
%endif
|
||||
%if !%{powerpc_optimize_cpu_power7}
|
||||
"/%{_lib}/power7/",
|
||||
%endif
|
||||
%if !%{powerpc_optimize_cpu_cell}
|
||||
"/%{_lib}/ppc-cell-be/",
|
||||
%endif
|
||||
%endif
|
||||
"/%{_lib}/tls/"
|
||||
}
|
||||
@ -1128,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/*
|
||||
@ -1218,34 +1031,6 @@ exit 0
|
||||
/%{_lib}/libthread_db.so.1
|
||||
/%{_lib}/libutil-%{libversion}.so
|
||||
/%{_lib}/libutil.so.1
|
||||
%define optimized_libs() \
|
||||
%dir %attr(0755,root,root) /%{_lib}/%1\
|
||||
/%{_lib}/%1/libc-%{libversion}.so\
|
||||
/%{_lib}/%1/libc.so.6*\
|
||||
/%{_lib}/%1/libm-%{libversion}.so\
|
||||
/%{_lib}/%1/libm.so.6*\
|
||||
/%{_lib}/%1/libpthread-%{libversion}.so\
|
||||
/%{_lib}/%1/libpthread.so.0\
|
||||
/%{_lib}/%1/librt-%{libversion}.so\
|
||||
/%{_lib}/%1/librt.so.1\
|
||||
/%{_lib}/%1/libthread_db-1.0.so\
|
||||
/%{_lib}/%1/libthread_db.so.1
|
||||
|
||||
%if %{optimize_power}
|
||||
%if %{powerpc_optimize_cpu_power4}
|
||||
%{optimized_libs power4}
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_power6}
|
||||
%{optimized_libs power6}
|
||||
%{optimized_libs power6x}
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_power7}
|
||||
%{optimized_libs power7}
|
||||
%endif
|
||||
%if %{powerpc_optimize_cpu_cell}
|
||||
%{optimized_libs ppc-cell-be}
|
||||
%endif
|
||||
%endif
|
||||
%dir %attr(0700,root,root) /var/cache/ldconfig
|
||||
/sbin/ldconfig
|
||||
%{_bindir}/gencat
|
||||
|
@ -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; \
|
@ -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>
|
@ -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
|
||||
|
@ -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>
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
@ -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);
|
||||
}
|
796
sysvipc.patch
796
sysvipc.patch
@ -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>
|
Loading…
Reference in New Issue
Block a user