Merge "linker: use LOCAL_MULTILIB := both style to build linker64"
diff --git a/libc/bionic/strtotimeval.c b/libc/bionic/strtotimeval.c
index 1c132ec..195381b 100644
--- a/libc/bionic/strtotimeval.c
+++ b/libc/bionic/strtotimeval.c
@@ -30,34 +30,29 @@
 #include <stdlib.h>
 #include <sys/time.h>
 
-char * strtotimeval (const char *str, struct timeval *ts)
-{
-    int n;
-    char *s, *s0;
-    long  fs;	/* Fractional seconds */
+char * strtotimeval(const char *str, struct timeval *ts) {
+  char *s;
+  long fs = 0; /* fractional seconds */
 
-    ts->tv_sec = strtoumax(str, &s, 10);
-    fs = 0;
+  ts->tv_sec = strtoumax(str, &s, 10);
 
-    if ( *s == '.' ) {
-	int  count;
+  if (*s == '.') {
+    s++;
+    int count = 0;
 
-        s0 = s+1;
-
-	/* read up to 6 digits */
-	fs    = 0;
-	count = 0;
-	while ( *s && isdigit(*s) )
-	{
-            if ( ++count < 7 )
-	        fs = fs*10 + (*s - '0');
-	    s++;
-	}
-
-	for ( ; count < 6; count++ )
-	    fs *= 10;
+    /* read up to 6 digits (microseconds) */
+    while (*s && isdigit(*s)) {
+      if (++count < 7) {
+        fs = fs*10 + (*s - '0');
+      }
+      s++;
     }
 
-    ts->tv_usec = fs;
-    return s;
+    for (; count < 6; count++) {
+      fs *= 10;
+    }
+  }
+
+  ts->tv_usec = fs;
+  return s;
 }
diff --git a/tests/time_test.cpp b/tests/time_test.cpp
index 26b7775..c055769 100644
--- a/tests/time_test.cpp
+++ b/tests/time_test.cpp
@@ -387,3 +387,51 @@
   ASSERT_EQ(ESRCH, pthread_detach(tdd.thread_id));
 #endif
 }
+
+TEST(time, strtotimeval) {
+#if defined(__BIONIC__)
+  struct timeval tv1;
+  char* rest1 = strtotimeval("10.123456", &tv1);
+  ASSERT_EQ(10, tv1.tv_sec);
+  ASSERT_EQ(123456, tv1.tv_usec);
+  ASSERT_EQ('\0', *rest1);
+
+  // strtotimeval interprets the fractional part as microseconds and thus will
+  // only consider its first 6 digits. Even so it should consume all valid
+  // digits.
+  struct timeval tv2;
+  char* rest2 = strtotimeval(".1234567", &tv2);
+  ASSERT_EQ(0, tv2.tv_sec);
+  ASSERT_EQ(123456, tv2.tv_usec);
+  ASSERT_EQ('\0', *rest2);
+
+  struct timeval tv3;
+  char* rest3 = strtotimeval("1.1a", &tv3);
+  ASSERT_EQ(1, tv3.tv_sec);
+  ASSERT_EQ(100000, tv3.tv_usec);
+  ASSERT_EQ('a', *rest3);
+
+  struct timeval tv4;
+  char* rest4 = strtotimeval("a", &tv4);
+  ASSERT_EQ(0, tv4.tv_sec);
+  ASSERT_EQ(0, tv4.tv_usec);
+  ASSERT_EQ('a', *rest4);
+
+  struct timeval tv5;
+  char* rest5 = strtotimeval("0", &tv5);
+  ASSERT_EQ(0, tv5.tv_sec);
+  ASSERT_EQ(0, tv5.tv_usec);
+  ASSERT_EQ('\0', *rest5);
+
+  // TODO: should we reject this case and just return '.'?
+  struct timeval tv6;
+  char* rest6 = strtotimeval(".", &tv6);
+  ASSERT_EQ(0, tv6.tv_sec);
+  ASSERT_EQ(0, tv6.tv_usec);
+  ASSERT_EQ('\0', *rest6);
+
+#else // __BIONIC__
+  GTEST_LOG_(INFO) << "This test does nothing.\n";
+#endif // __BIONIC__
+}
+