Changeset 22004


Ignore:
Timestamp:
Jul 6, 2012, 11:59:15 PM (8 years ago)
Author:
dmik
Message:

kernel32: Pick up register changes in try/except filter.

This is a regression of r21999. Fixes endless exceptions eventually
leading to program termination.

Location:
trunk/src/kernel32
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kernel32/exceptions.cpp

    r21999 r22004  
    11191119                             PEXCEPTIONREGISTRATIONRECORD pERegRec,
    11201120                             PCONTEXTRECORD               pCtxRec,
    1121                              PVOID                        p)
     1121                             PVOID                        p,
     1122                             BOOL                         fSEH)
    11221123{
    11231124    char szTrapDump[2048];
     
    11281129#endif
    11291130    /* now dump the information to the logfile */
    1130     dprintf(("\n%s", szTrapDump));
     1131    dprintf(("OS2ExceptionHandler: fSEH=%d\n%s", fSEH, szTrapDump));
    11311132}
    11321133
    11331134#else // DEBUG
    1134 #define dprintfException(a,b,c,d) do {} while (0)
     1135#define dprintfException(a,b,c,d,e) do {} while (0)
    11351136#endif // DEBUG
    11361137
     
    13211322    case XCPT_FLOAT_STACK_CHECK:
    13221323    case XCPT_FLOAT_UNDERFLOW:
    1323         dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1324        dprintfException(pERepRec, pERegRec, pCtxRec, p, fSEH);
    13241325        dprintf(("KERNEL32: OS2ExceptionHandler (fSEH=%d): FPU exception\n", fSEH));
    13251326        if((!fIsOS2Image || fForceWin32TIB || fSEH) && !fExitProcess)  //Only for real win32 apps or when forced
     
    13441345    case XCPT_ASYNC_PROCESS_TERMINATE:
    13451346#if 0
    1346         dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1347        dprintfException(pERepRec, pERegRec, pCtxRec, p, fSEH);
    13471348        PrintExceptionChain();
    13481349        // fall through
     
    15111512            if(teb->o.odin.context.ContextFlags)
    15121513            {
    1513                 dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1514                dprintfException(pERepRec, pERegRec, pCtxRec, p, fSEH);
    15141515
    15151516                //NOTE: This will not work properly in case multiple threads execute this code
     
    15821583
    15831584#if defined(DEBUG)
    1584         dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1585        dprintfException(pERepRec, pERegRec, pCtxRec, p, fSEH);
    15851586
    15861587        if(!fExitProcess && (pCtxRec->ContextFlags & CONTEXT_CONTROL)) {
     
    17651766// @@VP20040507: Isn't this a bit dangerous to call dprintfon such exception
    17661767//#ifdef DEBUG
    1767 //        dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1768//        dprintfException(pERepRec, pERegRec, pCtxRec, p, fSEH);
    17681769//#endif
    17691770        goto continuesearch;
     
    17901791
    17911792            case XCPT_SIGNAL_INTR:
    1792                 dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1793                dprintfException(pERepRec, pERegRec, pCtxRec, p, fSEH);
    17931794                if (InternalGenerateConsoleCtrlEvent((breakPressed) ? CTRL_BREAK_EVENT : CTRL_C_EVENT, 0))
    17941795                {
     
    18051806
    18061807    default: //non-continuable exceptions
    1807         dprintfException(pERepRec, pERegRec, pCtxRec, p);
     1808        dprintfException(pERepRec, pERegRec, pCtxRec, p, fSEH);
    18081809        goto continuesearch;
    18091810    }
  • trunk/src/kernel32/oslibexcept.cpp

    r21999 r22004  
    170170    if (rc != ExceptionContinueExecution)
    171171    {
    172         dprintf(("Win32 exception handler returned %x", rc));
     172        dprintf(("Win32 exception handler returned %s (%d)",
     173                 rc == ExceptionContinueSearch ? "ExceptionContinueSearch" :
     174                                                 "???", rc));
    173175        return FALSE;
    174176    }
    175177
    176     dprintf(("Win32 exception handler returned ExceptionContinueExecution"));
     178    dprintf(("Win32 exception handler returned ExceptionContinueExecution (%d)",
     179             ExceptionContinueExecution));
    177180
    178181    if (pWinContextRec->ContextFlags & WINCONTEXT_CONTROL)
  • trunk/src/kernel32/seh/sehutil.s

    r21999 r22004  
    154154    popl %ebp
    155155
     156    /* analyze filter result */
     157    movl 20(%ebx), %eax /* pFrame->filterResult */
     158    cmpl $1, %eax /* EXCEPTION_EXECUTE_HANDLER? */
     159    je ___seh_handler_FreeMem
     160    cmpl $-1, %eax /* EXCEPTION_CONTINUE_EXECUTION? */
     161    jne 1f
     162    movl $0, %eax /* ExceptionContinueExecution */
     163    jmp 2f
     1641:
     165    /* Assume EXCEPTION_CONTIUNE_SEARCH */
     166    movl $1, %eax /* ExceptionContinueSearch */
     1672:
     168
     169    /* convert Win32 exception info back to OS/2 */
     170    pushl 16(%ebp)               /* pContext */
     171    pushl 48(%ebx)               /* pFrame->Pointers.ContextRecord */
     172    pushl %eax                   /* rc */
     173    call OSLibConvertExceptionResult
     174    addl $12, %esp
     175    pushl %eax /* save result */
     176
     177___seh_handler_FreeMem:
     178
    156179    /* free heap block */
    157180    movl 16(%ebx), %eax /* pFrame->pHandlerContext */
     
    161184    addl $4, %esp
    162185
    163     /* analyze filter result */
     186    /* analyze filter result again */
    164187    movl 20(%ebx), %eax /* pFrame->filterResult */
    165188    cmpl $1, %eax /* EXCEPTION_EXECUTE_HANDLER? */
    166189    je ___seh_handler_Unwind
    167     cmpl $-1, %eax /* EXCEPTION_CONTINUE_EXECUTION? */
    168     jne 1f
     190
     191    popl %eax /* restore OSLibConvertExceptionResult result */
     192
     193    /* %eax already contains TRUE if the execution should continue
     194     * and FALSE otherwise */
     195    cmp $0, %eax /* FALSE (= continue search)? */
     196    je 1f
    169197    movl $0, 52(%ebx) /* pFrame->state */
    170     //movl $-1, %eax /* XCPT_CONTINUE_EXECUTION (-1) */
    171     movl $1, %eax
     198    movl $1, %eax /* TRUE */
    172199    jmp ___seh_handler_Return
    1732001:
    174     /* assume EXCEPTION_CONTINUE_SEARCH (0) */
    175     xorl %eax, %eax /* return XCPT_CONTINUE_SEARCH (0) */
     201    xorl %eax, %eax /* FALSE */
    176202    jmp ___seh_handler_Return
    177203
Note: See TracChangeset for help on using the changeset viewer.