Fix utime/utimes when passed a NULL pointer.

Bug: 11383777
Change-Id: If944a42f3adfa8a6ce91c167c249e009ed63300a
diff --git a/libc/bionic/utimes.cpp b/libc/bionic/utimes.cpp
index 8950972..65f2d0b 100644
--- a/libc/bionic/utimes.cpp
+++ b/libc/bionic/utimes.cpp
@@ -34,9 +34,13 @@
 
 int utimes(const char* path, const timeval tv[2]) {
   timespec ts[2];
-  if (!timespec_from_timeval(ts[0], tv[0]) || !timespec_from_timeval(ts[1], tv[1])) {
-    errno = EINVAL;
-    return -1;
+  timespec* ts_ptr = NULL;
+  if (tv != NULL) {
+    if (!timespec_from_timeval(ts[0], tv[0]) || !timespec_from_timeval(ts[1], tv[1])) {
+      errno = EINVAL;
+      return -1;
+    }
+    ts_ptr = ts;
   }
-  return utimensat(AT_FDCWD, path, ts, 0);
+  return utimensat(AT_FDCWD, path, ts_ptr, 0);
 }
diff --git a/libc/include/utime.h b/libc/include/utime.h
index fa7cd2f..3d72da4 100644
--- a/libc/include/utime.h
+++ b/libc/include/utime.h
@@ -25,6 +25,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
+
 #ifndef _UTIME_H_
 #define _UTIME_H_
 
@@ -34,9 +35,8 @@
 
 __BEGIN_DECLS
 
-extern int  utime(const char *, const struct utimbuf *);
+extern int utime(const char*, const struct utimbuf*);
 
 __END_DECLS
 
 #endif /* _UTIME_H_ */
-
diff --git a/tests/sys_time_test.cpp b/tests/sys_time_test.cpp
index 186aa16..730992f 100644
--- a/tests/sys_time_test.cpp
+++ b/tests/sys_time_test.cpp
@@ -19,6 +19,8 @@
 #include <errno.h>
 #include <sys/time.h>
 
+#include "TemporaryFile.h"
+
 TEST(sys_time, utimes) {
   timeval tv[2];
   memset(&tv, 0, sizeof(tv));
@@ -38,3 +40,9 @@
   ASSERT_EQ(-1, utimes("/", tv));
   ASSERT_EQ(EINVAL, errno);
 }
+
+// http://b/11383777
+TEST(sys_time, utimes_NULL) {
+  TemporaryFile tf;
+  ASSERT_EQ(0, utimes(tf.filename, NULL));
+}