udan11 / samp-plugin-sql

An abstract layer that communicates with multiple database servers (MySQL and PostgreSQL) implemented as a plugin for SA-MP servers.
BSD 2-Clause "Simplified" License
16 stars 12 forks source link

sql_escape_string Crash #10

Closed semen7907 closed 10 years ago

semen7907 commented 10 years ago

Plugin ver: mysql-v2.6-static-linux

[15:01:06] [debug] Server crashed while executing DM.amx
[15:01:06] [debug] AMX backtrace:
[15:01:06] [debug] #0 native sql_escape_string () [f7070f30] from sql.so
[15:01:06] [debug] #1 00135e7c in public OnDialogResponse (playerid=59, dialogid=126, response=1, listitem=-1, inputtext[]=@0x000ffe0c "\\\\\\") at C:\Users\semen\Desktop\SERVER\DM.pwn:2593
[15:01:06] [debug] Native backtrace:
[15:01:06] [debug] #0 f74cb09b in _ZN10StackTraceC1EPv () from plugins/crashdetect.so
[15:01:06] [debug] #1 f74c62d2 in _ZN11CrashDetect20PrintNativeBacktraceERSoPv () from plugins/crashdetect.so
[15:01:06] [debug] #2 f74c6ebc in _ZN11CrashDetect20PrintNativeBacktraceEPv () from plugins/crashdetect.so
[15:01:06] [debug] #3 f74c7366 in _ZN11CrashDetect11OnExceptionEPv () from plugins/crashdetect.so
[15:01:06] [debug] #4 f74cacec in ?? () from plugins/crashdetect.so
[15:01:06] [debug] #5 ffffe410 in __kernel_rt_sigreturn () from linux-gate.so.1
[15:01:06] [debug] #6 ffffe425 in __kernel_vsyscall () from linux-gate.so.1
[15:01:06] [debug] #7 f750b789 in gsignal () from /lib32/libc.so.6
[15:01:06] [debug] #8 f750d00b in abort () from /lib32/libc.so.6
[15:01:06] [debug] #9 f754aef5 in ?? () from /lib32/libc.so.6
[15:01:06] [debug] #10 f75511df in ?? () from /lib32/libc.so.6
[15:01:06] [debug] #11 f70710a7 in _ZN7Natives17sql_escape_stringEP6tagAMXPi () from plugins/sql.so
[15:01:06] [debug] #12 08094054 in ?? () from ./samp03svr
[15:01:06] [debug] #13 f74c3b9c in _ZN11CrashDetect13DoAmxCallbackEiPiS0_ () from plugins/crashdetect.so
[15:01:06] [debug] #14 f74c9d38 in ?? () from plugins/crashdetect.so
[15:01:06] [debug] #15 f74d01f8 in amx_Exec () from plugins/crashdetect.so
[15:01:06] [debug] #16 f74c6218 in _ZN11CrashDetect9DoAmxExecEPii () from plugins/crashdetect.so
[15:01:06] [debug] #17 f74c9aa9 in ?? () from plugins/crashdetect.so
[15:01:06] [debug] #18 080a524f in ?? () from ./samp03svr
[15:01:06] [debug] #19 080b11c4 in ?? () from ./samp03svr
[15:01:06] [debug] #20 08071b38 in ?? () from ./samp03svr
[15:01:06] [debug] #21 08071c32 in ?? () from ./samp03svr
[15:01:06] [debug] #22 0807bb80 in ?? () from ./samp03svr
[15:01:06] [debug] #23 080ad3bd in ?? () from ./samp03svr
[15:01:06] [debug] #24 080ad562 in ?? () from ./samp03svr
[15:01:06] [debug] #25 080a88ce in ?? () from ./samp03svr
[15:01:06] [debug] #26 f74f7646 in __libc_start_main () from /lib32/libc.so.6
[15:01:06] [debug] #27 0804b4d1 in ?? () from ./samp03svr

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
    case DIALOG_REGISTER:
        {
            if ( !response )
            {
                Kick( playerid );
                return 0;
            }

            if(strlen(inputtext) < 5 || strlen(inputtext) > 16)
            {
                new dialogStr[500];
                format(dialogStr, sizeof(dialogStr),
                "Регистрация", playerName(playerid));
                ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, ""COL_WHITE"{FF3300}Регистрация [ERROR]",dialogStr,"Далее","Выход");
                return 1;
            }

            new
            escapedpw[80],
            Query[356];

            sql_escape_string(sqlconnection, inputtext, escapedpw);  // Строка 2593

            format(Query, sizeof(Query), "INSERT INTO `players` (`Name`, `Password`, `Kills`, `Deaths`, `Cash`, `Scr`, `Admin`, `Spawn`, `SpawnX`, `SpawnY`, `SpawnZ`) VALUES ('%s', MD5('%s'), 0, 0, 0, 0, 0, 0, 0, 0, 0)", playerName(playerid), escapedpw);
            sql_query(sqlconnection, Query, QUERY_THREADED);

            GivePlayerCash(playerid, 50000);

            PlayerData[playerid][pLogged] = true;

            TogglePlayerSpectating(playerid, false);

            PlayerPlaySound(playerid, 21002, 0.0, 0.0, 0.0);

            CountREGISTRATION++;
        }
udan11 commented 10 years ago

I've been trying to reproduce this bug, but I failed. For me, it works fine.

I've used exactly the same plugin (version 2.6, MySQL only, statically linked) with the following Linux machine:

Linux vagrant-ubuntu-trusty-32 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:12 UTC 2014 i686 i686 i686 GNU/Linux

This it the code, which is mostly yours.

#include <a_samp>
#include <sql>

#define COL_WHITE                       "{000000}"
#define DIALOG_REGISTER                 1
#define GivePlayerCash                  GivePlayerMoney

enum ePlayer {
    pLogged
}

new SQL:sqlconnection, CountREGISTRATION, PlayerData[MAX_PLAYERS][ePlayer];

stock playerName(playerid) 
{
    new ret[MAX_PLAYER_NAME];
    GetPlayerName(playerid, ret, sizeof(ret));
    return ret;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) 
{
    printf("OnDialogResponse called");

    // SNIPPET FROM THE ORIGINAL ISSUE (https://github.com/udan11/samp-plugin-sql/issues/10)
    if(strlen(inputtext) < 5 || strlen(inputtext) > 16)
    {
        new dialogStr[500];
        format(dialogStr, sizeof(dialogStr),
        "Регистрация", playerName(playerid));
        ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, ""COL_WHITE"{FF3300}Регистрация [ERROR]",dialogStr,"Далее","Выход");
        return 1;
    }

    new
    escapedpw[80],
    Query[356];

    sql_escape_string(sqlconnection, inputtext, escapedpw);  // Строка 2593

    format(Query, sizeof(Query), "INSERT INTO `players` (`Name`, `Password`, `Kills`, `Deaths`, `Cash`, `Scr`, `Admin`, `Spawn`, `SpawnX`, `SpawnY`, `SpawnZ`) VALUES ('%s', MD5('%s'), 0, 0, 0, 0, 0, 0, 0, 0, 0)", playerName(playerid), escapedpw);
    sql_query(sqlconnection, Query, QUERY_THREADED);

    GivePlayerCash(playerid, 50000);

    PlayerData[playerid][pLogged] = true;

    TogglePlayerSpectating(playerid, false);

    PlayerPlaySound(playerid, 21002, 0.0, 0.0, 0.0);

    CountREGISTRATION++;
    // END OF SNIPPET

    printf("inputtext = %s", inputtext);
    printf("escapedpw = %s", escapedpw);
    printf("Query = %s", Query);
    return 1;
}

public OnGameModeInit()
{
    sqlconnection = mysql_connect("127.0.0.1", "root", "root", "samp-gm-v1");
    printf("sqlconnection = %d", _:sqlconnection);
    CallLocalFunction("OnDialogResponse", "iiiis", 59, 126, 1, -1, "\\\\\\\\\\\\");
    return 1;
}

main() {}

And my output is this (as expected):

[20:02:48]  Loading plugin: sql.so
[20:02:48]   >> SQL plugin v2.6 successfully loaded.
[20:02:48]       + MySQL support is enabled.
[20:02:48]   Loaded.
...
[20:02:48] sqlconnection = 1
[20:02:48] OnDialogResponse called
[20:02:48] inputtext = \\\\\\
[20:02:48] escapedpw = \\\\\\\\\\\\
[20:02:48] Query = INSERT INTO `players` (`Name`, `Password`, `Kills`, `Deaths`, `Cash`, `Scr`, `Admin`, `Spawn`, `SpawnX`, `SpawnY`, `SpawnZ`) VALUES ('', MD5('\\\\\\\\\\\\'), 0, 0, 0, 0, 0, 0, 0, 0, 0)

My sql_log.txt:

[20:02:48][info] Natives::sql_connect: Connecting to database (type = 1) root:***@127.0.0.1:0/samp-gm-v1...
[20:02:48][info] Natives::sql_connect: Connection (conn->id = 1) was succesful!
[20:02:48][debug] Natives::sql_escape_string: Escaping (conn->id = 1) string '\\\\\\'...
[20:02:48][debug] Natives::sql_query: Scheduling statement (stmt->id = 1, stmt->query = INSERT INTO `players` (`Name`, `Password`, `Kills`, `Deaths`, `Cash`, `Scr`, `Admin`, `Spawn`, `SpawnX`, `SpawnY`, `SpawnZ`) VALUES ('', MD5('\\\\\\\\\\\\'), 0, 0, 0, 0, 0, 0, 0, 0, 0), stmt->callback = ) for execution...
[20:02:48][debug] SQL_Worker[1]: Executing query (stmt->id = 1, stmt->query = INSERT INTO `players` (`Name`, `Password`, `Kills`, `Deaths`, `Cash`, `Scr`, `Admin`, `Spawn`, `SpawnX`, `SpawnY`, `SpawnZ`) VALUES ('', MD5('\\\\\\\\\\\\'), 0, 0, 0, 0, 0, 0, 0, 0, 0))...
[20:02:48][debug] ProccessTick: Executing query callback (stmt->id = 1, stmt->error = 1146, stmt->callback = )...
[20:02:48][debug] ProccessTick: Erasing query (stmt->id = 1)...

Can you post the relevant parts of your sql_log.txt file, please?

semen7907 commented 10 years ago

I reinstalled the plugin and include and it seems that errors are no more, may have been damaged plugin...

If you crash again, I will give log

sorry for the English :d

udan11 commented 10 years ago

No problem! I'm glad to hear that you've fixed your issues.