diff --git a/libc/bionic/utimes.cpp b/libc/bionic/utimes.cpp index 8950972a6..65f2d0b76 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 fa7cd2f1b..3d72da4be 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 186aa16c9..730992fca 100644 --- a/tests/sys_time_test.cpp +++ b/tests/sys_time_test.cpp @@ -19,6 +19,8 @@ #include #include +#include "TemporaryFile.h" + TEST(sys_time, utimes) { timeval tv[2]; memset(&tv, 0, sizeof(tv)); @@ -38,3 +40,9 @@ TEST(sys_time, utimes) { 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)); +}