Alexandre Julliard : ntdll: Don' t crash on empty table in RtlAddFunctionTable().

Alexandre Julliard julliard at winehq.org
Thu Jan 24 14:42:52 CST 2019


Module: wine
Branch: master
Commit: 7f4e5b1ed8c6f53e1f936eff745d2071e4aa6f9d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=7f4e5b1ed8c6f53e1f936eff745d2071e4aa6f9d

Author: Alexandre Julliard <julliard at 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 at 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 ),




More information about the wine-cvs mailing list