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