[PATCH 4/9] dbghelp: relax some failure conditions in SymSetContext and SymSetScopeFromAddr
Eric Pouech
eric.pouech at gmail.com
Mon Nov 15 11:25:41 CST 2021
they shouldn't fail if passed address is inside a module, even if it
doesn't point to a function
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
dlls/dbghelp/dbghelp.c | 28 ++++++++++++++--------------
1 file changed, 14 insertions(+), 14 deletions(-)
diff --git a/dlls/dbghelp/dbghelp.c b/dlls/dbghelp/dbghelp.c
index 844ef00b8e9..c0b8837fbbf 100644
--- a/dlls/dbghelp/dbghelp.c
+++ b/dlls/dbghelp/dbghelp.c
@@ -607,18 +607,14 @@ BOOL WINAPI SymSetContext(HANDLE hProcess, PIMAGEHLP_STACK_FRAME StackFrame,
PIMAGEHLP_CONTEXT Context)
{
struct process* pcs;
- BOOL same;
- if (!(pcs = process_find_by_handle(hProcess))) return FALSE;
- same = pcs->ctx_frame.ReturnOffset == StackFrame->ReturnOffset &&
- pcs->ctx_frame.FrameOffset == StackFrame->FrameOffset &&
- pcs->ctx_frame.StackOffset == StackFrame->StackOffset;
-
- if (!SymSetScopeFromAddr(hProcess, StackFrame->InstructionOffset))
- return FALSE;
+ TRACE("(%p %p %p)\n", hProcess, StackFrame, Context);
- pcs->ctx_frame = *StackFrame;
- if (same)
+ if (!(pcs = process_find_by_handle(hProcess))) return FALSE;
+ if (pcs->ctx_frame.ReturnOffset == StackFrame->ReturnOffset &&
+ pcs->ctx_frame.FrameOffset == StackFrame->FrameOffset &&
+ pcs->ctx_frame.StackOffset == StackFrame->StackOffset &&
+ pcs->ctx_frame.InstructionOffset == StackFrame->InstructionOffset)
{
TRACE("Setting same frame {rtn=%I64x frm=%I64x stk=%I64x}\n",
pcs->ctx_frame.ReturnOffset,
@@ -628,7 +624,11 @@ BOOL WINAPI SymSetContext(HANDLE hProcess, PIMAGEHLP_STACK_FRAME StackFrame,
return FALSE;
}
+ if (!SymSetScopeFromAddr(hProcess, StackFrame->InstructionOffset))
+ return FALSE;
+ pcs->ctx_frame = *StackFrame;
/* Context is not (no longer?) used */
+
return TRUE;
}
@@ -643,11 +643,11 @@ BOOL WINAPI SymSetScopeFromAddr(HANDLE hProcess, ULONG64 addr)
TRACE("(%p %#I64x)\n", hProcess, addr);
if (!module_init_pair(&pair, hProcess, addr)) return FALSE;
- if ((sym = symt_find_nearest(pair.effective, addr)) == NULL) return FALSE;
- if (sym->symt.tag != SymTagFunction) return FALSE;
-
pair.pcs->localscope_pc = addr;
- pair.pcs->localscope_symt = &sym->symt;
+ if ((sym = symt_find_nearest(pair.effective, addr)) != NULL && sym->symt.tag == SymTagFunction)
+ pair.pcs->localscope_symt = &sym->symt;
+ else
+ pair.pcs->localscope_symt = NULL;
return TRUE;
}
More information about the wine-devel
mailing list