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
|
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
|
Patch8: 0008-libkmod-module-Simplify-kmod_module_insert_module.patch
|
||||||
Patch9: 0009-libkmod-Implement-filtering-of-unsupported-modules-o.patch
|
Patch9: 0009-libkmod-Implement-filtering-of-unsupported-modules-o.patch
|
||||||
Patch10: 0010-modprobe-Implement-allow-unsupported-modules.patch
|
Patch10: 0010-modprobe-Implement-allow-unsupported-modules.patch
|
||||||
|
Patch11: 0001-testsuite-Fix-uname-during-glibc-startup.patch
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
BuildRequires: autoconf
|
BuildRequires: autoconf
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
@ -122,6 +123,7 @@ touch man/rmmod.8
|
|||||||
%patch8 -p1
|
%patch8 -p1
|
||||||
%patch9 -p1
|
%patch9 -p1
|
||||||
%patch10 -p1
|
%patch10 -p1
|
||||||
|
%patch11 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
autoreconf -fi
|
autoreconf -fi
|
||||||
|
Loading…
Reference in New Issue
Block a user