[PATCH] kernelbase: Fix GetFileVersionInfo*() crashes with malformed resources.
Some Unity games ship with an encrypted Assembly-CSharp.dll, including the resources directory, yet the engine still calls GetFileVersionInfoSizeW() on those files. This may results in a page fault when trying to find the version resource and takes the whole process down. The change fixes crashes when launching Home Behind 2 and Crown Trick. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50075 Signed-off-by: Arkadiusz Hiler <ahiler(a)codeweavers.com> --- dlls/kernelbase/version.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/dlls/kernelbase/version.c b/dlls/kernelbase/version.c index 58c49aa148b..a7b55de9706 100644 --- a/dlls/kernelbase/version.c +++ b/dlls/kernelbase/version.c @@ -42,6 +42,7 @@ #include "kernelbase.h" #include "wine/debug.h" +#include "wine/exception.h" WINE_DEFAULT_DEBUG_CHANNEL(ver); @@ -547,15 +548,23 @@ static DWORD find_version_resource( HANDLE handle, DWORD *reslen, DWORD *offset, if (read_data( handle, mzh.e_lfanew, &magic, sizeof(magic) ) != sizeof(magic)) return 0; *offset = mzh.e_lfanew; - switch (magic) + __TRY { - case IMAGE_OS2_SIGNATURE: - if (!find_ne_resource( handle, reslen, offset )) magic = 0; - break; - case IMAGE_NT_SIGNATURE: - if (!find_pe_resource( handle, reslen, offset, flags )) magic = 0; - break; + switch (magic) + { + case IMAGE_OS2_SIGNATURE: + if (!find_ne_resource( handle, reslen, offset )) magic = 0; + break; + case IMAGE_NT_SIGNATURE: + if (!find_pe_resource( handle, reslen, offset, flags )) magic = 0; + break; + } } + __EXCEPT_PAGE_FAULT + { + magic = 0; + } + __ENDTRY WARN( "Can't handle %04x files.\n", magic ); return magic; } -- 2.30.1
participants (1)
-
Arkadiusz Hiler