l2auth closing problem

Issue #24 resolved
smeli created an issue

у оригинального аутха ну и у етого тоже есть некая беда - если его закрыть при вводе конекции ODBC то он зависает на долго в памяти

Comments (5)

  1. smeli reporter

    DBEnv.cpp

    // L2AuthD 0x00413FD9
    INT_PTR CALLBACK DBEnv::LoginDlgProc(HWND hDlg, UINT msgType, WPARAM wparam, LPARAM lparam)
    {
        static DBEnv* instance = NULL;
    
        if (msgType == WM_INITDIALOG)
        {
            instance = (DBEnv*)lparam;
            ::SendDlgItemMessageA(hDlg, DLG_DB_CONNECTION_FILE_DSN, WM_SETTEXT, 0, (LPARAM) "L2Conn");
            ::SetWindowTextA(hDlg, "L2 ODBC Connection Info");
            return 0;
        }
    
        if (msgType == WM_COMMAND && wparam == IDOK)
        {
            char* connStr = instance->connectionStr;
            char buffer[64];
    
            ::SendDlgItemMessageA(hDlg, DLG_DB_CONNECTION_FILE_DSN, WM_GETTEXT, 64u, (LPARAM)buffer);
            strcpy(connStr, "FILEDSN=");
            strcat(connStr, buffer);
    
            ::SendDlgItemMessageA(hDlg, DLG_DB_CONNECTION_LOGIN_NAME, WM_GETTEXT, 64u, (LPARAM)buffer);
            strcat(connStr, ";UID=");
            strcat(connStr, buffer);
    
            ::SendDlgItemMessageA(hDlg, DLG_DB_CONNECTION_PASSWORD, WM_GETTEXT, 64u, (LPARAM)buffer);
            strcat(connStr, ";PWD=");
            strcat(connStr, buffer);
    
    
            //instance->SaveConnStrToReg();
    
            ::EndDialog(hDlg, 0);
        }
    
        if (msgType == WM_COMMAND && wparam == IDCANCEL) //by smeli
        {
            closeDlg = true; //by smeli
            ::EndDialog(hDlg, 0); //by smeli
            exit(0); //by smeli
        }
    
        return 0;
    }
    
    
    void DBEnv::Destroy()
    {
        if (closeDlg == false) //by smeli
        {
            for (int i = 0; i < connectionNumber; ++i)
            {
                if (sqlConnections[i].stmtSqlHandler != SQL_NULL_HANDLE)
                {
                    ::SQLFreeHandle(SQL_HANDLE_STMT, sqlConnections[i].stmtSqlHandler);
                }
    
                if (sqlConnections[i].dbcSqlHandler != SQL_NULL_HANDLE)
                {
                    ::SQLDisconnect(sqlConnections[i].dbcSqlHandler);
                    ::SQLFreeHandle(SQL_HANDLE_DBC, sqlConnections[i].dbcSqlHandler);
                }
    
            }
        }
    
        ::SQLFreeHandle(SQL_HANDLE_ENV, sqlEnvHandle);
        sqlEnvHandle = SQL_NULL_HANDLE;
    }
    
    bool closeDlg;
    
    // L2AuthD 0x004133DF
    DBEnv::DBEnv()
        : CIOObject()
        , spinLock(LockType_WaitLock, 0)
        , sqlEnvHandle(SQL_NULL_HANDLE)
        , sqlConnections(NULL)
        , connectionsHead(NULL)
        , connectionNumber(0)
        , recoveryTriggered(false)
    {
        m_nRefCount = 1;
        closeDlg = false;
    }
    
  2. smeli reporter

    logd closing: threads.cpp

    // L2LogD 0x0040ABB0
    void WaitThread()
    {
        g_deadlock_checker.Init();
    
        bool sleep = g_vHandle.size() == 0;
    
        while (true)
        {
            guard(L"unsigned __stdcall WaitThread(void *)");
    
            long dwTick = ::GetTickCount();
            if (dwTick > (g_deadlock_checker.lastTick() + 180 * 1000))
            {
                guard(L"!!! deadlock or super-lag detected !!!");
                g_winlog.Add(LOG_ERROR, L"!!! deadlock or super-lag detected!!!  (diff %d sec) ", (dwTick - g_deadlock_checker.lastTick()) / 1000);
                CRASH;
                unguard();
            }
    
            LONG nMinNextTime = ::GetTickCount() + 2 * CIO_DEADLOCK_CHECKER_INTERVAL;
            LONG nWait = 2 * CIO_DEADLOCK_CHECKER_INTERVAL;
    
            CIOObject::TimerDispatch();
    
            if ((nMinNextTime - ::GetTickCount()) >= 100)
            {
                nWait = 100;
            }
            else
            {
                nWait = nMinNextTime - ::GetTickCount();
            }
    
            if (sleep)
            {
                ::Sleep(nWait);
            }
            else
            {
                if (g_vHandle.size() != 0) { //by smeli
                    DWORD dwWaitResult = ::WaitForMultipleObjects(g_vHandle.size(), &g_vHandle[0], FALSE, nWait);
                    if ((dwWaitResult >= WAIT_OBJECT_0) && (dwWaitResult < WAIT_OBJECT_0 + g_vHandle.size()))
                    {
                        dwWaitResult -= WAIT_OBJECT_0;
                        CIOObject* object = g_vObject[dwWaitResult];
                        object->OnWaitCallback();
                    }
                }
    
            }
    
            if (Threads::g_bTerminating)
            {
                CRASH;
            }
    
            unguard();
        }
    }
    
  3. Apox

    Привет, есть проблема отваливается порт 2106 спустя несколько дней, причем всегда по разному то дня то неделю, были ли фиксы по этому поводу? Само приложение работает, просто перестаёт полностью отвечать на любой коннект.

  4. Master Toma repo owner

    Привет, речь идет об оригинальном L2Auth C1 или моем декомпиле? Оставь скайп, попробуем разобраться

  5. Log in to comment