Commit e60fdbf1 authored by Jinoh Kang's avatar Jinoh Kang Committed by Alexandre Julliard

ntdll: Properly test for LLVM libunwind error codes.

Commit f37b953e (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: 's avatarJinoh Kang <jinoh.kang.kr@gmail.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent 7fabf029
......@@ -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;
......
......@@ -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 );
......
......@@ -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",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment