PDA

Просмотр полной версии : [Вопрос] Забавный баг, при авторизации на сервере.



Сергей
20.02.2019, 04:08
Доброго времени суток, суть в том, что я заметил забавный баг, при авторизации на сервере.
Как обстоит дело:
Подключаются 2 игрока. Подключаюсь например я, и Я с другого компа.
Так вот, вводит кто-то из меня первый пароль, и собственно авторизовывается, и потом ввожу второй я пароль, и тоже прохожу авторизацию.
Или ещё такой прикол, когда одновременно ввести пароль, 1 игрок авторизуется, второй нет...
Суть в том, что у одного из меня получается ник -1...
Не пойму в чём суть...

Немного по игравшись с принтами, выяснилось
Запрос:



GetPlayerName(playerid, PI[playerid][pName], MAX_PLAYER_NAME);
new query121[75+MAX_PLAYER_NAME+4];
format(query121, sizeof(query121), "SELECT `acc_id`,`pass`,`salt_pass` FROM `account` WHERE `nick`='%s'", PlayerInfo[playerid][pName]);
mysql_function_query(MysqlConnect, query121, true, "OnRegCheckCallBack","d",playerid);

Ответ:

forward OnRegCheckCallBack(playerid);
public OnRegCheckCallBack(playerid)
{
new rows, fields;
cache_get_data(rows, fields,MysqlConnect);
if(rows)
{
PlayerInfo[playerid][pID] = cache_get_field_content_int(0, "acc_id", MysqlConnect);
cache_get_field_content(0, "pass", PlayerInfo[playerid][pPassword], MysqlConnect, 33);
cache_get_field_content(0, "salt_pass", PlayerInfo[playerid][salt_pass], MysqlConnect, 11);
printf("ID: %d",PI[playerid][pID]);
printf("Password: %s",PI[playerid][pPassword]);
printf("salt_pass: %s",PI[playerid][salt_pass]);
OnPlayerDialogD_REG_AUTOS(playerid,1);// показываю диалог авторизации
}
else OnPlayerDialogD_REG_AUTOS(playerid,2);// показываю диалог регистрации
return 1;
}

Смешно стало после того, как я добавил принт, захожу, нормально всё, убираю принт, всё печально, одного пропускает, второй:


[03:44:16] Отправляем ид mysqlID: 144 |pl: 0 | N: Test_One
[03:44:16] Отправляем ид mysqlID: 44 |pl: 1 | N: -1
Главное первого спавнит, всё нормально, второй зависает, и окно авторизации падает, выключаем сервер.
Включаем снова, принт активный, и всё равно, 1-го спавнит, второй завис..

Действия в самом диалоге после верного ввода пароля:



new query2[51+11+2];
format(query2, sizeof(query2), "SELECT * FROM `account` WHERE `acc_id`='%d'", PlayerInfo[playerid][pID]);
mysql_function_query(MysqlConnect, query2, true, "OnPlayerLoginCallBack", "dd",PlayerInfo[playerid][pID], playerid);

Из этой всей кучи, логический вопрос, что я стал делать не так?


Логи, после того как ник игрока снова стал -1


Первый аккаунт:
ID: 144
Password: принт чёткая тема
salt_pass: и это

Второй:
ID: 58
Password: принт чёткая тема
salt_pass: и это

В самом диалоге после успешного ввода пароля:

Первый аккаунт:
Пароль верный: Test_One| 144 (это mysql_id)
Отправляем ид m: 144 |playerid: 0
Второй аккаунт:
Пароль верный: -1 | 44
Отправляем ид m: 44 |pl: 1

DeimoS
20.02.2019, 13:25
Ну смотри все случаи, когда ты перезаписываешь pName. Если в print выводишь данные только из этого массива, то без перезаписи данные не могут волшебным образом измениться сами.

Сергей
20.02.2019, 15:49
Ну смотри все случаи, когда ты перезаписываешь pName. Если в print выводишь данные только из этого массива, то без перезаписи данные не могут волшебным образом измениться сами.

Этот бажок возникает только тогда, когда на двух аккаунатах одновременно подтверждаю пароль. Ну т.е происходит сама авторизация.

Я в одну и туже секунду начинаю авторизовываться, и о чудо, 1 игрок авторизовался, а второй почему-то нет, у него и диалог авторизации падает...

