From 17f675073d06dbfd6098b0f0fb362986d05b565f2a959daa39c0f20d835e287b Mon Sep 17 00:00:00 2001 From: Jan Engelhardt Date: Fri, 7 Mar 2014 15:06:38 +0000 Subject: [PATCH] Accepting request 224989 from home:michal-m:branches:Base:System - testsuite: Fix uname() during glibc startup OBS-URL: https://build.opensuse.org/request/show/224989 OBS-URL: https://build.opensuse.org/package/show/Base:System/kmod?expand=0&rev=66 --- ...suite-Fix-uname-during-glibc-startup.patch | 97 +++++++++++++++++++ kmod.changes | 5 + kmod.spec | 2 + 3 files changed, 104 insertions(+) create mode 100644 0001-testsuite-Fix-uname-during-glibc-startup.patch diff --git a/0001-testsuite-Fix-uname-during-glibc-startup.patch b/0001-testsuite-Fix-uname-during-glibc-startup.patch new file mode 100644 index 0000000..5394057 --- /dev/null +++ b/0001-testsuite-Fix-uname-during-glibc-startup.patch @@ -0,0 +1,97 @@ +From 4d392fa63af7f3fd09fdb49120864af1404d1a25 Mon Sep 17 00:00:00 2001 +From: Michal Marek +Date: Thu, 6 Mar 2014 18:03:46 +0100 +Subject: [PATCH] testsuite: Fix uname() during glibc startup + +In a specific configuration (chroot with the linux32 personality), the +modprobe_install_cmd_loop test failed, because the bash process handling +the install command segfaulted. The backtrace showed a uname() call +during libpthread initialization, at which point the environ pointer +hadn't been initialized yet: + + Program terminated with signal SIGSEGV, Segmentation fault. + #0 0x080c1591 in getenv (name=, + name@entry=0xf775f850 "TESTSUITE_UNAME_R") at getenv.c:81 + 81 for (i = 0, len = strlen (name); environ[i]; i++) + (gdb) bt + #0 0x080c1591 in getenv (name=, + name@entry=0xf775f850 "TESTSUITE_UNAME_R") at getenv.c:81 + #1 0xf775f754 in uname (u=u@entry=0xff946350) at testsuite/uname.c:32 + #2 0xf74ffc6c in is_smp_system () + at ../nptl/sysdeps/unix/sysv/linux/i386/smp.h:39 + #3 __pthread_initialize_minimal_internal () at nptl-init.c:460 + #4 0xf74fe32c in _init () at ../sysdeps/i386/crti.S:74 + #5 0x00000000 in ?? () + (gdb) p environ + $1 = (char **) 0x0 + +I don't know why it only happend in the chroot, but glibc can call its +own functions and impose any restrictions before main() is started, so +we have to adapt. + +Also, do not return error if there is an environment, but the +environment variable is not found. If uname() is called by kmod, then +the respective test will simply fail later. If it's something else +calling uname(), then we do not want to disturb the program. + +Patch-mainline: v17 +Git-commit: 632fb7b4634a540bb09af3b2004b3fe44cd4a214 +--- + testsuite/uname.c | 24 ++++++++++++++++-------- + 1 file changed, 16 insertions(+), 8 deletions(-) + +diff --git a/testsuite/uname.c b/testsuite/uname.c +index 2ada200..f55c435 100644 +--- a/testsuite/uname.c ++++ b/testsuite/uname.c +@@ -22,6 +22,7 @@ + #include + #include + #include ++#include + + #include "testsuite.h" + +@@ -29,17 +30,10 @@ TS_EXPORT int uname(struct utsname *u) + { + static void *nextlib = NULL; + static int (*nextlib_uname)(struct utsname *u); +- const char *release = getenv(S_TC_UNAME_R); ++ const char *release; + int err; + size_t sz; + +- if (release == NULL) { +- fprintf(stderr, "TRAP uname(): missing export %s?\n", +- S_TC_UNAME_R); +- errno = EFAULT; +- return -1; +- } +- + if (nextlib == NULL) { + #ifdef RTLD_NEXT + nextlib = RTLD_NEXT; +@@ -53,6 +47,20 @@ TS_EXPORT int uname(struct utsname *u) + if (err < 0) + return err; + ++ if (!environ) ++ /* ++ * probably called from within glibc before main(); unsafe ++ * to call getenv() ++ */ ++ return 0; ++ ++ release = getenv(S_TC_UNAME_R); ++ if (release == NULL) { ++ fprintf(stderr, "TRAP uname(): missing export %s?\n", ++ S_TC_UNAME_R); ++ return 0; ++ } ++ + sz = strlen(release) + 1; + if (sz > sizeof(u->release)) { + fprintf(stderr, "uname(): sizeof release (%s) " +-- +1.8.4.5 + diff --git a/kmod.changes b/kmod.changes index 7e1c20c..8f2759d 100644 --- a/kmod.changes +++ b/kmod.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Fri Mar 7 09:25:02 UTC 2014 - mmarek@suse.cz + +- testsuite: Fix uname() during glibc startup + ------------------------------------------------------------------- Wed Mar 5 14:50:34 UTC 2014 - mmarek@suse.cz diff --git a/kmod.spec b/kmod.spec index 6259db6..55c13b1 100644 --- a/kmod.spec +++ b/kmod.spec @@ -42,6 +42,7 @@ Patch7: 0007-Add-some-tests-for-kernels-without-finit_module-2.patch Patch8: 0008-libkmod-module-Simplify-kmod_module_insert_module.patch Patch9: 0009-libkmod-Implement-filtering-of-unsupported-modules-o.patch Patch10: 0010-modprobe-Implement-allow-unsupported-modules.patch +Patch11: 0001-testsuite-Fix-uname-during-glibc-startup.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: autoconf BuildRequires: automake @@ -122,6 +123,7 @@ touch man/rmmod.8 %patch8 -p1 %patch9 -p1 %patch10 -p1 +%patch11 -p1 %build autoreconf -fi