mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 12:54:13 +00:00
Check when backtracking the stack if frames are correct (readable).
This commit is contained in:
parent
89fc6fda97
commit
cb0f1a9cdc
1 changed files with 35 additions and 2 deletions
|
@ -225,10 +225,18 @@ static void DEBUG_DoBackTrace(int noisy)
|
|||
|
||||
next_switch = THREAD_Current()->cur_stack;
|
||||
if (is16) {
|
||||
if (IsBadReadPtr((STACK32FRAME*)next_switch, sizeof(STACK32FRAME))) {
|
||||
fprintf( stderr, "Bad stack frame %p\n", (STACK32FRAME*)next_switch );
|
||||
return;
|
||||
}
|
||||
cur_switch = (DWORD)((STACK32FRAME*)next_switch)->frame16;
|
||||
sw_addr.seg = SELECTOROF(cur_switch);
|
||||
sw_addr.off = OFFSETOF(cur_switch);
|
||||
} else {
|
||||
if (IsBadReadPtr((STACK16FRAME*)PTR_SEG_TO_LIN(next_switch), sizeof(STACK16FRAME))) {
|
||||
fprintf( stderr, "Bad stack frame %p\n", (STACK16FRAME*)PTR_SEG_TO_LIN(next_switch) );
|
||||
return;
|
||||
}
|
||||
cur_switch = (DWORD)((STACK16FRAME*)PTR_SEG_TO_LIN(next_switch))->frame32;
|
||||
sw_addr.seg = ss;
|
||||
sw_addr.off = cur_switch;
|
||||
|
@ -245,7 +253,15 @@ static void DEBUG_DoBackTrace(int noisy)
|
|||
* yes, I know this is confusing, it gave me a headache too */
|
||||
if (is16) {
|
||||
STACK32FRAME *frame = (STACK32FRAME*)next_switch;
|
||||
DBG_ADDR code = { NULL, 0, frame->retaddr };
|
||||
DBG_ADDR code;
|
||||
|
||||
if (IsBadReadPtr((STACK32FRAME*)next_switch, sizeof(STACK32FRAME))) {
|
||||
fprintf( stderr, "Bad stack frame %p\n", (STACK32FRAME*)next_switch );
|
||||
return;
|
||||
}
|
||||
code.type = NULL;
|
||||
code.seg = 0;
|
||||
code.off = frame->retaddr;
|
||||
|
||||
cs = 0;
|
||||
addr.seg = 0;
|
||||
|
@ -253,6 +269,10 @@ static void DEBUG_DoBackTrace(int noisy)
|
|||
DEBUG_ForceFrame( &addr, &code, ++frameno, 32, noisy );
|
||||
|
||||
next_switch = cur_switch;
|
||||
if (IsBadReadPtr((STACK16FRAME*)PTR_SEG_TO_LIN(next_switch), sizeof(STACK16FRAME))) {
|
||||
fprintf( stderr, "Bad stack frame %p\n", (STACK16FRAME*)PTR_SEG_TO_LIN(next_switch) );
|
||||
return;
|
||||
}
|
||||
cur_switch = (DWORD)((STACK16FRAME*)PTR_SEG_TO_LIN(next_switch))->frame32;
|
||||
sw_addr.seg = 0;
|
||||
sw_addr.off = cur_switch;
|
||||
|
@ -260,7 +280,16 @@ static void DEBUG_DoBackTrace(int noisy)
|
|||
is16 = FALSE;
|
||||
} else {
|
||||
STACK16FRAME *frame = (STACK16FRAME*)PTR_SEG_TO_LIN(next_switch);
|
||||
DBG_ADDR code = { NULL, frame->cs, frame->ip };
|
||||
DBG_ADDR code;
|
||||
|
||||
if (IsBadReadPtr((STACK16FRAME*)PTR_SEG_TO_LIN(next_switch), sizeof(STACK16FRAME))) {
|
||||
fprintf( stderr, "Bad stack frame %p\n", (STACK16FRAME*)PTR_SEG_TO_LIN(next_switch) );
|
||||
return;
|
||||
}
|
||||
|
||||
code.type = NULL;
|
||||
code.seg = frame->cs;
|
||||
code.off = frame->ip;
|
||||
|
||||
cs = frame->cs;
|
||||
addr.seg = SELECTOROF(next_switch);
|
||||
|
@ -268,6 +297,10 @@ static void DEBUG_DoBackTrace(int noisy)
|
|||
DEBUG_ForceFrame( &addr, &code, ++frameno, 16, noisy );
|
||||
|
||||
next_switch = cur_switch;
|
||||
if (IsBadReadPtr((STACK32FRAME*)next_switch, sizeof(STACK32FRAME))) {
|
||||
fprintf( stderr, "Bad stack frame %p\n", (STACK32FRAME*)next_switch );
|
||||
return;
|
||||
}
|
||||
cur_switch = (DWORD)((STACK32FRAME*)next_switch)->frame16;
|
||||
sw_addr.seg = SELECTOROF(cur_switch);
|
||||
sw_addr.off = OFFSETOF(cur_switch);
|
||||
|
|
Loading…
Reference in a new issue