Сергей
21.02.2019, 04:20
Вообщем, провёл ещё несколько тестов и выяснил.

Захожу я значит с аккаунта Test_AccountOne по ип адресу: 127.0.0.1
А с Test_AccountTwo по другому ип адресу, и выясняется, что один из них может авторизоваться, а второй нет, ибо у него всё просто падает.

Второй тест, захожу я по внешнему ИП адресу сервера:

В одну и туже секунду ввожу пароли, и подтверждаю их нажатием на 'ENTER'
и сервер падает вообще....

Подключив crashdetect получаю:


Registers:

EAX: 0x00000001 EBX: 0x00000000 ECX: 0x05B3CB60 EDX: 0x0101A8C0

ESI: 0x05B3CB60 EDI: 0x05B3CB60 EBP: 0x0019FC4C ESP: 0x0019F818

EFLAGS: 0x00010206



Stack:

+0000: 0x00000001 0x0048A155 0x0310E6E0 0x0251C7A0

+0010: 0x0101A8C0 0x00454579 0x0019FC7C 0x05B3BE12

+0020: 0x05B3BE10 0x0251C7A0 0x02510096 0x00000000

+0030: 0x02519108 0x00000002 0x0019F8B8 0x77E8ED70

+0040: 0xEA090CCF 0xFFFFFFFE 0x0019F88C 0x77E4B4E8

+0050: 0x00000000 0x05B11458 0x0019F9AC 0x05B11458

+0060: 0x00000006 0xFFFFFFFF 0x00000000 0x0048763B

+0070: 0x004ADC98 0x0019F8C8 0x004921F1 0x02510000

+0080: 0x00000000 0x004921F6 0x0019F9AC 0x00000001

+0090: 0x00000006 0x0019F9AC 0x0019F8A0 0x0019FAB4

+00A0: 0x0019FB18 0x004965F8 0x004B1230 0xFFFFFFFF

+00B0: 0x004921F6 0x0044E0C9 0x05B11458 0x0047CF39

+00C0: 0x30467B0A 0x43383645 0xE0E2D37D 0xECE5E0E6

+00D0: 0x0019F984 0x0019F968 0x0052AE00 0x0000001E

+00E0: 0x0019F948 0x77E53272 0x0019F99C 0x0000001C

+00F0: 0x0019F928 0x0052AE10 0x77E532A1 0x9DE0DEB7

+0100: 0x0019F974 0xC0000139 0x0052AE00 0x00000000

+0110: 0x0000001C 0x00000000 0xEDF3E0EA 0xE220E0F2

+0120: 0x0019FE00 0x77E8ED70 0x0000002B 0x00000800

+0130: 0x00000000 0x0019F951 0x1F841201 0x0040C267



--------------------------

Из log_text



