Module: wine Branch: master Commit: e60fdbf12453c3caf11d6638b03e53ef68641423 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e60fdbf12453c3caf11d6638b...
Author: Jinoh Kang jinoh.kang.kr@gmail.com Date: Sat Dec 11 00:50:45 2021 +0900
ntdll: Properly test for LLVM libunwind error codes.
Commit f37b953e07f (ntdll: Support both HP-UX-like libunwind and LLVM libunwind error codes., 2021-12-10) made an unsuccessful attempt to fix UNW_ENOINFO detection on LLVM libunwind. It turns out that UNW_ENOINFO is actually negative in LLVM, so there's no need to flip the sign.
Fix this by flipping the return value sign only when UNW_ENOINFO < 0 (LLVM libunwind), and then comparing it against the negated error code. Overall, all flavours of libunwind return a negative value on error.
Signed-off-by: Jinoh Kang jinoh.kang.kr@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntdll/unix/signal_arm.c | 6 +++--- dlls/ntdll/unix/signal_arm64.c | 6 +++--- dlls/ntdll/unix/signal_x86_64.c | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/unix/signal_arm.c b/dlls/ntdll/unix/signal_arm.c index 6389fdde058..a1bcb0ddd32 100644 --- a/dlls/ntdll/unix/signal_arm.c +++ b/dlls/ntdll/unix/signal_arm.c @@ -248,13 +248,13 @@ NTSTATUS CDECL unwind_builtin_dll( ULONG type, struct _DISPATCHER_CONTEXT *dispa return STATUS_INVALID_DISPOSITION; } rc = unw_get_proc_info( &cursor, &info ); - if (rc < 0) rc = -rc; /* libunwind may return negative error codes */ - if (rc != UNW_ESUCCESS && rc != UNW_ENOINFO) + if (UNW_ENOINFO < 0) rc = -rc; /* LLVM libunwind has negative error codes */ + if (rc != UNW_ESUCCESS && rc != -UNW_ENOINFO) { WARN( "failed to get info: %d\n", rc ); return STATUS_INVALID_DISPOSITION; } - if (rc == UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip) + if (rc == -UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip) { NTSTATUS status = context->Pc != context->Lr ? STATUS_SUCCESS : STATUS_INVALID_DISPOSITION; diff --git a/dlls/ntdll/unix/signal_arm64.c b/dlls/ntdll/unix/signal_arm64.c index 01deb9ef8dd..94f280e218a 100644 --- a/dlls/ntdll/unix/signal_arm64.c +++ b/dlls/ntdll/unix/signal_arm64.c @@ -212,13 +212,13 @@ NTSTATUS CDECL unwind_builtin_dll( ULONG type, DISPATCHER_CONTEXT *dispatch, CON return STATUS_INVALID_DISPOSITION; } rc = unw_get_proc_info( &cursor, &info ); - if (rc < 0) rc = -rc; /* libunwind may return negative error codes */ - if (rc != UNW_ESUCCESS && rc != UNW_ENOINFO) + if (UNW_ENOINFO < 0) rc = -rc; /* LLVM libunwind has negative error codes */ + if (rc != UNW_ESUCCESS && rc != -UNW_ENOINFO) { WARN( "failed to get info: %d\n", rc ); return STATUS_INVALID_DISPOSITION; } - if (rc == UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip) + if (rc == -UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip) { TRACE( "no info found for %lx ip %lx-%lx, assuming leaf function\n", ip, info.start_ip, info.end_ip ); diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c index f3e6f8335d6..68e0c7ce66e 100644 --- a/dlls/ntdll/unix/signal_x86_64.c +++ b/dlls/ntdll/unix/signal_x86_64.c @@ -1415,13 +1415,13 @@ static NTSTATUS libunwind_virtual_unwind( ULONG64 ip, ULONG64 *frame, CONTEXT *c *frame = context->Rsp;
rc = unw_get_proc_info(&cursor, &info); - if (rc < 0) rc = -rc; /* libunwind may return negative error codes */ - if (rc != UNW_ESUCCESS && rc != UNW_ENOINFO) + if (UNW_ENOINFO < 0) rc = -rc; /* LLVM libunwind has negative error codes */ + if (rc != UNW_ESUCCESS && rc != -UNW_ENOINFO) { WARN( "failed to get info: %d\n", rc ); return STATUS_INVALID_DISPOSITION; } - if (rc == UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip || info.end_ip == info.start_ip + 1) + if (rc == -UNW_ENOINFO || ip < info.start_ip || ip > info.end_ip || info.end_ip == info.start_ip + 1) return STATUS_UNSUCCESSFUL;
TRACE( "ip %#lx function %#lx-%#lx personality %#lx lsda %#lx fde %#lx\n",