kernel32: Catch invalid memory accesses in resource enumeration handlers.
This commit is contained in:
parent
a186fd7767
commit
95eb435a33
@ -378,6 +378,8 @@ BOOL WINAPI EnumResourceNamesA( HMODULE hmod, LPCSTR type, ENUMRESNAMEPROCA lpfu
|
||||
goto done;
|
||||
|
||||
et = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(resdir + 1);
|
||||
__TRY
|
||||
{
|
||||
for (i = 0; i < resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries; i++)
|
||||
{
|
||||
if (et[i].u1.s1.NameIsString)
|
||||
@ -404,6 +406,14 @@ BOOL WINAPI EnumResourceNamesA( HMODULE hmod, LPCSTR type, ENUMRESNAMEPROCA lpfu
|
||||
}
|
||||
if (!ret) break;
|
||||
}
|
||||
}
|
||||
__EXCEPT_PAGE_FAULT
|
||||
{
|
||||
ret = FALSE;
|
||||
status = STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
__ENDTRY
|
||||
|
||||
done:
|
||||
HeapFree( GetProcessHeap(), 0, name );
|
||||
if (HIWORD(typeW.Buffer)) HeapFree( GetProcessHeap(), 0, typeW.Buffer );
|
||||
@ -440,6 +450,8 @@ BOOL WINAPI EnumResourceNamesW( HMODULE hmod, LPCWSTR type, ENUMRESNAMEPROCW lpf
|
||||
goto done;
|
||||
|
||||
et = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(resdir + 1);
|
||||
__TRY
|
||||
{
|
||||
for (i = 0; i < resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries; i++)
|
||||
{
|
||||
if (et[i].u1.s1.NameIsString)
|
||||
@ -465,6 +477,13 @@ BOOL WINAPI EnumResourceNamesW( HMODULE hmod, LPCWSTR type, ENUMRESNAMEPROCW lpf
|
||||
}
|
||||
if (!ret) break;
|
||||
}
|
||||
}
|
||||
__EXCEPT_PAGE_FAULT
|
||||
{
|
||||
ret = FALSE;
|
||||
status = STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
__ENDTRY
|
||||
done:
|
||||
HeapFree( GetProcessHeap(), 0, name );
|
||||
if (HIWORD(typeW.Buffer)) HeapFree( GetProcessHeap(), 0, typeW.Buffer );
|
||||
@ -503,11 +522,20 @@ BOOL WINAPI EnumResourceLanguagesA( HMODULE hmod, LPCSTR type, LPCSTR name,
|
||||
goto done;
|
||||
|
||||
et = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(resdir + 1);
|
||||
__TRY
|
||||
{
|
||||
for (i = 0; i < resdir->NumberOfNamedEntries + resdir->NumberOfIdEntries; i++)
|
||||
{
|
||||
ret = lpfun( hmod, type, name, et[i].u1.s2.Id, lparam );
|
||||
if (!ret) break;
|
||||
}
|
||||
}
|
||||
__EXCEPT_PAGE_FAULT
|
||||
{
|
||||
ret = FALSE;
|
||||
status = STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
__ENDTRY
|
||||
done:
|
||||
if (HIWORD(typeW.Buffer)) HeapFree( GetProcessHeap(), 0, typeW.Buffer );
|
||||
if (HIWORD(nameW.Buffer)) HeapFree( GetProcessHeap(), 0, nameW.Buffer );
|
||||
@ -546,11 +574,20 @@ BOOL WINAPI EnumResourceLanguagesW( HMODULE hmod, LPCWSTR type, LPCWSTR name,
|
||||
goto done;
|
||||
|
||||
et = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(resdir + 1);
|
||||
__TRY
|
||||
{
|
||||
for (i = 0; i < resdir->NumberOfNamedEntries + resdir->NumberOfIdEntries; i++)
|
||||
{
|
||||
ret = lpfun( hmod, type, name, et[i].u1.s2.Id, lparam );
|
||||
if (!ret) break;
|
||||
}
|
||||
}
|
||||
__EXCEPT_PAGE_FAULT
|
||||
{
|
||||
ret = FALSE;
|
||||
status = STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
__ENDTRY
|
||||
done:
|
||||
if (HIWORD(typeW.Buffer)) HeapFree( GetProcessHeap(), 0, typeW.Buffer );
|
||||
if (HIWORD(nameW.Buffer)) HeapFree( GetProcessHeap(), 0, nameW.Buffer );
|
||||
|
Loading…
x
Reference in New Issue
Block a user