From 0f87a9ada358020874206cf65db5c62a0a83ddbb Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 11 Feb 2005 20:00:30 +0000 Subject: r5343: Fix for bug#1525. Timestamps interpreted incorrectly on 64-bit time_t values. Jeremy. (This used to be commit 00f8ac509aaf2f40a067f5fe5c7699ae6f26571e) --- source3/lib/time.c | 7 +++++++ source3/smbd/trans2.c | 21 +++------------------ 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/source3/lib/time.c b/source3/lib/time.c index 5d7628c9d3..84004a099b 100644 --- a/source3/lib/time.c +++ b/source3/lib/time.c @@ -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); } diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 1d925e81de..e8090792b0 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -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; -- cgit