All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] testsuite: Fix uname() during glibc startup
@ 2014-03-06 17:03 Michal Marek
  2014-03-07  2:11 ` Lucas De Marchi
  0 siblings, 1 reply; 2+ messages in thread
From: Michal Marek @ 2014-03-06 17:03 UTC (permalink / raw)
  To: linux-modules

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.
---
 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


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] testsuite: Fix uname() during glibc startup
  2014-03-06 17:03 [PATCH] testsuite: Fix uname() during glibc startup Michal Marek
@ 2014-03-07  2:11 ` Lucas De Marchi
  0 siblings, 0 replies; 2+ messages in thread
From: Lucas De Marchi @ 2014-03-07  2:11 UTC (permalink / raw)
  To: Michal Marek; +Cc: linux-modules

Hi,

On Thu, Mar 6, 2014 at 2:03 PM, Michal Marek <mmarek@suse.cz> wrote:
> 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.
> ---
>  testsuite/uname.c | 24 ++++++++++++++++--------
>  1 file changed, 16 insertions(+), 8 deletions(-)

Applied. Thanks

--
Lucas De Marchi

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-03-07  2:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-03-06 17:03 [PATCH] testsuite: Fix uname() during glibc startup Michal Marek
2014-03-07  2:11 ` Lucas De Marchi

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.