From a27b48b132e53fff56182e7b435e6e8e5c6fcaea Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Sun, 31 Jan 1999 15:08:31 +0000
Subject: [PATCH] Handle set_file_time requests changing only one of access/mod
 time.

---
 server/file.c | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/server/file.c b/server/file.c
index 1ade0967264..3c5e8161fa7 100644
--- a/server/file.c
+++ b/server/file.c
@@ -411,17 +411,22 @@ int set_file_time( int handle, time_t access_time, time_t write_time )
 
     if (!(file = get_file_obj( current->process, handle, GENERIC_WRITE )))
         return 0;
-    utimbuf.actime  = access_time;
-    utimbuf.modtime = write_time;
-    if (utime( file->name, &utimbuf ) == -1)
+    if (!access_time || !write_time)
     {
-        file_set_error();
-        release_object( file );
-        return 0;
+        struct stat st;
+        if (stat( file->name, &st ) == -1) goto error;
+        if (!access_time) access_time = st.st_atime;
+        if (!write_time) write_time = st.st_mtime;
     }
+    utimbuf.actime  = access_time;
+    utimbuf.modtime = write_time;
+    if (utime( file->name, &utimbuf ) == -1) goto error;
     release_object( file );
     return 1;
-    
+ error:
+    file_set_error();
+    release_object( file );
+    return 0;
 }
 
 int file_lock( struct file *file, int offset_high, int offset_low,
-- 
GitLab