[02:38:34] [debug] Server crashed due to an unknown error
[02:38:34] [debug] Native backtrace:
[02:38:34] [debug] #0 00481ff3 in ?? () in samp-server-cr.exe
[02:38:34] [debug] Registers:
[02:38:34] [debug] EAX: 00000001 EBX: 00000000 ECX: 059d3bc8 EDX: 0101a8c0
[02:38:34] [debug] ESI: 059d3bc8 EDI: 059d3bc8 EBP: 0019fc4c ESP: 0019f818
[02:38:34] [debug] EIP: 00481ff3 EFLAGS: 00010206
[02:38:34] [debug] Stack:
[02:38:34] [debug] ESP+00000000: 00000001 0048a155 02ffe578 0249c7a0
[02:38:34] [debug] ESP+00000020: 05888168 0249c7a0 02490096 00000081
[02:38:34] [debug] ESP+00000040: 1a8faaca fffffffe 0019f88c 77e4b4e8
[02:38:34] [debug] ESP+00000060: 00000006 ffffffff 00000000 0048763b
[02:38:34] [debug] ESP+00000080: 00000000 004921f6 0019f9ac 00000001
[02:38:34] [debug] ESP+000000a0: 0019fb18 004965f8 004b1230 ffffffff
[02:38:34] [debug] ESP+000000c0: 30467b0a 43383645 e0e2d37d ece5e0e6
[02:38:34] [debug] ESP+000000e0: 30303030 2d50497d e5f0e4e0 467b20f1
[02:38:34] [debug] ESP+00000100: f620c20a f5ffebe5 e7e5e120 f1e0efee
[02:38:34] [debug] ESP+00000120: e8e4e5e2 7b20e5f2 0000002b 00000800
[02:38:34] [debug] ESP+00000140: 30467b2e 43383645 cf0a0a7d e5e2eef0
[02:38:34] [debug] ESP+00000160: e2e220fc 20e0e4ee f7feebea 20e820e0
[02:38:34] [debug] ESP+00000180: 4332337b 7d323344 eee2c227 0a0a27e4
[02:38:34] [debug] ESP+000001a0: 0047cd00 3443447b 7d373437 ece8edc2
[02:38:34] [debug] ESP+000001c0: 02956bb8 00000bf9 000017f2 00000000
[02:38:34] [debug] ESP+000001e0: e8edc27d e8ede0ec c20421e5 06e4eee2
[02:38:34] [debug] ESP+00000200: 60636361 54455320 6e6f6020 656e696c
[02:38:34] [debug] ESP+00000220: 60204552 64695f70 30273d60 02e10027
[02:38:34] [debug] ESP+00000240: 00000800 00000000 0019fa65 040f3b01
[02:38:34] [debug] ESP+00000260: 02956bb8 00000fca 00000005 00000000
[02:38:34] [debug] ESP+00000280: 00000000 00000000 00000000 00000000
[02:38:34] [debug] ESP+000002a0: 0019fad4 00000000 0046878a 00000044
[02:38:34] [debug] ESP+000002c0: 0019fb24 059d3bc8 059ec650 0048322e
[02:38:34] [debug] ESP+000002e0: 0019fb04 0000007e b368d696 00000000
[02:38:34] [debug] ESP+00000300: 68965f61 0019fb34 00000001 00000000
[02:38:34] [debug] ESP+00000320: 00000000 00000001 0019fc5c 689792ef
[02:38:34] [debug] ESP+00000340: 68979309 00000000 02e140c0 00000000
[02:38:34] [debug] ESP+00000360: 00000000 6d667a7e c000007a 0019fc50
[02:38:34] [debug] ESP+00000380: 77e57bdf 02e140c0 0019fc80 0019fbfc
[02:38:34] [debug] ESP+000003a0: 00000000 00000086 0067c0e8 00e140c0
[02:38:34] [debug] ESP+000003c0: 0019fc04 68965f61 0019fbf8 00000001
[02:38:34] [debug] ESP+000003e0: 02956388 77e4c6a9 6d667d02 00660000

Инклуд и плагин, если что обновил, и перекомпилировал мод.

Сергей
21.02.2019, 08:30
Вообщем, спустя ower100500 тестов, я всё таки понял в чём была проблема.

Убрав из запроса:



GetPlayerName(playerid, PI[playerid][pName], MAX_PLAYER_NAME);
new query121[75+MAX_PLAYER_NAME+4];
format(query121, sizeof(query121), "SELECT `acc_id`,`pass`,`salt_pass` FROM `account` WHERE `nick`='%s'", PlayerInfo[playerid][pName]);
mysql_function_query(MysqlConnect, query121, true, "OnRegCheckCallBack","d",playerid);
И сделав его таким:


GetPlayerName(playerid, PI[playerid][pName], MAX_PLAYER_NAME);
new query121[75+MAX_PLAYER_NAME+4];
format(query121, sizeof(query121), "SELECT * FROM `account` WHERE `nick`='%s'", PlayerInfo[playerid][pName]);
mysql_function_query(MysqlConnect, query121, true, "OnRegCheckCallBack","d",playerid);
Всё стало работать как по маслу...
Если честно не знаю с чем это может быть связанно.

Так к слову, пришлось конечно облазить весь форум, и найти тему, где Deimos сделал систему регистрации на r39 and r40
Пришлось там смотреть, и всматриваться в код, пробовать его, может там такой-же баг, но как оказалось, всё там нормально, и попробовать пойти по тому-же принципу, оказалось верным решением.

DeimoS
21.02.2019, 13:36
Ну если бы ты кинул полностью код своей системы аккаунтов (а лучше new.pwn с вшитим туда кодом, чтоб можно было воспроизвести баг) - можно было бы что-то попробовать понять. А так - слишком мало информации для столь специфичного бага.

Раз вопрос решён, тему закрываю. Если вдруг ещё появятся проблемы с регистрацией - создай ещё одну тему и объединю их потом.