about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--sysdeps/unix/sysv/linux/dl-osinfo.h47
1 files changed, 19 insertions, 28 deletions
diff --git a/sysdeps/unix/sysv/linux/dl-osinfo.h b/sysdeps/unix/sysv/linux/dl-osinfo.h
index cc0694a130..1834da8a9f 100644
--- a/sysdeps/unix/sysv/linux/dl-osinfo.h
+++ b/sysdeps/unix/sysv/linux/dl-osinfo.h
@@ -51,39 +51,30 @@ dl_fatal (const char *str)
        kernels.  */							      \
     if (__LINUX_KERNEL_VERSION > 0)					      \
       {									      \
-	static const int sysctl_args[] = { CTL_KERN, KERN_OSRELEASE };	      \
-	char buf[64];							      \
-	size_t reslen = sizeof (buf);					      \
+	char bufmem[64];						      \
+	char *buf = bufmem;						      \
 	unsigned int version;						      \
 	int parts;							      \
 	char *cp;							      \
+	struct utsname uts;						      \
 									      \
-	/* Try reading the number using `sysctl' first.  */		      \
-	if (__sysctl ((int *) sysctl_args,				      \
-		      sizeof (sysctl_args) / sizeof (sysctl_args[0]),	      \
-		      buf, &reslen, NULL, 0) < 0)			      \
-	  {								      \
-	    /* This didn't work.  Next try the uname syscall */		      \
-	    struct utsname uts;						      \
-	    if (__uname (&uts))					      	      \
-	      {							      	      \
-	        /* This was not successful.  Now try reading the /proc	      \
-	           filesystem.  */					      \
-	        int fd = __open ("/proc/sys/kernel/osrelease", O_RDONLY);     \
-	        if (fd == -1						      \
-		    || (reslen = __read (fd, buf, sizeof (buf))) <= 0)	      \
-  	      	  /* This also didn't work.  We give up since we cannot       \
-		     make sure the library can actually work.  */	      \
-	          FATAL ("FATAL: cannot determine library version\n");        \
-	        __close (fd);						      \
-	      }								      \
-	    else							      \
-	      {							      	      \
-                strncpy (buf, uts.release, sizeof (buf));		      \
-                reslen = strlen (uts.release);				      \
-	      }								      \
+	/* Try the uname syscall */					      \
+	if (__uname (&uts))					      	      \
+	  {							      	      \
+	    /* This was not successful.  Now try reading the /proc	      \
+	       filesystem.  */						      \
+	    ssize_t reslen;						      \
+	    int fd = __open ("/proc/sys/kernel/osrelease", O_RDONLY);	      \
+	    if (fd == -1						      \
+		|| (reslen = __read (fd, bufmem, sizeof (bufmem))) <= 0)      \
+  	      /* This also didn't work.  We give up since we cannot	      \
+		 make sure the library can actually work.  */		      \
+	      FATAL ("FATAL: cannot determine library version\n");	      \
+	    __close (fd);						      \
+	    buf[MIN (reslen, sizeof (bufmem) - 1)] = '\0';		      \
 	  }								      \
-	buf[MIN (reslen, sizeof (buf) - 1)] = '\0';			      \
+	else								      \
+          buf = uts.release;						      \
 									      \
 	/* Now convert it into a number.  The string consists of at most      \
 	   three parts.  */						      \