Alexandre Julliard : ntdll: Properly follow jumps when checking a function epilog.
Alexandre Julliard
julliard at winehq.org
Thu Mar 15 15:35:21 CDT 2012
Module: wine
Branch: master
Commit: c0610daf77c0f72eed84d4d944aded49ded0c269
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c0610daf77c0f72eed84d4d944aded49ded0c269
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Mar 15 20:29:23 2012 +0100
ntdll: Properly follow jumps when checking a function epilog.
---
dlls/ntdll/signal_x86_64.c | 14 ++++++++------
1 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index bea7ae0..5470a59 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -2629,8 +2629,6 @@ static BOOL is_inside_epilog( BYTE *pc, ULONG64 base, const RUNTIME_FUNCTION *fu
for (;;)
{
- DWORD offset;
-
if ((*pc & 0xf0) == 0x40) pc++; /* rex prefix */
switch (*pc)
@@ -2649,11 +2647,15 @@ static BOOL is_inside_epilog( BYTE *pc, ULONG64 base, const RUNTIME_FUNCTION *fu
case 0xc3: /* ret */
return TRUE;
case 0xe9: /* jmp nnnn */
- offset = pc + 5 + *(LONG *)(pc + 1) - (BYTE *)base;
- return (offset >= function->BeginAddress && offset < function->EndAddress);
+ pc += 5 + *(LONG *)(pc + 1);
+ if (pc - (BYTE *)base >= function->BeginAddress && pc - (BYTE *)base < function->EndAddress)
+ continue;
+ break;
case 0xeb: /* jmp n */
- offset = pc + 2 + (signed char)pc[1] - (BYTE *)base;
- return (offset >= function->BeginAddress && offset < function->EndAddress);
+ pc += 2 + (signed char)pc[1];
+ if (pc - (BYTE *)base >= function->BeginAddress && pc - (BYTE *)base < function->EndAddress)
+ continue;
+ break;
case 0xf3: /* rep; ret (for amd64 prediction bug) */
return pc[1] == 0xc3;
}
More information about the wine-cvs
mailing list