Unverified Commit 25c40c9a authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

SMB: fix numeric constant suffix and variable types

1. don't use "ULL" suffix since unsupported in older MSVC
2. use curl_off_t instead of custom long long ifdefs
3. make get_posix_time() not do unaligned data access

Fixes #2211
Closes #2240
Reported-by: Chester Liu
parent 945df741
Loading
Loading
Loading
Loading
+8 −21
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
 * Copyright (C) 2016-2017, Daniel Stenberg, <daniel@haxx.se>, et al.
 * Copyright (C) 2016-2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
@@ -146,19 +146,12 @@ static unsigned int smb_swap32(unsigned int x)
    ((x >> 24) & 0xff);
}

#ifdef HAVE_LONGLONG
static unsigned long long smb_swap64(unsigned long long x)
static curl_off_t smb_swap64(curl_off_t x)
{
  return ((unsigned long long) smb_swap32((unsigned int) x) << 32) |
  return ((curl_off_t) smb_swap32((unsigned int) x) << 32) |
    smb_swap32((unsigned int) (x >> 32));
}
#else
static unsigned __int64 smb_swap64(unsigned __int64 x)
{
  return ((unsigned __int64) smb_swap32((unsigned int) x) << 32) |
    smb_swap32((unsigned int) (x >> 32));
}
#endif

#else
#  define smb_swap16(x) (x)
#  define smb_swap32(x) (x)
@@ -719,17 +712,11 @@ static CURLcode smb_connection_state(struct connectdata *conn, bool *done)
 * Convert a timestamp from the Windows world (100 nsec units from
 * 1 Jan 1601) to Posix time.
 */
static void get_posix_time(long *_out, const void *_in)
static void get_posix_time(long *out, curl_off_t timestamp)
{
#ifdef HAVE_LONGLONG
  long long timestamp = *(long long *) _in;
#else
  unsigned __int64 timestamp = *(unsigned __int64 *) _in;
#endif

  timestamp -= 116444736000000000ULL;
  timestamp -= 116444736000000000;
  timestamp /= 10000000;
  *_out = (long) timestamp;
  *out = (long) timestamp;
}

static CURLcode smb_request_state(struct connectdata *conn, bool *done)
@@ -798,7 +785,7 @@ static CURLcode smb_request_state(struct connectdata *conn, bool *done)
      conn->data->req.size = smb_swap64(smb_m->end_of_file);
      Curl_pgrsSetDownloadSize(conn->data, conn->data->req.size);
      if(conn->data->set.get_filetime)
        get_posix_time(&conn->data->info.filetime, &smb_m->last_change_time);
        get_posix_time(&conn->data->info.filetime, smb_m->last_change_time);
      next_state = SMB_DOWNLOAD;
    }
    break;
+10 −23
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 2014, Bill Nagel <wnagel@tycoint.com>, Exacq Technologies
 * Copyright (C) 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
@@ -165,11 +166,7 @@ struct smb_nt_create {
  unsigned int flags;
  unsigned int root_fid;
  unsigned int access;
#ifdef HAVE_LONGLONG
  unsigned long long allocation_size;
#else
  unsigned __int64 allocation_size;
#endif
  curl_off_t allocation_size;
  unsigned int ext_file_attributes;
  unsigned int share_access;
  unsigned int create_disposition;
@@ -187,25 +184,15 @@ struct smb_nt_create_response {
  unsigned char op_lock_level;
  unsigned short fid;
  unsigned int create_disposition;
#ifdef HAVE_LONGLONG
  unsigned long long create_time;
  unsigned long long last_access_time;
  unsigned long long last_write_time;
  unsigned long long last_change_time;
#else
  unsigned __int64 create_time;
  unsigned __int64 last_access_time;
  unsigned __int64 last_write_time;
  unsigned __int64 last_change_time;
#endif

  curl_off_t create_time;
  curl_off_t last_access_time;
  curl_off_t last_write_time;
  curl_off_t last_change_time;
  unsigned int ext_file_attributes;
#ifdef HAVE_LONGLONG
  unsigned long long allocation_size;
  unsigned long long end_of_file;
#else
  unsigned __int64 allocation_size;
  unsigned __int64 end_of_file;
#endif
  curl_off_t allocation_size;
  curl_off_t end_of_file;

} PACK;

struct smb_read {