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
This commit is contained in:
parent
237161f1b6
commit
17f675073d
97
0001-testsuite-Fix-uname-during-glibc-startup.patch
Normal file
97
0001-testsuite-Fix-uname-during-glibc-startup.patch
Normal file
@ -0,0 +1,97 @@
|
||||
From 4d392fa63af7f3fd09fdb49120864af1404d1a25 Mon Sep 17 00:00:00 2001
|
||||
From: Michal Marek <mmarek@suse.cz>
|
||||
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=<optimized out>,
|
||||
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=<optimized out>,
|
||||
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 <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
+#include <unistd.h>
|
||||
|
||||
#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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user