diff options
-rw-r--r-- | src/tool_operate.c | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/src/tool_operate.c b/src/tool_operate.c index bb698ffec..0e84ac398 100644 --- a/src/tool_operate.c +++ b/src/tool_operate.c @@ -194,38 +194,42 @@ static void setfiletime(long filetime, const char *filename, saving time offset and since it's GMT that is bad behavior. When we have access to a 64-bit type we can bypass utime and set the times directly. */ #if defined(WIN32) && (CURL_SIZEOF_CURL_OFF_T >= 8) + HANDLE hfile; + +#if (CURL_SIZEOF_LONG >= 8) /* 910670515199 is the maximum unix filetime that can be used as a Windows FILETIME without overflow: 30827-12-31T23:59:59. */ - if(filetime <= CURL_OFF_T_C(910670515199)) { - HANDLE hfile = CreateFileA(filename, FILE_WRITE_ATTRIBUTES, - (FILE_SHARE_READ | FILE_SHARE_WRITE | - FILE_SHARE_DELETE), - NULL, OPEN_EXISTING, 0, NULL); - if(hfile != INVALID_HANDLE_VALUE) { - curl_off_t converted = ((curl_off_t)filetime * 10000000) + - CURL_OFF_T_C(116444736000000000); - FILETIME ft; - ft.dwLowDateTime = (DWORD)(converted & 0xFFFFFFFF); - ft.dwHighDateTime = (DWORD)(converted >> 32); - if(!SetFileTime(hfile, NULL, &ft, &ft)) { - fprintf(error_stream, - "Failed to set filetime %ld on outfile: " - "SetFileTime failed: GetLastError %u\n", - filetime, GetLastError()); - } - CloseHandle(hfile); - } - else { + if(filetime > CURL_OFF_T_C(910670515199)) { + fprintf(error_stream, + "Failed to set filetime %ld on outfile: overflow\n", + filetime); + return; + } +#endif /* CURL_SIZEOF_LONG >= 8 */ + + hfile = CreateFileA(filename, FILE_WRITE_ATTRIBUTES, + (FILE_SHARE_READ | FILE_SHARE_WRITE | + FILE_SHARE_DELETE), + NULL, OPEN_EXISTING, 0, NULL); + if(hfile != INVALID_HANDLE_VALUE) { + curl_off_t converted = ((curl_off_t)filetime * 10000000) + + CURL_OFF_T_C(116444736000000000); + FILETIME ft; + ft.dwLowDateTime = (DWORD)(converted & 0xFFFFFFFF); + ft.dwHighDateTime = (DWORD)(converted >> 32); + if(!SetFileTime(hfile, NULL, &ft, &ft)) { fprintf(error_stream, "Failed to set filetime %ld on outfile: " - "CreateFile failed: GetLastError %u\n", + "SetFileTime failed: GetLastError %u\n", filetime, GetLastError()); } + CloseHandle(hfile); } else { fprintf(error_stream, - "Failed to set filetime %ld on outfile: overflow\n", - filetime); + "Failed to set filetime %ld on outfile: " + "CreateFile failed: GetLastError %u\n", + filetime, GetLastError()); } #elif defined(HAVE_UTIME) struct utimbuf times; |