Module: wine Branch: master Commit: 7f4e5b1ed8c6f53e1f936eff745d2071e4aa6f9d URL: https://source.winehq.org/git/wine.git/?a=commit;h=7f4e5b1ed8c6f53e1f936eff7...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jan 24 16:45:54 2019 +0100
ntdll: Don't crash on empty table in RtlAddFunctionTable().
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/signal_x86_64.c | 2 +- dlls/ntdll/tests/exception.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c index cbb3dd7..c3cc3d8 100644 --- a/dlls/ntdll/signal_x86_64.c +++ b/dlls/ntdll/signal_x86_64.c @@ -3458,7 +3458,7 @@ BOOLEAN CDECL RtlAddFunctionTable( RUNTIME_FUNCTION *table, DWORD count, DWORD64 return FALSE;
entry->base = addr; - entry->end = addr + table[count - 1].EndAddress; + entry->end = addr + (count ? table[count - 1].EndAddress : 0); entry->table = table; entry->count = count; entry->max_count = 0; diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c index dee8a9f..f7b8f21 100644 --- a/dlls/ntdll/tests/exception.c +++ b/dlls/ntdll/tests/exception.c @@ -2103,6 +2103,14 @@ static void test_dynamic_unwind(void) ok( !pRtlDeleteFunctionTable( runtime_func ), "RtlDeleteFunctionTable returned success for nonexistent table runtime_func = %p\n", runtime_func );
+ /* Empty table */ + ok( pRtlAddFunctionTable( runtime_func, 0, (ULONG_PTR)code_mem ), + "RtlAddFunctionTable failed for empty table\n" ); + ok( pRtlDeleteFunctionTable( runtime_func ), + "RtlDeleteFunctionTable failed for empty table\n" ); + ok( !pRtlDeleteFunctionTable( runtime_func ), + "RtlDeleteFunctionTable succeeded twice for empty table\n" ); + /* Test RtlInstallFunctionTableCallback with both low bits unset */ table = (ULONG_PTR)code_mem; ok( !pRtlInstallFunctionTableCallback( table, (ULONG_PTR)code_mem, code_offset + 32, &dynamic_unwind_callback, (PVOID*)&count, NULL ),