Piotr Caban : wininet: Don' t delete files that were modified after adding to cache.
Alexandre Julliard
julliard at winehq.org
Wed Sep 19 13:39:46 CDT 2012
Module: wine
Branch: master
Commit: e3a2e3a1c992477d61d643a92093e722f4876838
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e3a2e3a1c992477d61d643a92093e722f4876838
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Sep 19 15:30:25 2012 +0200
wininet: Don't delete files that were modified after adding to cache.
---
dlls/wininet/urlcache.c | 62 +++++++++++++++++++++-------------------------
1 files changed, 28 insertions(+), 34 deletions(-)
diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index 3a028b5..379288a 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -127,8 +127,8 @@ typedef struct _URL_CACHEFILE_ENTRY
WORD wLastSyncTime; /* last sync time in dos format */
DWORD dwHitRate; /* see INTERNET_CACHE_ENTRY_INFO::dwHitRate */
DWORD dwUseCount; /* see INTERNET_CACHE_ENTRY_INFO::dwUseCount */
- WORD wUnknownDate; /* usually same as wLastSyncDate */
- WORD wUnknownTime; /* usually same as wLastSyncTime */
+ WORD LastWriteDate;
+ WORD LastWriteTime;
DWORD dwUnknown7; /* usually zero */
DWORD dwUnknown8; /* usually zero */
/* packing to dword align start of next field */
@@ -960,15 +960,29 @@ static BOOL URLCache_LocalFileNameToPathA(
return FALSE;
}
+/* Just like FileTimeToDosDateTime, except that it also maps the special
+ * case of a filetime of (0,0) to a DOS date/time of (0,0).
+ */
+static void URLCache_FileTimeToDosDateTime(const FILETIME *ft, WORD *fatdate,
+ WORD *fattime)
+{
+ if (!ft->dwLowDateTime && !ft->dwHighDateTime)
+ *fatdate = *fattime = 0;
+ else
+ FileTimeToDosDateTime(ft, fatdate, fattime);
+}
+
/***********************************************************************
* URLCache_DeleteFile (Internal)
*/
static DWORD URLCache_DeleteFile(const URLCACHECONTAINER *container,
URLCACHE_HEADER *header, URL_CACHEFILE_ENTRY *url_entry)
{
+ WIN32_FILE_ATTRIBUTE_DATA attr;
WCHAR path[MAX_PATH];
LONG path_size = sizeof(path);
DWORD err;
+ WORD date, time;
if(!url_entry->dwOffsetLocalName)
goto succ;
@@ -978,6 +992,12 @@ static DWORD URLCache_DeleteFile(const URLCACHECONTAINER *container,
url_entry->CacheDir, path, &path_size))
goto succ;
+ if(!GetFileAttributesExW(path, GetFileExInfoStandard, &attr))
+ goto succ;
+ URLCache_FileTimeToDosDateTime(&attr.ftLastWriteTime, &date, &time);
+ if(date != url_entry->LastWriteDate || time != url_entry->LastWriteTime)
+ goto succ;
+
err = (DeleteFileW(path) ? ERROR_SUCCESS : GetLastError());
if(err == ERROR_ACCESS_DENIED || err == ERROR_SHARING_VIOLATION)
return err;
@@ -1203,18 +1223,6 @@ static DWORD URLCache_CopyEntry(
return ERROR_SUCCESS;
}
-/* Just like FileTimeToDosDateTime, except that it also maps the special
- * case of a filetime of (0,0) to a DOS date/time of (0,0).
- */
-static void URLCache_FileTimeToDosDateTime(const FILETIME *ft, WORD *fatdate,
- WORD *fattime)
-{
- if (!ft->dwLowDateTime && !ft->dwHighDateTime)
- *fatdate = *fattime = 0;
- else
- FileTimeToDosDateTime(ft, fatdate, fattime);
-}
-
/***********************************************************************
* URLCache_SetEntryInfo (Internal)
*
@@ -2741,6 +2749,7 @@ static BOOL CommitUrlCacheEntryInternal(
DWORD dwOffsetLocalFileName = 0;
DWORD dwOffsetHeader = 0;
DWORD dwOffsetFileExtension = 0;
+ WIN32_FILE_ATTRIBUTE_DATA file_attr;
LARGE_INTEGER file_size;
BYTE cDirectory = 0;
char achFile[MAX_PATH];
@@ -2768,28 +2777,14 @@ static BOOL CommitUrlCacheEntryInternal(
if (lpszOriginalUrl)
WARN(": lpszOriginalUrl ignored\n");
- file_size.QuadPart = 0;
+ memset(&file_attr, 0, sizeof(file_attr));
if (lpszLocalFileName)
{
- HANDLE hFile;
-
- hFile = CreateFileW(lpszLocalFileName, FILE_READ_ATTRIBUTES, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL);
- if (hFile == INVALID_HANDLE_VALUE)
- {
- ERR("couldn't open file %s (error is %d)\n", debugstr_w(lpszLocalFileName), GetLastError());
+ if(!GetFileAttributesExW(lpszLocalFileName, GetFileExInfoStandard, &file_attr))
return FALSE;
- }
-
- /* Get file size */
- if (!GetFileSizeEx(hFile, &file_size))
- {
- ERR("couldn't get file size (error is %d)\n", GetLastError());
- CloseHandle(hFile);
- return FALSE;
- }
-
- CloseHandle(hFile);
}
+ file_size.u.LowPart = file_attr.nFileSizeLow;
+ file_size.u.HighPart = file_attr.nFileSizeHigh;
error = URLCacheContainers_FindContainerW(lpszUrlName, &pContainer);
if (error != ERROR_SUCCESS)
@@ -2931,8 +2926,7 @@ static BOOL CommitUrlCacheEntryInternal(
pUrlEntry->LastModifiedTime = LastModifiedTime;
URLCache_FileTimeToDosDateTime(&pUrlEntry->LastAccessTime, &pUrlEntry->wLastSyncDate, &pUrlEntry->wLastSyncTime);
URLCache_FileTimeToDosDateTime(&ExpireTime, &pUrlEntry->wExpiredDate, &pUrlEntry->wExpiredTime);
- pUrlEntry->wUnknownDate = pUrlEntry->wLastSyncDate;
- pUrlEntry->wUnknownTime = pUrlEntry->wLastSyncTime;
+ URLCache_FileTimeToDosDateTime(&file_attr.ftLastWriteTime, &pUrlEntry->LastWriteDate, &pUrlEntry->LastWriteTime);
/*** Unknowns ***/
pUrlEntry->dwUnknown1 = 0;
More information about the wine-cvs
mailing list