1*4882a593SmuzhiyunFrom 3f0580f2546de8be7acf1bc78a55a257bc638ebe Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Bartosz Brachaczek <b.brachaczek@gmail.com> 3*4882a593SmuzhiyunDate: Tue, 12 Nov 2019 14:31:08 +0100 4*4882a593SmuzhiyunSubject: [PATCH] Make HgfsConvertFromNtTimeNsec aware of 64-bit time_t on i386 5*4882a593Smuzhiyun 6*4882a593SmuzhiyunI verified that this function behaves as expected on x86_64, i386 with 7*4882a593Smuzhiyun32-bit time_t, and i386 with 64-bit time_t for the following values of 8*4882a593SmuzhiyunntTtime: 9*4882a593Smuzhiyun 10*4882a593SmuzhiyunUNIX_EPOCH-1, UNIX_EPOCH, UNIX_EPOCH+1, UNIX_S32_MAX-1, UNIX_S32_MAX, 11*4882a593SmuzhiyunUNIX_S32_MAX+1, UNIX_S32_MAX*2+1 12*4882a593Smuzhiyun 13*4882a593SmuzhiyunI did not verify whether the use of Div643264 is optimal, performance 14*4882a593Smuzhiyunwise. 15*4882a593Smuzhiyun 16*4882a593SmuzhiyunSigned-off-by: Giulio Benetti <giulio.benetti@benettiengineering.com> 17*4882a593Smuzhiyun--- 18*4882a593Smuzhiyun lib/hgfs/hgfsUtil.c | 34 +++++++++++++++++++--------------- 19*4882a593Smuzhiyun 1 file changed, 19 insertions(+), 15 deletions(-) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyundiff --git a/lib/hgfs/hgfsUtil.c b/lib/hgfs/hgfsUtil.c 22*4882a593Smuzhiyunindex cc580ab8..49b10040 100644 23*4882a593Smuzhiyun--- a/lib/hgfs/hgfsUtil.c 24*4882a593Smuzhiyun+++ b/lib/hgfs/hgfsUtil.c 25*4882a593Smuzhiyun@@ -110,23 +110,21 @@ HgfsConvertFromNtTimeNsec(struct timespec *unixTime, // OUT: Time in UNIX format 26*4882a593Smuzhiyun uint64 ntTime) // IN: Time in Windows NT format 27*4882a593Smuzhiyun { 28*4882a593Smuzhiyun #ifdef __i386__ 29*4882a593Smuzhiyun- uint32 sec; 30*4882a593Smuzhiyun- uint32 nsec; 31*4882a593Smuzhiyun+ uint64 sec64; 32*4882a593Smuzhiyun+ uint32 sec32, nsec; 33*4882a593Smuzhiyun+#endif 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun ASSERT(unixTime); 36*4882a593Smuzhiyun- /* We assume that time_t is 32bit */ 37*4882a593Smuzhiyun- ASSERT_ON_COMPILE(sizeof (unixTime->tv_sec) == 4); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun- /* Cap NT time values that are outside of Unix time's range */ 40*4882a593Smuzhiyun+ if (sizeof (unixTime->tv_sec) == 4) { 41*4882a593Smuzhiyun+ /* Cap NT time values that are outside of Unix time's range */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun- if (ntTime >= UNIX_S32_MAX) { 44*4882a593Smuzhiyun- unixTime->tv_sec = 0x7FFFFFFF; 45*4882a593Smuzhiyun- unixTime->tv_nsec = 0; 46*4882a593Smuzhiyun- return 1; 47*4882a593Smuzhiyun+ if (ntTime >= UNIX_S32_MAX) { 48*4882a593Smuzhiyun+ unixTime->tv_sec = 0x7FFFFFFF; 49*4882a593Smuzhiyun+ unixTime->tv_nsec = 0; 50*4882a593Smuzhiyun+ return 1; 51*4882a593Smuzhiyun+ } 52*4882a593Smuzhiyun } 53*4882a593Smuzhiyun-#else 54*4882a593Smuzhiyun- ASSERT(unixTime); 55*4882a593Smuzhiyun-#endif 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun if (ntTime < UNIX_EPOCH) { 58*4882a593Smuzhiyun unixTime->tv_sec = 0; 59*4882a593Smuzhiyun@@ -135,9 +133,15 @@ HgfsConvertFromNtTimeNsec(struct timespec *unixTime, // OUT: Time in UNIX format 60*4882a593Smuzhiyun } 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #ifdef __i386__ 63*4882a593Smuzhiyun- Div643232(ntTime - UNIX_EPOCH, 10000000, &sec, &nsec); 64*4882a593Smuzhiyun- unixTime->tv_sec = sec; 65*4882a593Smuzhiyun- unixTime->tv_nsec = nsec * 100; 66*4882a593Smuzhiyun+ if (sizeof (unixTime->tv_sec) == 4) { 67*4882a593Smuzhiyun+ Div643232(ntTime - UNIX_EPOCH, 10000000, &sec32, &nsec); 68*4882a593Smuzhiyun+ unixTime->tv_sec = sec32; 69*4882a593Smuzhiyun+ unixTime->tv_nsec = nsec * 100; 70*4882a593Smuzhiyun+ } else { 71*4882a593Smuzhiyun+ Div643264(ntTime - UNIX_EPOCH, 10000000, &sec64, &nsec); 72*4882a593Smuzhiyun+ unixTime->tv_sec = sec64; 73*4882a593Smuzhiyun+ unixTime->tv_nsec = nsec * 100; 74*4882a593Smuzhiyun+ } 75*4882a593Smuzhiyun #else 76*4882a593Smuzhiyun unixTime->tv_sec = (ntTime - UNIX_EPOCH) / 10000000; 77*4882a593Smuzhiyun unixTime->tv_nsec = ((ntTime - UNIX_EPOCH) % 10000000) * 100; 78*4882a593Smuzhiyun-- 79*4882a593Smuzhiyun2.25.1 80*4882a593Smuzhiyun 81