Accepting request 638790 from home:Andreas_Schwab:Factory
- unwind-ctor.patch: Add missing unwind information to ld.so on powerpc32 (BZ #23707) - old-getdents64.patch: Rewrite __old_getdents64 (BZ #23497) - nss-files-leak.patch: Fix file stream leak in aliases lookup (BZ #23521) - riscv-feholdexcept-setround.patch: Fix rounding save/restore bug - pthread-cond-broadcast-waiters-after-spinning.patch: Fix waiters-after-spinning case (BZ #23538) - regex-uninit-memory-access.patch: fix uninitialized memory access (BZ #23578) - spawni-maybe-script-execute.patch: Fix segfault in maybe_script_execute - gethostid-gethostbyname-failure.patch: Check for NULL value from gethostbyname_r (BZ #23679) - strstr-huge-needle.patch: Fix strstr bug with huge needles (BZ #23637) OBS-URL: https://build.opensuse.org/request/show/638790 OBS-URL: https://build.opensuse.org/package/show/Base:System/glibc?expand=0&rev=511
This commit is contained in:
parent
8fdb38368b
commit
9a39949079
165
gethostid-gethostbyname-failure.patch
Normal file
165
gethostid-gethostbyname-failure.patch
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
2018-09-20 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
* misc/tst-gethostid.c: New file.
|
||||||
|
* misc/Makefile [$(build-shared)] (tests): Add tst-gethostid.
|
||||||
|
(tst-gethostid): Link with -ldl.
|
||||||
|
|
||||||
|
2018-09-20 Mingli Yu <Mingli.Yu@windriver.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/gethostid.c (gethostid): Check for NULL
|
||||||
|
value from gethostbyname_r.
|
||||||
|
|
||||||
|
Index: glibc-2.28/misc/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/misc/Makefile
|
||||||
|
+++ glibc-2.28/misc/Makefile
|
||||||
|
@@ -86,6 +86,11 @@ tests := tst-dirname tst-tsearch tst-fds
|
||||||
|
tst-preadvwritev tst-preadvwritev64 tst-makedev tst-empty \
|
||||||
|
tst-preadvwritev2 tst-preadvwritev64v2
|
||||||
|
|
||||||
|
+# Tests which need libdl.
|
||||||
|
+ifeq (yes,$(build-shared))
|
||||||
|
+tests += tst-gethostid
|
||||||
|
+endif
|
||||||
|
+
|
||||||
|
tests-internal := tst-atomic tst-atomic-long tst-allocate_once
|
||||||
|
tests-static := tst-empty
|
||||||
|
|
||||||
|
@@ -145,3 +150,5 @@ tst-allocate_once-ENV = MALLOC_TRACE=$(o
|
||||||
|
$(objpfx)tst-allocate_once-mem.out: $(objpfx)tst-allocate_once.out
|
||||||
|
$(common-objpfx)malloc/mtrace $(objpfx)tst-allocate_once.mtrace > $@; \
|
||||||
|
$(evaluate-test)
|
||||||
|
+
|
||||||
|
+$(objpfx)tst-gethostid: $(libdl)
|
||||||
|
Index: glibc-2.28/misc/tst-gethostid.c
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ glibc-2.28/misc/tst-gethostid.c
|
||||||
|
@@ -0,0 +1,108 @@
|
||||||
|
+/* Basic test for gethostid.
|
||||||
|
+ Copyright (C) 2018 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/>. */
|
||||||
|
+
|
||||||
|
+#include <gnu/lib-names.h>
|
||||||
|
+#include <nss.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <support/namespace.h>
|
||||||
|
+#include <support/support.h>
|
||||||
|
+#include <support/temp_file.h>
|
||||||
|
+#include <support/xdlfcn.h>
|
||||||
|
+#include <support/xstdio.h>
|
||||||
|
+#include <support/xunistd.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+
|
||||||
|
+/* Initial test is run outside a chroot, to increase the likelihood of
|
||||||
|
+ success. */
|
||||||
|
+static void
|
||||||
|
+outside_chroot (void *closure)
|
||||||
|
+{
|
||||||
|
+ long id = gethostid ();
|
||||||
|
+ printf ("info: host ID outside chroot: 0x%lx\n", id);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* The same, but this time perform a chroot operation. */
|
||||||
|
+static void
|
||||||
|
+in_chroot (void *closure)
|
||||||
|
+{
|
||||||
|
+ const char *chroot_path = closure;
|
||||||
|
+ xchroot (chroot_path);
|
||||||
|
+ long id = gethostid ();
|
||||||
|
+ printf ("info: host ID in chroot: 0x%lx\n", id);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ support_isolate_in_subprocess (outside_chroot, NULL);
|
||||||
|
+
|
||||||
|
+ /* Now run the test inside a chroot. */
|
||||||
|
+ support_become_root ();
|
||||||
|
+ if (!support_can_chroot ())
|
||||||
|
+ /* Cannot perform further tests. */
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ /* Only use nss_files. */
|
||||||
|
+ __nss_configure_lookup ("hosts", "files");
|
||||||
|
+
|
||||||
|
+ /* Load the DSO outside of the chroot. */
|
||||||
|
+ xdlopen (LIBNSS_FILES_SO, RTLD_LAZY);
|
||||||
|
+
|
||||||
|
+ char *chroot_dir = support_create_temp_directory ("tst-gethostid-");
|
||||||
|
+ support_isolate_in_subprocess (in_chroot, chroot_dir);
|
||||||
|
+
|
||||||
|
+ /* Tests with /etc/hosts in the chroot. */
|
||||||
|
+ {
|
||||||
|
+ char *path = xasprintf ("%s/etc", chroot_dir);
|
||||||
|
+ add_temp_file (path);
|
||||||
|
+ xmkdir (path, 0777);
|
||||||
|
+ free (path);
|
||||||
|
+ path = xasprintf ("%s/etc/hosts", chroot_dir);
|
||||||
|
+ add_temp_file (path);
|
||||||
|
+
|
||||||
|
+ FILE *fp = xfopen (path, "w");
|
||||||
|
+ xfclose (fp);
|
||||||
|
+ printf ("info: chroot test with an empty /etc/hosts file\n");
|
||||||
|
+ support_isolate_in_subprocess (in_chroot, chroot_dir);
|
||||||
|
+
|
||||||
|
+ char hostname[1024];
|
||||||
|
+ int ret = gethostname (hostname, sizeof (hostname));
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ printf ("warning: invalid result from gethostname: %d\n", ret);
|
||||||
|
+ else if (strlen (hostname) == 0)
|
||||||
|
+ puts ("warning: gethostname returned empty string");
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ printf ("info: chroot test with IPv6 address in /etc/hosts for: %s\n",
|
||||||
|
+ hostname);
|
||||||
|
+ fp = xfopen (path, "w");
|
||||||
|
+ /* Use an IPv6 address to induce another lookup failure. */
|
||||||
|
+ fprintf (fp, "2001:db8::1 %s\n", hostname);
|
||||||
|
+ xfclose (fp);
|
||||||
|
+ support_isolate_in_subprocess (in_chroot, chroot_dir);
|
||||||
|
+ }
|
||||||
|
+ free (path);
|
||||||
|
+ }
|
||||||
|
+ free (chroot_dir);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
||||||
|
Index: glibc-2.28/sysdeps/unix/sysv/linux/gethostid.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/sysdeps/unix/sysv/linux/gethostid.c
|
||||||
|
+++ glibc-2.28/sysdeps/unix/sysv/linux/gethostid.c
|
||||||
|
@@ -102,12 +102,12 @@ gethostid (void)
|
||||||
|
{
|
||||||
|
int ret = __gethostbyname_r (hostname, &hostbuf,
|
||||||
|
tmpbuf.data, tmpbuf.length, &hp, &herr);
|
||||||
|
- if (ret == 0)
|
||||||
|
+ if (ret == 0 && hp != NULL)
|
||||||
|
break;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Enlarge the buffer on ERANGE. */
|
||||||
|
- if (herr == NETDB_INTERNAL && errno == ERANGE)
|
||||||
|
+ if (ret != 0 && herr == NETDB_INTERNAL && errno == ERANGE)
|
||||||
|
{
|
||||||
|
if (!scratch_buffer_grow (&tmpbuf))
|
||||||
|
return 0;
|
@ -1,3 +1,20 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Sep 26 09:41:59 UTC 2018 - schwab@suse.de
|
||||||
|
|
||||||
|
- unwind-ctor.patch: Add missing unwind information to ld.so on powerpc32
|
||||||
|
(BZ #23707)
|
||||||
|
- old-getdents64.patch: Rewrite __old_getdents64 (BZ #23497)
|
||||||
|
- nss-files-leak.patch: Fix file stream leak in aliases lookup (BZ #23521)
|
||||||
|
- riscv-feholdexcept-setround.patch: Fix rounding save/restore bug
|
||||||
|
- pthread-cond-broadcast-waiters-after-spinning.patch: Fix
|
||||||
|
waiters-after-spinning case (BZ #23538)
|
||||||
|
- regex-uninit-memory-access.patch: fix uninitialized memory access (BZ
|
||||||
|
#23578)
|
||||||
|
- spawni-maybe-script-execute.patch: Fix segfault in maybe_script_execute
|
||||||
|
- gethostid-gethostbyname-failure.patch: Check for NULL value from
|
||||||
|
gethostbyname_r (BZ #23679)
|
||||||
|
- strstr-huge-needle.patch: Fix strstr bug with huge needles (BZ #23637)
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Sep 12 06:47:33 UTC 2018 - schwab@suse.de
|
Wed Sep 12 06:47:33 UTC 2018 - schwab@suse.de
|
||||||
|
|
||||||
|
28
glibc.spec
28
glibc.spec
@ -268,6 +268,24 @@ Patch306: glibc-fix-double-loopback.diff
|
|||||||
###
|
###
|
||||||
# Patches from upstream
|
# Patches from upstream
|
||||||
###
|
###
|
||||||
|
# PATCH-FIX-UPSTREAM Add missing unwind information to ld.so on powerpc32 (BZ #23707)
|
||||||
|
Patch1000: unwind-ctor.patch
|
||||||
|
# PATCH-FIX-UPSTREAM Rewrite __old_getdents64 (BZ #23497)
|
||||||
|
Patch1001: old-getdents64.patch
|
||||||
|
# PATCH-FIX-UPSTREAM nss_files: Fix file stream leak in aliases lookup (BZ #23521)
|
||||||
|
Patch1002: nss-files-leak.patch
|
||||||
|
# PATCH-FIX-UPSTREAM RISC-V: Fix rounding save/restore bug
|
||||||
|
Patch1003: riscv-feholdexcept-setround.patch
|
||||||
|
# PATCH-FIX-UPSTREAM pthread_cond_broadcast: Fix waiters-after-spinning case (BZ #23538)
|
||||||
|
Patch1004: pthread-cond-broadcast-waiters-after-spinning.patch
|
||||||
|
# PATCH-FIX-UPSTREAM regex: fix uninitialized memory access (BZ #23578)
|
||||||
|
Patch1005: regex-uninit-memory-access.patch
|
||||||
|
# PATCH-FIX-UPSTREAM Fix segfault in maybe_script_execute
|
||||||
|
Patch1006: spawni-maybe-script-execute.patch
|
||||||
|
# PATCH-FIX-UPSTREAM Linux gethostid: Check for NULL value from gethostbyname_r (BZ #23679)
|
||||||
|
Patch1007: gethostid-gethostbyname-failure.patch
|
||||||
|
# PATCH-FIX-UPSTREAM Fix strstr bug with huge needles (BZ #23637)
|
||||||
|
Patch1008: strstr-huge-needle.patch
|
||||||
|
|
||||||
###
|
###
|
||||||
# Patches awaiting upstream approval
|
# Patches awaiting upstream approval
|
||||||
@ -477,6 +495,16 @@ makedb: A program to create a database for nss
|
|||||||
%patch304 -p1
|
%patch304 -p1
|
||||||
%patch306 -p1
|
%patch306 -p1
|
||||||
|
|
||||||
|
%patch1000 -p1
|
||||||
|
%patch1001 -p1
|
||||||
|
%patch1002 -p1
|
||||||
|
%patch1003 -p1
|
||||||
|
%patch1004 -p1
|
||||||
|
%patch1005 -p1
|
||||||
|
%patch1006 -p1
|
||||||
|
%patch1007 -p1
|
||||||
|
%patch1008 -p1
|
||||||
|
|
||||||
%patch2000 -p1
|
%patch2000 -p1
|
||||||
%patch2004 -p1
|
%patch2004 -p1
|
||||||
%patch2005 -p1
|
%patch2005 -p1
|
||||||
|
307
nss-files-leak.patch
Normal file
307
nss-files-leak.patch
Normal file
@ -0,0 +1,307 @@
|
|||||||
|
2018-08-14 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
[BZ #23521]
|
||||||
|
[BZ #23522]
|
||||||
|
* nss/nss_files/files-alias.c (get_next_alias): During :include:
|
||||||
|
processing, bail out if no room, and close the stream before
|
||||||
|
returning ERANGE.
|
||||||
|
* nss/Makefile (tests): Add tst-nss-files-alias-leak.
|
||||||
|
(tst-nss-files-alias-leak): Link with libdl.
|
||||||
|
(tst-nss-files-alias-leak.out): Depend on nss_files.
|
||||||
|
|
||||||
|
* nss/tst-nss-files-alias-leak.c: New file.
|
||||||
|
|
||||||
|
Index: glibc-2.28/nss/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/nss/Makefile
|
||||||
|
+++ glibc-2.28/nss/Makefile
|
||||||
|
@@ -65,6 +65,7 @@ ifeq (yes,$(build-shared))
|
||||||
|
tests += tst-nss-files-hosts-erange
|
||||||
|
tests += tst-nss-files-hosts-multi
|
||||||
|
tests += tst-nss-files-hosts-getent
|
||||||
|
+tests += tst-nss-files-alias-leak
|
||||||
|
endif
|
||||||
|
|
||||||
|
# If we have a thread library then we can test cancellation against
|
||||||
|
@@ -171,3 +172,5 @@ endif
|
||||||
|
$(objpfx)tst-nss-files-hosts-erange: $(libdl)
|
||||||
|
$(objpfx)tst-nss-files-hosts-multi: $(libdl)
|
||||||
|
$(objpfx)tst-nss-files-hosts-getent: $(libdl)
|
||||||
|
+$(objpfx)tst-nss-files-alias-leak: $(libdl)
|
||||||
|
+$(objpfx)tst-nss-files-alias-leak.out: $(objpfx)/libnss_files.so
|
||||||
|
Index: glibc-2.28/nss/nss_files/files-alias.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/nss/nss_files/files-alias.c
|
||||||
|
+++ glibc-2.28/nss/nss_files/files-alias.c
|
||||||
|
@@ -221,6 +221,13 @@ get_next_alias (FILE *stream, const char
|
||||||
|
{
|
||||||
|
while (! feof_unlocked (listfile))
|
||||||
|
{
|
||||||
|
+ if (room_left < 2)
|
||||||
|
+ {
|
||||||
|
+ free (old_line);
|
||||||
|
+ fclose (listfile);
|
||||||
|
+ goto no_more_room;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
first_unused[room_left - 1] = '\xff';
|
||||||
|
line = fgets_unlocked (first_unused, room_left,
|
||||||
|
listfile);
|
||||||
|
@@ -229,6 +236,7 @@ get_next_alias (FILE *stream, const char
|
||||||
|
if (first_unused[room_left - 1] != '\xff')
|
||||||
|
{
|
||||||
|
free (old_line);
|
||||||
|
+ fclose (listfile);
|
||||||
|
goto no_more_room;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -256,6 +264,7 @@ get_next_alias (FILE *stream, const char
|
||||||
|
+ __alignof__ (char *)))
|
||||||
|
{
|
||||||
|
free (old_line);
|
||||||
|
+ fclose (listfile);
|
||||||
|
goto no_more_room;
|
||||||
|
}
|
||||||
|
room_left -= ((first_unused - cp)
|
||||||
|
Index: glibc-2.28/nss/tst-nss-files-alias-leak.c
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ glibc-2.28/nss/tst-nss-files-alias-leak.c
|
||||||
|
@@ -0,0 +1,237 @@
|
||||||
|
+/* Check for file descriptor leak in alias :include: processing (bug 23521).
|
||||||
|
+ Copyright (C) 2018 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/>. */
|
||||||
|
+
|
||||||
|
+#include <aliases.h>
|
||||||
|
+#include <array_length.h>
|
||||||
|
+#include <dlfcn.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <gnu/lib-names.h>
|
||||||
|
+#include <nss.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
+#include <support/namespace.h>
|
||||||
|
+#include <support/support.h>
|
||||||
|
+#include <support/temp_file.h>
|
||||||
|
+#include <support/test-driver.h>
|
||||||
|
+#include <support/xstdio.h>
|
||||||
|
+#include <support/xunistd.h>
|
||||||
|
+
|
||||||
|
+static struct support_chroot *chroot_env;
|
||||||
|
+
|
||||||
|
+/* Number of the aliases for the "many" user. This must be large
|
||||||
|
+ enough to trigger reallocation for the pointer array, but result in
|
||||||
|
+ answers below the maximum size tried in do_test. */
|
||||||
|
+enum { many_aliases = 30 };
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+prepare (int argc, char **argv)
|
||||||
|
+{
|
||||||
|
+ chroot_env = support_chroot_create
|
||||||
|
+ ((struct support_chroot_configuration) { } );
|
||||||
|
+
|
||||||
|
+ char *path = xasprintf ("%s/etc/aliases", chroot_env->path_chroot);
|
||||||
|
+ add_temp_file (path);
|
||||||
|
+ support_write_file_string
|
||||||
|
+ (path,
|
||||||
|
+ "user1: :include:/etc/aliases.user1\n"
|
||||||
|
+ "user2: :include:/etc/aliases.user2\n"
|
||||||
|
+ "comment: comment1, :include:/etc/aliases.comment\n"
|
||||||
|
+ "many: :include:/etc/aliases.many\n");
|
||||||
|
+ free (path);
|
||||||
|
+
|
||||||
|
+ path = xasprintf ("%s/etc/aliases.user1", chroot_env->path_chroot);
|
||||||
|
+ add_temp_file (path);
|
||||||
|
+ support_write_file_string (path, "alias1\n");
|
||||||
|
+ free (path);
|
||||||
|
+
|
||||||
|
+ path = xasprintf ("%s/etc/aliases.user2", chroot_env->path_chroot);
|
||||||
|
+ add_temp_file (path);
|
||||||
|
+ support_write_file_string (path, "alias1a, alias2\n");
|
||||||
|
+ free (path);
|
||||||
|
+
|
||||||
|
+ path = xasprintf ("%s/etc/aliases.comment", chroot_env->path_chroot);
|
||||||
|
+ add_temp_file (path);
|
||||||
|
+ support_write_file_string
|
||||||
|
+ (path,
|
||||||
|
+ /* The line must be longer than the line with the :include:
|
||||||
|
+ directive in /etc/aliases. */
|
||||||
|
+ "# Long line. ##############################################\n"
|
||||||
|
+ "comment2\n");
|
||||||
|
+ free (path);
|
||||||
|
+
|
||||||
|
+ path = xasprintf ("%s/etc/aliases.many", chroot_env->path_chroot);
|
||||||
|
+ add_temp_file (path);
|
||||||
|
+ FILE *fp = xfopen (path, "w");
|
||||||
|
+ for (int i = 0; i < many_aliases; ++i)
|
||||||
|
+ fprintf (fp, "a%d\n", i);
|
||||||
|
+ TEST_VERIFY_EXIT (! ferror (fp));
|
||||||
|
+ xfclose (fp);
|
||||||
|
+ free (path);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* The names of the users to test. */
|
||||||
|
+static const char *users[] = { "user1", "user2", "comment", "many" };
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+check_aliases (int id, const struct aliasent *e)
|
||||||
|
+{
|
||||||
|
+ TEST_VERIFY_EXIT (id >= 0 || id < array_length (users));
|
||||||
|
+ const char *name = users[id];
|
||||||
|
+ TEST_COMPARE_BLOB (e->alias_name, strlen (e->alias_name),
|
||||||
|
+ name, strlen (name));
|
||||||
|
+
|
||||||
|
+ switch (id)
|
||||||
|
+ {
|
||||||
|
+ case 0:
|
||||||
|
+ TEST_COMPARE (e->alias_members_len, 1);
|
||||||
|
+ TEST_COMPARE_BLOB (e->alias_members[0], strlen (e->alias_members[0]),
|
||||||
|
+ "alias1", strlen ("alias1"));
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case 1:
|
||||||
|
+ TEST_COMPARE (e->alias_members_len, 2);
|
||||||
|
+ TEST_COMPARE_BLOB (e->alias_members[0], strlen (e->alias_members[0]),
|
||||||
|
+ "alias1a", strlen ("alias1a"));
|
||||||
|
+ TEST_COMPARE_BLOB (e->alias_members[1], strlen (e->alias_members[1]),
|
||||||
|
+ "alias2", strlen ("alias2"));
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case 2:
|
||||||
|
+ TEST_COMPARE (e->alias_members_len, 2);
|
||||||
|
+ TEST_COMPARE_BLOB (e->alias_members[0], strlen (e->alias_members[0]),
|
||||||
|
+ "comment1", strlen ("comment1"));
|
||||||
|
+ TEST_COMPARE_BLOB (e->alias_members[1], strlen (e->alias_members[1]),
|
||||||
|
+ "comment2", strlen ("comment2"));
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ case 3:
|
||||||
|
+ TEST_COMPARE (e->alias_members_len, many_aliases);
|
||||||
|
+ for (int i = 0; i < e->alias_members_len; ++i)
|
||||||
|
+ {
|
||||||
|
+ char alias[30];
|
||||||
|
+ int len = snprintf (alias, sizeof (alias), "a%d", i);
|
||||||
|
+ TEST_VERIFY_EXIT (len > 0);
|
||||||
|
+ TEST_COMPARE_BLOB (e->alias_members[i], strlen (e->alias_members[i]),
|
||||||
|
+ alias, len);
|
||||||
|
+ }
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ /* Make sure we don't try to load the module in the chroot. */
|
||||||
|
+ if (dlopen (LIBNSS_FILES_SO, RTLD_NOW) == NULL)
|
||||||
|
+ FAIL_EXIT1 ("could not load " LIBNSS_FILES_SO ": %s", dlerror ());
|
||||||
|
+
|
||||||
|
+ /* Some of these descriptors will become unavailable if there is a
|
||||||
|
+ file descriptor leak. 10 is chosen somewhat arbitrarily. The
|
||||||
|
+ array must be longer than the number of files opened by nss_files
|
||||||
|
+ at the same time (currently that number is 2). */
|
||||||
|
+ int next_descriptors[10];
|
||||||
|
+ for (size_t i = 0; i < array_length (next_descriptors); ++i)
|
||||||
|
+ {
|
||||||
|
+ next_descriptors[i] = dup (0);
|
||||||
|
+ TEST_VERIFY_EXIT (next_descriptors[i] > 0);
|
||||||
|
+ }
|
||||||
|
+ for (size_t i = 0; i < array_length (next_descriptors); ++i)
|
||||||
|
+ xclose (next_descriptors[i]);
|
||||||
|
+
|
||||||
|
+ support_become_root ();
|
||||||
|
+ if (!support_can_chroot ())
|
||||||
|
+ return EXIT_UNSUPPORTED;
|
||||||
|
+
|
||||||
|
+ __nss_configure_lookup ("aliases", "files");
|
||||||
|
+
|
||||||
|
+ xchroot (chroot_env->path_chroot);
|
||||||
|
+
|
||||||
|
+ /* Attempt various buffer sizes. If the operation succeeds, we
|
||||||
|
+ expect correct data. */
|
||||||
|
+ for (int id = 0; id < array_length (users); ++id)
|
||||||
|
+ {
|
||||||
|
+ bool found = false;
|
||||||
|
+ for (size_t size = 1; size <= 1000; ++size)
|
||||||
|
+ {
|
||||||
|
+ void *buffer = malloc (size);
|
||||||
|
+ struct aliasent result;
|
||||||
|
+ struct aliasent *res;
|
||||||
|
+ errno = EINVAL;
|
||||||
|
+ int ret = getaliasbyname_r (users[id], &result, buffer, size, &res);
|
||||||
|
+ if (ret == 0)
|
||||||
|
+ {
|
||||||
|
+ if (res != NULL)
|
||||||
|
+ {
|
||||||
|
+ found = true;
|
||||||
|
+ check_aliases (id, res);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ printf ("error: failed lookup for user \"%s\", size %zu\n",
|
||||||
|
+ users[id], size);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else if (ret != ERANGE)
|
||||||
|
+ {
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ printf ("error: invalid return code %d (user \%s\", size %zu)\n",
|
||||||
|
+ ret, users[id], size);
|
||||||
|
+ }
|
||||||
|
+ free (buffer);
|
||||||
|
+
|
||||||
|
+ /* Make sure that we did not have a file descriptor leak. */
|
||||||
|
+ for (size_t i = 0; i < array_length (next_descriptors); ++i)
|
||||||
|
+ {
|
||||||
|
+ int new_fd = dup (0);
|
||||||
|
+ if (new_fd != next_descriptors[i])
|
||||||
|
+ {
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ printf ("error: descriptor %d at index %zu leaked"
|
||||||
|
+ " (user \"%s\", size %zu)\n",
|
||||||
|
+ next_descriptors[i], i, users[id], size);
|
||||||
|
+
|
||||||
|
+ /* Close unexpected descriptor, the leak probing
|
||||||
|
+ descriptors, and the leaked descriptor
|
||||||
|
+ next_descriptors[i]. */
|
||||||
|
+ xclose (new_fd);
|
||||||
|
+ for (size_t j = 0; j <= i; ++j)
|
||||||
|
+ xclose (next_descriptors[j]);
|
||||||
|
+ goto next_size;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ for (size_t i = 0; i < array_length (next_descriptors); ++i)
|
||||||
|
+ xclose (next_descriptors[i]);
|
||||||
|
+
|
||||||
|
+ next_size:
|
||||||
|
+ ;
|
||||||
|
+ }
|
||||||
|
+ if (!found)
|
||||||
|
+ {
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ printf ("error: user %s not found\n", users[id]);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ support_chroot_free (chroot_env);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#define PREPARE prepare
|
||||||
|
+#include <support/test-driver.c>
|
249
old-getdents64.patch
Normal file
249
old-getdents64.patch
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
2018-08-10 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
[BZ #23497]
|
||||||
|
* sysdeps/unix/sysv/linux/getdents64.c (handle_overflow): New
|
||||||
|
function.
|
||||||
|
(__old_getdents64): Use getdents64. Convert entries without
|
||||||
|
moving them.
|
||||||
|
* sysdeps/unix/sysv/linux/tst-readdir64-compat.c: New file.
|
||||||
|
* sysdeps/unix/sysv/linux/Makefile (tests-internal): Add
|
||||||
|
tst-readdir64-compat.
|
||||||
|
|
||||||
|
Index: glibc-2.28/sysdeps/unix/sysv/linux/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/sysdeps/unix/sysv/linux/Makefile
|
||||||
|
+++ glibc-2.28/sysdeps/unix/sysv/linux/Makefile
|
||||||
|
@@ -161,6 +161,7 @@ inhibit-glue = yes
|
||||||
|
|
||||||
|
ifeq ($(subdir),dirent)
|
||||||
|
sysdep_routines += getdirentries getdirentries64
|
||||||
|
+tests-internal += tst-readdir64-compat
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(subdir),nis)
|
||||||
|
Index: glibc-2.28/sysdeps/unix/sysv/linux/getdents64.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/sysdeps/unix/sysv/linux/getdents64.c
|
||||||
|
+++ glibc-2.28/sysdeps/unix/sysv/linux/getdents64.c
|
||||||
|
@@ -33,41 +33,80 @@ strong_alias (__getdents64, __getdents)
|
||||||
|
# include <shlib-compat.h>
|
||||||
|
|
||||||
|
# if SHLIB_COMPAT(libc, GLIBC_2_1, GLIBC_2_2)
|
||||||
|
-# include <olddirent.h>
|
||||||
|
+# include <olddirent.h>
|
||||||
|
+# include <unistd.h>
|
||||||
|
|
||||||
|
-/* kernel definition of as of 3.2. */
|
||||||
|
-struct compat_linux_dirent
|
||||||
|
+static ssize_t
|
||||||
|
+handle_overflow (int fd, __off64_t offset, ssize_t count)
|
||||||
|
{
|
||||||
|
- /* Both d_ino and d_off are compat_ulong_t which are defined in all
|
||||||
|
- architectures as 'u32'. */
|
||||||
|
- uint32_t d_ino;
|
||||||
|
- uint32_t d_off;
|
||||||
|
- unsigned short d_reclen;
|
||||||
|
- char d_name[1];
|
||||||
|
-};
|
||||||
|
+ /* If this is the first entry in the buffer, we can report the
|
||||||
|
+ error. */
|
||||||
|
+ if (count == 0)
|
||||||
|
+ {
|
||||||
|
+ __set_errno (EOVERFLOW);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Otherwise, seek to the overflowing entry, so that the next call
|
||||||
|
+ will report the error, and return the data read so far.. */
|
||||||
|
+ if (__lseek64 (fd, offset, SEEK_SET) != 0)
|
||||||
|
+ return -1;
|
||||||
|
+ return count;
|
||||||
|
+}
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
__old_getdents64 (int fd, char *buf, size_t nbytes)
|
||||||
|
{
|
||||||
|
- ssize_t retval = INLINE_SYSCALL_CALL (getdents, fd, buf, nbytes);
|
||||||
|
+ /* We do not move the individual directory entries. This is only
|
||||||
|
+ possible if the target type (struct __old_dirent64) is smaller
|
||||||
|
+ than the source type. */
|
||||||
|
+ _Static_assert (offsetof (struct __old_dirent64, d_name)
|
||||||
|
+ <= offsetof (struct dirent64, d_name),
|
||||||
|
+ "__old_dirent64 is larger than dirent64");
|
||||||
|
+ _Static_assert (__alignof__ (struct __old_dirent64)
|
||||||
|
+ <= __alignof__ (struct dirent64),
|
||||||
|
+ "alignment of __old_dirent64 is larger than dirent64");
|
||||||
|
|
||||||
|
- /* The kernel added the d_type value after the name. Change this now. */
|
||||||
|
- if (retval != -1)
|
||||||
|
+ ssize_t retval = INLINE_SYSCALL_CALL (getdents64, fd, buf, nbytes);
|
||||||
|
+ if (retval > 0)
|
||||||
|
{
|
||||||
|
- union
|
||||||
|
- {
|
||||||
|
- struct compat_linux_dirent k;
|
||||||
|
- struct dirent u;
|
||||||
|
- } *kbuf = (void *) buf;
|
||||||
|
-
|
||||||
|
- while ((char *) kbuf < buf + retval)
|
||||||
|
+ char *p = buf;
|
||||||
|
+ char *end = buf + retval;
|
||||||
|
+ while (p < end)
|
||||||
|
{
|
||||||
|
- char d_type = *((char *) kbuf + kbuf->k.d_reclen - 1);
|
||||||
|
- memmove (kbuf->u.d_name, kbuf->k.d_name,
|
||||||
|
- strlen (kbuf->k.d_name) + 1);
|
||||||
|
- kbuf->u.d_type = d_type;
|
||||||
|
+ struct dirent64 *source = (struct dirent64 *) p;
|
||||||
|
+
|
||||||
|
+ /* Copy out the fixed-size data. */
|
||||||
|
+ __ino_t ino = source->d_ino;
|
||||||
|
+ __off64_t offset = source->d_off;
|
||||||
|
+ unsigned int reclen = source->d_reclen;
|
||||||
|
+ unsigned char type = source->d_type;
|
||||||
|
+
|
||||||
|
+ /* Check for ino_t overflow. */
|
||||||
|
+ if (__glibc_unlikely (ino != source->d_ino))
|
||||||
|
+ return handle_overflow (fd, offset, p - buf);
|
||||||
|
+
|
||||||
|
+ /* Convert to the target layout. Use a separate struct and
|
||||||
|
+ memcpy to side-step aliasing issues. */
|
||||||
|
+ struct __old_dirent64 result;
|
||||||
|
+ result.d_ino = ino;
|
||||||
|
+ result.d_off = offset;
|
||||||
|
+ result.d_reclen = reclen;
|
||||||
|
+ result.d_type = type;
|
||||||
|
+
|
||||||
|
+ /* Write the fixed-sized part of the result to the
|
||||||
|
+ buffer. */
|
||||||
|
+ size_t result_name_offset = offsetof (struct __old_dirent64, d_name);
|
||||||
|
+ memcpy (p, &result, result_name_offset);
|
||||||
|
+
|
||||||
|
+ /* Adjust the position of the name if necessary. Copy
|
||||||
|
+ everything until the end of the record, including the
|
||||||
|
+ terminating NUL byte. */
|
||||||
|
+ if (result_name_offset != offsetof (struct dirent64, d_name))
|
||||||
|
+ memmove (p + result_name_offset, source->d_name,
|
||||||
|
+ reclen - offsetof (struct dirent64, d_name));
|
||||||
|
|
||||||
|
- kbuf = (void *) ((char *) kbuf + kbuf->k.d_reclen);
|
||||||
|
+ p += reclen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
Index: glibc-2.28/sysdeps/unix/sysv/linux/tst-readdir64-compat.c
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ glibc-2.28/sysdeps/unix/sysv/linux/tst-readdir64-compat.c
|
||||||
|
@@ -0,0 +1,111 @@
|
||||||
|
+/* Test readdir64 compatibility symbol.
|
||||||
|
+ Copyright (C) 2018 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/>. */
|
||||||
|
+
|
||||||
|
+#include <dirent.h>
|
||||||
|
+#include <dlfcn.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <shlib-compat.h>
|
||||||
|
+#include <stdbool.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
+
|
||||||
|
+/* Copied from <olddirent.h>. */
|
||||||
|
+struct __old_dirent64
|
||||||
|
+ {
|
||||||
|
+ __ino_t d_ino;
|
||||||
|
+ __off64_t d_off;
|
||||||
|
+ unsigned short int d_reclen;
|
||||||
|
+ unsigned char d_type;
|
||||||
|
+ char d_name[256];
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+typedef struct __old_dirent64 *(*compat_readdir64_type) (DIR *);
|
||||||
|
+
|
||||||
|
+#if TEST_COMPAT (libc, GLIBC_2_1, GLIBC_2_2)
|
||||||
|
+struct __old_dirent64 *compat_readdir64 (DIR *);
|
||||||
|
+compat_symbol_reference (libc, compat_readdir64, readdir64, GLIBC_2_1);
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+#if TEST_COMPAT (libc, GLIBC_2_1, GLIBC_2_2)
|
||||||
|
+
|
||||||
|
+ /* Directory stream using the non-compat readdir64 symbol. The test
|
||||||
|
+ checks against this. */
|
||||||
|
+ DIR *dir_reference = opendir (".");
|
||||||
|
+ TEST_VERIFY_EXIT (dir_reference != NULL);
|
||||||
|
+ DIR *dir_test = opendir (".");
|
||||||
|
+ TEST_VERIFY_EXIT (dir_test != NULL);
|
||||||
|
+
|
||||||
|
+ /* This loop assumes that the enumeration order is consistent for
|
||||||
|
+ two different handles. Nothing should write to the current
|
||||||
|
+ directory (in the source tree) while this test runs, so there
|
||||||
|
+ should not be any difference due to races. */
|
||||||
|
+ size_t count = 0;
|
||||||
|
+ while (true)
|
||||||
|
+ {
|
||||||
|
+ errno = 0;
|
||||||
|
+ struct dirent64 *entry_reference = readdir64 (dir_reference);
|
||||||
|
+ if (entry_reference == NULL && errno != 0)
|
||||||
|
+ FAIL_EXIT1 ("readdir64 entry %zu: %m\n", count);
|
||||||
|
+ struct __old_dirent64 *entry_test = compat_readdir64 (dir_test);
|
||||||
|
+ if (entry_reference == NULL)
|
||||||
|
+ {
|
||||||
|
+ if (errno == EOVERFLOW)
|
||||||
|
+ {
|
||||||
|
+ TEST_VERIFY (entry_reference->d_ino
|
||||||
|
+ != (__ino_t) entry_reference->d_ino);
|
||||||
|
+ printf ("info: inode number overflow at entry %zu\n", count);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ if (errno != 0)
|
||||||
|
+ FAIL_EXIT1 ("compat readdir64 entry %zu: %m\n", count);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Check that both streams end at the same time. */
|
||||||
|
+ if (entry_reference == NULL)
|
||||||
|
+ {
|
||||||
|
+ TEST_VERIFY (entry_test == NULL);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ TEST_VERIFY_EXIT (entry_test != NULL);
|
||||||
|
+
|
||||||
|
+ /* Check that the entries are the same. */
|
||||||
|
+ TEST_COMPARE_BLOB (entry_reference->d_name,
|
||||||
|
+ strlen (entry_reference->d_name),
|
||||||
|
+ entry_test->d_name, strlen (entry_test->d_name));
|
||||||
|
+ TEST_COMPARE (entry_reference->d_ino, entry_test->d_ino);
|
||||||
|
+ TEST_COMPARE (entry_reference->d_off, entry_test->d_off);
|
||||||
|
+ TEST_COMPARE (entry_reference->d_type, entry_test->d_type);
|
||||||
|
+ TEST_COMPARE (entry_reference->d_reclen, entry_test->d_reclen);
|
||||||
|
+
|
||||||
|
+ ++count;
|
||||||
|
+ }
|
||||||
|
+ printf ("info: %zu directory entries found\n", count);
|
||||||
|
+ TEST_VERIFY (count >= 3); /* ".", "..", and some source files. */
|
||||||
|
+
|
||||||
|
+ TEST_COMPARE (closedir (dir_test), 0);
|
||||||
|
+ TEST_COMPARE (closedir (dir_reference), 0);
|
||||||
|
+#endif
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
27
pthread-cond-broadcast-waiters-after-spinning.patch
Normal file
27
pthread-cond-broadcast-waiters-after-spinning.patch
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
2018-08-27 Martin Kuchta <martin.kuchta@netapp.com>
|
||||||
|
Torvald Riegel <triegel@redhat.com>
|
||||||
|
|
||||||
|
[BZ #23538]
|
||||||
|
* nptl/pthread_cond_common.c (__condvar_quiesce_and_switch_g1):
|
||||||
|
Update r to include the set wake-request flag if waiters are
|
||||||
|
remaining after spinning.
|
||||||
|
|
||||||
|
Index: glibc-2.28/nptl/pthread_cond_common.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/nptl/pthread_cond_common.c
|
||||||
|
+++ glibc-2.28/nptl/pthread_cond_common.c
|
||||||
|
@@ -405,8 +405,12 @@ __condvar_quiesce_and_switch_g1 (pthread
|
||||||
|
{
|
||||||
|
/* There is still a waiter after spinning. Set the wake-request
|
||||||
|
flag and block. Relaxed MO is fine because this is just about
|
||||||
|
- this futex word. */
|
||||||
|
- r = atomic_fetch_or_relaxed (cond->__data.__g_refs + g1, 1);
|
||||||
|
+ this futex word.
|
||||||
|
+
|
||||||
|
+ Update r to include the set wake-request flag so that the upcoming
|
||||||
|
+ futex_wait only blocks if the flag is still set (otherwise, we'd
|
||||||
|
+ violate the basic client-side futex protocol). */
|
||||||
|
+ r = atomic_fetch_or_relaxed (cond->__data.__g_refs + g1, 1) | 1;
|
||||||
|
|
||||||
|
if ((r >> 1) > 0)
|
||||||
|
futex_wait_simple (cond->__data.__g_refs + g1, r, private);
|
261
regex-uninit-memory-access.patch
Normal file
261
regex-uninit-memory-access.patch
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
2018-08-28 Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
[BZ #23578]
|
||||||
|
* posix/tst-regcomp-truncated.c: New file.
|
||||||
|
* posix/Makefile (tests): Add it.
|
||||||
|
(tst-regcomp-truncated.out): Depend on generated locales.
|
||||||
|
|
||||||
|
2018-08-25 Paul Eggert <eggert@cs.ucla.edu>
|
||||||
|
|
||||||
|
[BZ #23578]
|
||||||
|
regex: fix uninitialized memory access
|
||||||
|
I introduced this bug into gnulib in commit
|
||||||
|
8335a4d6c7b4448cd0bcb6d0bebf1d456bcfdb17 dated 2006-04-10;
|
||||||
|
eventually it was merged into glibc. The bug was found by
|
||||||
|
project-repo <bugs@feusi.co> and reported here:
|
||||||
|
https://lists.gnu.org/r/sed-devel/2018-08/msg00017.html
|
||||||
|
Diagnosis and draft fix reported by Assaf Gordon here:
|
||||||
|
https://lists.gnu.org/r/bug-gnulib/2018-08/msg00071.html
|
||||||
|
https://lists.gnu.org/r/bug-gnulib/2018-08/msg00142.html
|
||||||
|
* posix/regex_internal.c (build_wcs_upper_buffer):
|
||||||
|
Fix bug when mbrtowc returns 0.
|
||||||
|
|
||||||
|
Index: glibc-2.28/posix/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/posix/Makefile
|
||||||
|
+++ glibc-2.28/posix/Makefile
|
||||||
|
@@ -96,7 +96,7 @@ tests := test-errno tstgetopt testfnm r
|
||||||
|
tst-posix_fadvise tst-posix_fadvise64 \
|
||||||
|
tst-sysconf-empty-chroot tst-glob_symlinks tst-fexecve \
|
||||||
|
tst-glob-tilde test-ssize-max tst-spawn4 bug-regex37 \
|
||||||
|
- bug-regex38
|
||||||
|
+ bug-regex38 tst-regcomp-truncated
|
||||||
|
tests-internal := bug-regex5 bug-regex20 bug-regex33 \
|
||||||
|
tst-rfc3484 tst-rfc3484-2 tst-rfc3484-3 \
|
||||||
|
tst-glob_lstat_compat tst-spawn4-compat
|
||||||
|
@@ -194,6 +194,7 @@ $(objpfx)tst-regex2.out: $(gen-locales)
|
||||||
|
$(objpfx)tst-regexloc.out: $(gen-locales)
|
||||||
|
$(objpfx)tst-rxspencer.out: $(gen-locales)
|
||||||
|
$(objpfx)tst-rxspencer-no-utf8.out: $(gen-locales)
|
||||||
|
+$(objpfx)tst-regcomp-truncated.out: $(gen-locales)
|
||||||
|
endif
|
||||||
|
|
||||||
|
# If we will use the generic uname implementation, we must figure out what
|
||||||
|
Index: glibc-2.28/posix/regex_internal.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/posix/regex_internal.c
|
||||||
|
+++ glibc-2.28/posix/regex_internal.c
|
||||||
|
@@ -317,7 +317,7 @@ build_wcs_upper_buffer (re_string_t *pst
|
||||||
|
mbclen = __mbrtowc (&wc,
|
||||||
|
((const char *) pstr->raw_mbs + pstr->raw_mbs_idx
|
||||||
|
+ byte_idx), remain_len, &pstr->cur_state);
|
||||||
|
- if (BE (mbclen < (size_t) -2, 1))
|
||||||
|
+ if (BE (0 < mbclen && mbclen < (size_t) -2, 1))
|
||||||
|
{
|
||||||
|
wchar_t wcu = __towupper (wc);
|
||||||
|
if (wcu != wc)
|
||||||
|
@@ -386,7 +386,7 @@ build_wcs_upper_buffer (re_string_t *pst
|
||||||
|
else
|
||||||
|
p = (const char *) pstr->raw_mbs + pstr->raw_mbs_idx + src_idx;
|
||||||
|
mbclen = __mbrtowc (&wc, p, remain_len, &pstr->cur_state);
|
||||||
|
- if (BE (mbclen < (size_t) -2, 1))
|
||||||
|
+ if (BE (0 < mbclen && mbclen < (size_t) -2, 1))
|
||||||
|
{
|
||||||
|
wchar_t wcu = __towupper (wc);
|
||||||
|
if (wcu != wc)
|
||||||
|
Index: glibc-2.28/posix/tst-regcomp-truncated.c
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ glibc-2.28/posix/tst-regcomp-truncated.c
|
||||||
|
@@ -0,0 +1,191 @@
|
||||||
|
+/* Test compilation of truncated regular expressions.
|
||||||
|
+ Copyright (C) 2018 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/>. */
|
||||||
|
+
|
||||||
|
+/* This test constructs various patterns in an attempt to trigger
|
||||||
|
+ over-reading the regular expression compiler, such as bug
|
||||||
|
+ 23578. */
|
||||||
|
+
|
||||||
|
+#include <array_length.h>
|
||||||
|
+#include <errno.h>
|
||||||
|
+#include <locale.h>
|
||||||
|
+#include <regex.h>
|
||||||
|
+#include <stdio.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+#include <support/check.h>
|
||||||
|
+#include <support/next_to_fault.h>
|
||||||
|
+#include <support/support.h>
|
||||||
|
+#include <support/test-driver.h>
|
||||||
|
+#include <wchar.h>
|
||||||
|
+
|
||||||
|
+/* Locales to test. */
|
||||||
|
+static const char locales[][17] =
|
||||||
|
+ {
|
||||||
|
+ "C",
|
||||||
|
+ "en_US.UTF-8",
|
||||||
|
+ "de_DE.ISO-8859-1",
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+/* Syntax options. Will be combined with other flags. */
|
||||||
|
+static const reg_syntax_t syntaxes[] =
|
||||||
|
+ {
|
||||||
|
+ RE_SYNTAX_EMACS,
|
||||||
|
+ RE_SYNTAX_AWK,
|
||||||
|
+ RE_SYNTAX_GNU_AWK,
|
||||||
|
+ RE_SYNTAX_POSIX_AWK,
|
||||||
|
+ RE_SYNTAX_GREP,
|
||||||
|
+ RE_SYNTAX_EGREP,
|
||||||
|
+ RE_SYNTAX_POSIX_EGREP,
|
||||||
|
+ RE_SYNTAX_POSIX_BASIC,
|
||||||
|
+ RE_SYNTAX_POSIX_EXTENDED,
|
||||||
|
+ RE_SYNTAX_POSIX_MINIMAL_EXTENDED,
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+/* Trailing characters placed after the initial character. */
|
||||||
|
+static const char trailing_strings[][4] =
|
||||||
|
+ {
|
||||||
|
+ "",
|
||||||
|
+ "[",
|
||||||
|
+ "\\",
|
||||||
|
+ "[\\",
|
||||||
|
+ "(",
|
||||||
|
+ "(\\",
|
||||||
|
+ "\\(",
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+do_test (void)
|
||||||
|
+{
|
||||||
|
+ /* Staging buffer for the constructed regular expression. */
|
||||||
|
+ char buffer[16];
|
||||||
|
+
|
||||||
|
+ /* Allocation used to detect over-reading by the regular expression
|
||||||
|
+ compiler. */
|
||||||
|
+ struct support_next_to_fault ntf
|
||||||
|
+ = support_next_to_fault_allocate (sizeof (buffer));
|
||||||
|
+
|
||||||
|
+ /* Arbitrary Unicode codepoint at which we stop generating
|
||||||
|
+ characters. We do not probe the whole range because that would
|
||||||
|
+ take too long due to combinatorical exploision as the result of
|
||||||
|
+ combination with other flags. */
|
||||||
|
+ static const wchar_t last_character = 0xfff;
|
||||||
|
+
|
||||||
|
+ for (size_t locale_idx = 0; locale_idx < array_length (locales);
|
||||||
|
+ ++ locale_idx)
|
||||||
|
+ {
|
||||||
|
+ if (setlocale (LC_ALL, locales[locale_idx]) == NULL)
|
||||||
|
+ {
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ printf ("error: setlocale (\"%s\"): %m", locales[locale_idx]);
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ if (test_verbose > 0)
|
||||||
|
+ printf ("info: testing locale \"%s\"\n", locales[locale_idx]);
|
||||||
|
+
|
||||||
|
+ for (wchar_t wc = 0; wc <= last_character; ++wc)
|
||||||
|
+ {
|
||||||
|
+ char *after_wc;
|
||||||
|
+ if (wc == 0)
|
||||||
|
+ {
|
||||||
|
+ /* wcrtomb treats L'\0' in a special way. */
|
||||||
|
+ *buffer = '\0';
|
||||||
|
+ after_wc = &buffer[1];
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ mbstate_t ps = { };
|
||||||
|
+ size_t ret = wcrtomb (buffer, wc, &ps);
|
||||||
|
+ if (ret == (size_t) -1)
|
||||||
|
+ {
|
||||||
|
+ /* EILSEQ means that the target character set
|
||||||
|
+ cannot encode the character. */
|
||||||
|
+ if (errno != EILSEQ)
|
||||||
|
+ {
|
||||||
|
+ support_record_failure ();
|
||||||
|
+ printf ("error: wcrtomb (0x%x) failed: %m\n",
|
||||||
|
+ (unsigned) wc);
|
||||||
|
+ }
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+ TEST_VERIFY_EXIT (ret != 0);
|
||||||
|
+ after_wc = &buffer[ret];
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ for (size_t trailing_idx = 0;
|
||||||
|
+ trailing_idx < array_length (trailing_strings);
|
||||||
|
+ ++trailing_idx)
|
||||||
|
+ {
|
||||||
|
+ char *after_trailing
|
||||||
|
+ = stpcpy (after_wc, trailing_strings[trailing_idx]);
|
||||||
|
+
|
||||||
|
+ for (int do_nul = 0; do_nul < 2; ++do_nul)
|
||||||
|
+ {
|
||||||
|
+ char *after_nul;
|
||||||
|
+ if (do_nul)
|
||||||
|
+ {
|
||||||
|
+ *after_trailing = '\0';
|
||||||
|
+ after_nul = &after_trailing[1];
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ after_nul = after_trailing;
|
||||||
|
+
|
||||||
|
+ size_t length = after_nul - buffer;
|
||||||
|
+
|
||||||
|
+ /* Make sure that the faulting region starts
|
||||||
|
+ after the used portion of the buffer. */
|
||||||
|
+ char *ntf_start = ntf.buffer + sizeof (buffer) - length;
|
||||||
|
+ memcpy (ntf_start, buffer, length);
|
||||||
|
+
|
||||||
|
+ for (const reg_syntax_t *psyntax = syntaxes;
|
||||||
|
+ psyntax < array_end (syntaxes); ++psyntax)
|
||||||
|
+ for (int do_icase = 0; do_icase < 2; ++do_icase)
|
||||||
|
+ {
|
||||||
|
+ re_syntax_options = *psyntax;
|
||||||
|
+ if (do_icase)
|
||||||
|
+ re_syntax_options |= RE_ICASE;
|
||||||
|
+
|
||||||
|
+ regex_t reg;
|
||||||
|
+ memset (®, 0, sizeof (reg));
|
||||||
|
+ const char *msg = re_compile_pattern
|
||||||
|
+ (ntf_start, length, ®);
|
||||||
|
+ if (msg != NULL)
|
||||||
|
+ {
|
||||||
|
+ if (test_verbose > 0)
|
||||||
|
+ {
|
||||||
|
+ char *quoted = support_quote_blob
|
||||||
|
+ (buffer, length);
|
||||||
|
+ printf ("info: compilation failed for pattern"
|
||||||
|
+ " \"%s\", syntax 0x%lx: %s\n",
|
||||||
|
+ quoted, re_syntax_options, msg);
|
||||||
|
+ free (quoted);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ regfree (®);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ support_next_to_fault_free (&ntf);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#include <support/test-driver.c>
|
19
riscv-feholdexcept-setround.patch
Normal file
19
riscv-feholdexcept-setround.patch
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
2018-08-03 DJ Delorie <dj@redhat.com>
|
||||||
|
|
||||||
|
* sysdeps/riscv/rvf/math_private.h (libc_feholdexcept_setround_riscv):
|
||||||
|
Move libc_fesetround_riscv after libc_feholdexcept_riscv.
|
||||||
|
|
||||||
|
Index: glibc-2.28/sysdeps/riscv/rvf/math_private.h
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/sysdeps/riscv/rvf/math_private.h
|
||||||
|
+++ glibc-2.28/sysdeps/riscv/rvf/math_private.h
|
||||||
|
@@ -72,8 +72,8 @@ libc_fesetround_riscv (int round)
|
||||||
|
static __always_inline void
|
||||||
|
libc_feholdexcept_setround_riscv (fenv_t *envp, int round)
|
||||||
|
{
|
||||||
|
- libc_fesetround_riscv (round);
|
||||||
|
libc_feholdexcept_riscv (envp);
|
||||||
|
+ libc_fesetround_riscv (round);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define libc_feholdexcept_setround libc_feholdexcept_setround_riscv
|
18
spawni-maybe-script-execute.patch
Normal file
18
spawni-maybe-script-execute.patch
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
2018-09-06 Stefan Liebler <stli@linux.ibm.com>
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/spawni.c (maybe_script_execute):
|
||||||
|
Increment size of new_argv by one.
|
||||||
|
|
||||||
|
Index: glibc-2.28/sysdeps/unix/sysv/linux/spawni.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/sysdeps/unix/sysv/linux/spawni.c
|
||||||
|
+++ glibc-2.28/sysdeps/unix/sysv/linux/spawni.c
|
||||||
|
@@ -101,7 +101,7 @@ maybe_script_execute (struct posix_spawn
|
||||||
|
ptrdiff_t argc = args->argc;
|
||||||
|
|
||||||
|
/* Construct an argument list for the shell. */
|
||||||
|
- char *new_argv[argc + 1];
|
||||||
|
+ char *new_argv[argc + 2];
|
||||||
|
new_argv[0] = (char *) _PATH_BSHELL;
|
||||||
|
new_argv[1] = (char *) args->file;
|
||||||
|
if (argc > 1)
|
95
strstr-huge-needle.patch
Normal file
95
strstr-huge-needle.patch
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
2018-09-19 Wilco Dijkstra <wdijkstr@arm.com>
|
||||||
|
|
||||||
|
[BZ #23637]
|
||||||
|
* string/test-strstr.c (pr23637): New function.
|
||||||
|
(test_main): Add tests with longer needles.
|
||||||
|
* string/strcasestr.c (AVAILABLE): Fix readahead distance.
|
||||||
|
* string/strstr.c (AVAILABLE): Likewise.
|
||||||
|
|
||||||
|
Index: glibc-2.28/string/strcasestr.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/string/strcasestr.c
|
||||||
|
+++ glibc-2.28/string/strcasestr.c
|
||||||
|
@@ -37,8 +37,9 @@
|
||||||
|
/* Two-Way algorithm. */
|
||||||
|
#define RETURN_TYPE char *
|
||||||
|
#define AVAILABLE(h, h_l, j, n_l) \
|
||||||
|
- (((j) + (n_l) <= (h_l)) || ((h_l) += __strnlen ((void*)((h) + (h_l)), 512), \
|
||||||
|
- (j) + (n_l) <= (h_l)))
|
||||||
|
+ (((j) + (n_l) <= (h_l)) \
|
||||||
|
+ || ((h_l) += __strnlen ((void*)((h) + (h_l)), (n_l) + 512), \
|
||||||
|
+ (j) + (n_l) <= (h_l)))
|
||||||
|
#define CHECK_EOL (1)
|
||||||
|
#define RET0_IF_0(a) if (!a) goto ret0
|
||||||
|
#define CANON_ELEMENT(c) TOLOWER (c)
|
||||||
|
Index: glibc-2.28/string/strstr.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/string/strstr.c
|
||||||
|
+++ glibc-2.28/string/strstr.c
|
||||||
|
@@ -33,8 +33,9 @@
|
||||||
|
|
||||||
|
#define RETURN_TYPE char *
|
||||||
|
#define AVAILABLE(h, h_l, j, n_l) \
|
||||||
|
- (((j) + (n_l) <= (h_l)) || ((h_l) += __strnlen ((void*)((h) + (h_l)), 512), \
|
||||||
|
- (j) + (n_l) <= (h_l)))
|
||||||
|
+ (((j) + (n_l) <= (h_l)) \
|
||||||
|
+ || ((h_l) += __strnlen ((void*)((h) + (h_l)), (n_l) + 512), \
|
||||||
|
+ (j) + (n_l) <= (h_l)))
|
||||||
|
#define CHECK_EOL (1)
|
||||||
|
#define RET0_IF_0(a) if (!a) goto ret0
|
||||||
|
#define FASTSEARCH(S,C,N) (void*) strchr ((void*)(S), (C))
|
||||||
|
Index: glibc-2.28/string/test-strstr.c
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/string/test-strstr.c
|
||||||
|
+++ glibc-2.28/string/test-strstr.c
|
||||||
|
@@ -151,6 +151,32 @@ check2 (void)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+#define N 1024
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+pr23637 (void)
|
||||||
|
+{
|
||||||
|
+ char *h = (char*) buf1;
|
||||||
|
+ char *n = (char*) buf2;
|
||||||
|
+
|
||||||
|
+ for (int i = 0; i < N; i++)
|
||||||
|
+ {
|
||||||
|
+ n[i] = 'x';
|
||||||
|
+ h[i] = ' ';
|
||||||
|
+ h[i + N] = 'x';
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ n[N] = '\0';
|
||||||
|
+ h[N * 2] = '\0';
|
||||||
|
+
|
||||||
|
+ /* Ensure we don't match at the first 'x'. */
|
||||||
|
+ h[0] = 'x';
|
||||||
|
+
|
||||||
|
+ char *exp_result = stupid_strstr (h, n);
|
||||||
|
+ FOR_EACH_IMPL (impl, 0)
|
||||||
|
+ check_result (impl, h, n, exp_result);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int
|
||||||
|
test_main (void)
|
||||||
|
{
|
||||||
|
@@ -158,6 +184,7 @@ test_main (void)
|
||||||
|
|
||||||
|
check1 ();
|
||||||
|
check2 ();
|
||||||
|
+ pr23637 ();
|
||||||
|
|
||||||
|
printf ("%23s", "");
|
||||||
|
FOR_EACH_IMPL (impl, 0)
|
||||||
|
@@ -202,6 +229,9 @@ test_main (void)
|
||||||
|
do_test (15, 9, hlen, klen, 1);
|
||||||
|
do_test (15, 15, hlen, klen, 0);
|
||||||
|
do_test (15, 15, hlen, klen, 1);
|
||||||
|
+
|
||||||
|
+ do_test (15, 15, hlen + klen * 4, klen * 4, 0);
|
||||||
|
+ do_test (15, 15, hlen + klen * 4, klen * 4, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
do_test (0, 0, page_size - 1, 16, 0);
|
131
unwind-ctor.patch
Normal file
131
unwind-ctor.patch
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
2018-09-26 Andreas Schwab <schwab@suse.de>
|
||||||
|
|
||||||
|
[BZ #23707]
|
||||||
|
* sysdeps/powerpc/powerpc32/dl-start.S: Add unwind information.
|
||||||
|
* elf/Makefile (tests): Add tst-unwind-ctor.
|
||||||
|
(modules-names): Add tst-unwind-ctor-lib.
|
||||||
|
($(objpfx)tst-unwind-ctor): Depend on
|
||||||
|
$(objpfx)tst-unwind-ctor-lib.so.
|
||||||
|
|
||||||
|
Index: glibc-2.28/elf/Makefile
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/elf/Makefile
|
||||||
|
+++ glibc-2.28/elf/Makefile
|
||||||
|
@@ -186,7 +186,8 @@ tests += restest1 preloadtest loadfail m
|
||||||
|
tst-tlsalign tst-tlsalign-extern tst-nodelete-opened \
|
||||||
|
tst-nodelete2 tst-audit11 tst-audit12 tst-dlsym-error tst-noload \
|
||||||
|
tst-latepthread tst-tls-manydynamic tst-nodelete-dlclose \
|
||||||
|
- tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note
|
||||||
|
+ tst-debug1 tst-main1 tst-absolute-sym tst-absolute-zero tst-big-note \
|
||||||
|
+ tst-unwind-ctor
|
||||||
|
# reldep9
|
||||||
|
tests-internal += loadtest unload unload2 circleload1 \
|
||||||
|
neededtest neededtest2 neededtest3 neededtest4 \
|
||||||
|
@@ -273,7 +274,7 @@ modules-names = testobj1 testobj2 testob
|
||||||
|
tst-latepthreadmod $(tst-tls-many-dynamic-modules) \
|
||||||
|
tst-nodelete-dlclose-dso tst-nodelete-dlclose-plugin \
|
||||||
|
tst-main1mod tst-libc_dlvsym-dso tst-absolute-sym-lib \
|
||||||
|
- tst-absolute-zero-lib tst-big-note-lib
|
||||||
|
+ tst-absolute-zero-lib tst-big-note-lib tst-unwind-ctor-lib
|
||||||
|
|
||||||
|
ifeq (yes,$(have-mtls-dialect-gnu2))
|
||||||
|
tests += tst-gnu2-tls1
|
||||||
|
@@ -1484,3 +1485,5 @@ tst-libc_dlvsym-static-ENV = \
|
||||||
|
$(objpfx)tst-libc_dlvsym-static.out: $(objpfx)tst-libc_dlvsym-dso.so
|
||||||
|
|
||||||
|
$(objpfx)tst-big-note: $(objpfx)tst-big-note-lib.so
|
||||||
|
+
|
||||||
|
+$(objpfx)tst-unwind-ctor: $(objpfx)tst-unwind-ctor-lib.so
|
||||||
|
Index: glibc-2.28/elf/tst-unwind-ctor-lib.c
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ glibc-2.28/elf/tst-unwind-ctor-lib.c
|
||||||
|
@@ -0,0 +1,42 @@
|
||||||
|
+/* Unit test for _Unwind_Backtrace in a shared object constructor.
|
||||||
|
+ Copyright (C) 2018 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/>. */
|
||||||
|
+
|
||||||
|
+#include <unwind.h>
|
||||||
|
+#include <unistd.h>
|
||||||
|
+
|
||||||
|
+static _Unwind_Reason_Code
|
||||||
|
+callback (struct _Unwind_Context *ctx, void *arg)
|
||||||
|
+{
|
||||||
|
+ return _URC_NO_REASON;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+__attribute__ ((constructor))
|
||||||
|
+do_unwind (void)
|
||||||
|
+{
|
||||||
|
+ /* Arrange for this test to be killed if _Unwind_Backtrace runs into an
|
||||||
|
+ endless loop. We cannot use the test driver since the test needs to
|
||||||
|
+ run in a constructor. */
|
||||||
|
+ alarm (20);
|
||||||
|
+ _Unwind_Backtrace (callback, 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+dummy (void)
|
||||||
|
+{
|
||||||
|
+}
|
||||||
|
Index: glibc-2.28/elf/tst-unwind-ctor.c
|
||||||
|
===================================================================
|
||||||
|
--- /dev/null
|
||||||
|
+++ glibc-2.28/elf/tst-unwind-ctor.c
|
||||||
|
@@ -0,0 +1,27 @@
|
||||||
|
+/* Unit test for _Unwind_Backtrace in a shared object constructor.
|
||||||
|
+ Copyright (C) 2018 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/>. */
|
||||||
|
+
|
||||||
|
+extern void dummy (void);
|
||||||
|
+
|
||||||
|
+int
|
||||||
|
+main (void)
|
||||||
|
+{
|
||||||
|
+ /* Just call a dummy function in the shared library. The actual test
|
||||||
|
+ runs in its constructor. */
|
||||||
|
+ dummy ();
|
||||||
|
+}
|
||||||
|
Index: glibc-2.28/sysdeps/powerpc/powerpc32/dl-start.S
|
||||||
|
===================================================================
|
||||||
|
--- glibc-2.28.orig/sysdeps/powerpc/powerpc32/dl-start.S
|
||||||
|
+++ glibc-2.28/sysdeps/powerpc/powerpc32/dl-start.S
|
||||||
|
@@ -34,6 +34,9 @@ ENTRY(_start)
|
||||||
|
_dl_start to save the link register). */
|
||||||
|
li r4,0
|
||||||
|
addi r1,r1,-16
|
||||||
|
+ cfi_adjust_cfa_offset (16)
|
||||||
|
+/* Mark lr as undefined to stop unwinding. */
|
||||||
|
+ cfi_undefined (lr)
|
||||||
|
stw r4,0(r1)
|
||||||
|
bl _dl_start@local
|
||||||
|
|
Loading…
Reference in New Issue
Block a user