r5343: Fix for bug#1525. Timestamps interpreted incorrectly on 64-bit time_t values.
authorJeremy Allison <jra@samba.org>
Fri, 11 Feb 2005 20:00:30 +0000 (20:00 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:55:38 +0000 (10:55 -0500)
Jeremy.
(This used to be commit 00f8ac509aaf2f40a067f5fe5c7699ae6f26571e)

source3/lib/time.c
source3/smbd/trans2.c

index 5d7628c9d3657a928c0a4481e1171d77df6248d3..84004a099bebc2e561c1f0c7a994508386296918 100644 (file)
@@ -302,6 +302,8 @@ struct tm *LocalTime(time_t *t)
  Interpret an 8 byte "filetime" structure to a time_t
  It's originally in "100ns units since jan 1st 1601"
 
+ An 8 byte value of 0xffffffffffffffff will be returned as (time_t)0.
+
  It appears to be kludge-GMT (at least for file listings). This means
  its the GMT you get by taking a localtime and adding the
  serverzone. This is NOT the same as GMT in some cases. This routine
@@ -385,6 +387,8 @@ time_t nt_time_to_unix_abs(NTTIME *nt)
 
 /****************************************************************************
  Interprets an nt time into a unix time_t.
+ Differs from nt_time_to_unix in that an 8 byte value of 0xffffffffffffffff
+ will be returned as (time_t)-1, whereas nt_time_to_unix returns 0 in this case.
 ****************************************************************************/
 
 time_t interpret_long_date(char *p)
@@ -392,6 +396,9 @@ time_t interpret_long_date(char *p)
        NTTIME nt;
        nt.low = IVAL(p,0);
        nt.high = IVAL(p,4);
+       if (nt.low == 0xFFFFFFFF && nt.high == 0xFFFFFFFF) {
+               return (time_t)-1;
+       }
        return nt_time_to_unix(&nt);
 }
 
index 1d925e81de3585de08b4005f7f9170903d7c64a3..e8090792b0e89a4900b54a3d4ff4ba9baaf6bef8 100644 (file)
@@ -800,21 +800,6 @@ static mode_t unix_perms_from_wire( connection_struct *conn, SMB_STRUCT_STAT *ps
        return ret;
 }
 
-/****************************************************************************
- Checks for SMB_TIME_NO_CHANGE and if not found calls interpret_long_date.
-****************************************************************************/
-
-time_t interpret_long_unix_date(char *p)
-{
-       DEBUG(10,("interpret_long_unix_date\n"));
-       if(IVAL(p,0) == SMB_TIME_NO_CHANGE_LO &&
-          IVAL(p,4) == SMB_TIME_NO_CHANGE_HI) {
-               return -1;
-       } else {
-               return interpret_long_date(p);
-       }
-}
-
 /****************************************************************************
  Get a level dependent lanman2 dir entry.
 ****************************************************************************/
@@ -3331,7 +3316,7 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
 
                        tvs.modtime = MIN(write_time, changed_time);
 
-                       if (write_time > tvs.modtime && write_time != 0xffffffff) {
+                       if (write_time > tvs.modtime && write_time != (time_t)-1) {
                                tvs.modtime = write_time;
                        }
                        /* Prefer a defined time to an undefined one. */
@@ -3510,8 +3495,8 @@ static int call_trans2setfilepathinfo(connection_struct *conn, char *inbuf, char
 #endif /* LARGE_SMB_OFF_T */
                        }
                        pdata+=24;          /* ctime & st_blocks are not changed */
-                       tvs.actime = interpret_long_unix_date(pdata); /* access_time */
-                       tvs.modtime = interpret_long_unix_date(pdata+8); /* modification_time */
+                       tvs.actime = interpret_long_date(pdata); /* access_time */
+                       tvs.modtime = interpret_long_date(pdata+8); /* modification_time */
                        pdata+=16;
                        set_owner = (uid_t)IVAL(pdata,0);
                        pdata += 8;