From 8319adfba828b91f95ec69d2c9fba6ca9ecd622c Mon Sep 17 00:00:00 2001 From: Robert van Herk Date: Thu, 5 Apr 2012 13:08:08 +0200 Subject: msi: fixed MsiGetFileHashW for empty files (try 3) In Wine, MsiGetFileHashW fails on empty files. However, in Windows it just generates a 0 hash. A patch + test is provided. Try 3 incorporates Alexandre's comments: the test-case for an empty file is now included in the existing test_MsiGetFileHash function. --- dlls/msi/msi.c | 34 ++++++++++++++++++++++------------ dlls/msi/tests/msi.c | 6 ++++++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index 53ae641..99d7c68 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -4014,24 +4014,34 @@ UINT WINAPI MsiGetFileHashW( LPCWSTR szFilePath, DWORD dwOptions, } length = GetFileSize( handle, NULL ); - mapping = CreateFileMappingW( handle, NULL, PAGE_READONLY, 0, 0, NULL ); - if (mapping) + if (length) { - p = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, length ); - if (p) + mapping = CreateFileMappingW( handle, NULL, PAGE_READONLY, 0, 0, NULL ); + if (mapping) { - MD5_CTX ctx; + p = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, length ); + if (p) + { + MD5_CTX ctx; - MD5Init( &ctx ); - MD5Update( &ctx, p, length ); - MD5Final( &ctx ); - UnmapViewOfFile( p ); + MD5Init( &ctx ); + MD5Update( &ctx, p, length ); + MD5Final( &ctx ); + UnmapViewOfFile( p ); - memcpy( pHash->dwData, ctx.digest, sizeof pHash->dwData ); - r = ERROR_SUCCESS; + memcpy( pHash->dwData, ctx.digest, sizeof pHash->dwData ); + r = ERROR_SUCCESS; + } + CloseHandle( mapping ); } - CloseHandle( mapping ); } + else + { + /* Empty file -> set hash to 0 */ + memset( pHash->dwData, 0, sizeof pHash->dwData ); + r = ERROR_SUCCESS; + } + CloseHandle( handle ); return r; diff --git a/dlls/msi/tests/msi.c b/dlls/msi/tests/msi.c index f12af78..8768d2a 100644 --- a/dlls/msi/tests/msi.c +++ b/dlls/msi/tests/msi.c @@ -417,6 +417,12 @@ static const struct MSIFILEHASHINFO hash; } hash_data[] = { + { "", 0, + { HASHSIZE, + { 0, 0, 0, 0 }, + }, + }, + { "abc", 0, { HASHSIZE, { 0x98500190, 0xb04fd23c, 0x7d3f96d6, 0x727fe128 }, -- 1.7.7.6