Ignore:
Timestamp:
Mar 28, 2012, 5:49:37 PM (13 years ago)
Author:
dmik
Message:

kernel: Fix crash in PE/PEC (another regression of r21981).

Closes #78.

File:
1 edited

Legend:

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

    r21983 r21986  
    693693    EXCEPTION_FRAME  exceptFrame;
    694694    Win32Thread     *me = (Win32Thread *)lpData;
    695     ULONG            dwFlags = me->dwFlags;
    696695    ULONG            threadCallback = (ULONG)me->pCallback;
    697     LPVOID           userdata  = me->lpUserData;
    698696    DWORD            rc;
    699697    TEB             *winteb    = (TEB *)me->teb;
    700     DWORD            cbCommitStack = me->cbCommitStack;
    701 
    702     // @todo the approach to copy all fields to local vars and delete the
    703     // instance is dumb, fix it later
    704     delete(me);    //only called once
    705     me = 0;
    706698
    707699    if(InitializeThread(winteb) == FALSE) {
    708700        dprintf(("Win32ThreadProc: InitializeTIB failed!!"));
    709701        DebugInt3();
     702        delete me;
    710703        return 0;
    711704    }
    712705    dprintf(("Win32ThreadProc: Thread handle 0x%x, thread id %d", GetCurrentThread(), GetCurrentThreadId()));
    713706
    714     winteb->flags = dwFlags;
     707    winteb->flags = me->dwFlags;
    715708
    716709    winteb->entry_point = (void *)threadCallback;
    717     winteb->entry_arg   = (void *)userdata;
     710    winteb->entry_arg   = (void *)me->lpUserData;
    718711
    719712    winteb->o.odin.hab = OSLibWinInitialize();
     
    727720    dprintf(("Stack top 0x%x, stack end 0x%x", winteb->stack_top, winteb->stack_low));
    728721
    729     if (cbCommitStack) {
     722    if (me->cbCommitStack) {
    730723        // pre-commit part of the stack
    731724        dprintf(("Pre-commit 0x%x bytes of stack", me->cbCommitStack));
     
    773766    //Set FPU control word to 0x27F (same as in NT)
    774767    CONTROL87(0x27F, 0xFFF);
    775     rc = AsmCallThreadHandler(fAlignStack, threadCallback, userdata);
     768    rc = AsmCallThreadHandler(fAlignStack, threadCallback, me->lpUserData);
    776769
    777770    // make sure the Win32 exception stack (if there is still any) is unwound
     
    793786    }
    794787
     788    delete me;
    795789    return rc;
    796790}
Note: See TracChangeset for help on using the changeset viewer.