]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
Fix __times() handling of EFAULT when buf is NULL
authorPetr Baudis <pasky@ucw.cz>
Thu, 14 Mar 2013 00:16:53 +0000 (01:16 +0100)
committerPetr Baudis <pasky@ucw.cz>
Thu, 14 Mar 2013 00:16:53 +0000 (01:16 +0100)
ChangeLog
sysdeps/unix/sysv/linux/times.c

index c4cb2c811acec8e3e905154bc4a8909d6b3734ce..9e7be29278bd7725bf1171cc2ef33014d5fa3c8a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-14  Petr Baudis  <pasky@ucw.cz>
+
+       * sysdeps/unix/sysv/linux/times.c (__times): On EFAULT, test
+       for non-NULL pointer before the memory validity test. Pointed
+       out by Holger Brunck <holger.brunck@keymile.com>.
+
 2013-03-13  Andreas Schwab  <schwab@suse.de>
 
        * extra-lib.mk (extra-objs): Add static-only-routines as .oS
index f3b5f014e2de38770c07e6b7fecd2f858ca5f0b3..e59bb4ed6da452028e9e152deb44d129ea823938 100644 (file)
@@ -26,13 +26,14 @@ __times (struct tms *buf)
   INTERNAL_SYSCALL_DECL (err);
   clock_t ret = INTERNAL_SYSCALL (times, err, 1, buf);
   if (INTERNAL_SYSCALL_ERROR_P (ret, err)
-      && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0))
+      && __builtin_expect (INTERNAL_SYSCALL_ERRNO (ret, err) == EFAULT, 0)
+      && buf)
     {
       /* This might be an error or not.  For architectures which have
         no separate return value and error indicators we cannot
         distinguish a return value of -1 from an error.  Do it the
-        hard way.  We crash applications which pass in an invalid BUF
-        pointer.  */
+        hard way.  We crash applications which pass in an invalid
+        non-NULL BUF pointer.  Linux allows BUF to be NULL. */
 #define touch(v) \
       do {                                                                   \
        clock_t temp = v;                                                     \
@@ -44,7 +45,8 @@ __times (struct tms *buf)
       touch (buf->tms_cutime);
       touch (buf->tms_cstime);
 
-      /* If we come here the memory is valid and the kernel did not
+      /* If we come here the memory is valid (or BUF is NULL, which is
+       * a valid condition for the kernel syscall) and the kernel did not
         return an EFAULT error.  Return the value given by the kernel.  */
     }