igroglaz / srvmgr

https://rom2.ru
8 stars 5 forks source link

map crush if you delete spawn point #50

Open igroglaz opened 4 years ago

igroglaz commented 4 years ago

Map: beach_t1.alm : https://github.com/igroglaz/rom2maps/blob/master/3%20hard/beach_t1.alm

if I delete bottom respawn point - map starts to crush server with error:

[18.01.2020 10:52:59.448] Server started. [18.01.2020 10:52:59.520] EXCEPTION DUMP: eax=00000000h,ebx=0000000Dh,ecx=00000000h,edx=0018ED4Ch, esp=0018ED10h,ebp=0018ED18h,esi=00000457h,edi=0217DAF8h; eip=0059FF27h; addr=0059FF27h,code=C0000005h,flags=00000000h [18.01.2020 10:52:59.520] BEGIN STACK TRACE: 0x0059FF27h <= 0059C3DBh <= 0059BDC2h <= 004F1801h <= 0048E71Ch <= 004882AEh <= 005E0988h <= 005E0C3Eh <= 768F8E71h <= 768F90D1h <= 768FA66Fh <= 76925D00h <= 005DEA73h <= END STACK TRACE [18.01.2020 10:52:59.525] Exception was caught, but there is no map. Not saving characters.

Warbeginner: how such return could appear?

0059C3D6  |.  E8 00FBFFFF   CALL 0059BEDB                          ; \a2serv1.0059BEDB
!0059C3DB  |  8D4D EC       LEA ECX,[LOCAL.5]

из этого (обозримого даже в hiew):
0059FF10  /$  55            PUSH EBP                                 ; a2serv1.0059FF10(guessed Arg1)
0059FF11  |.  8BEC          MOV EBP,ESP
0059FF13  |.  83EC 08       SUB ESP,8
0059FF16  |.  894D F8       MOV DWORD PTR SS:[LOCAL.2],ECX
0059FF19  |.  8B45 08       MOV EAX,DWORD PTR SS:[ARG.1]
0059FF1C  |.  8B08          MOV ECX,DWORD PTR DS:[EAX]
0059FF1E  |.  894D FC       MOV DWORD PTR SS:[LOCAL.1],ECX
0059FF21  |.  8B55 08       MOV EDX,DWORD PTR SS:[ARG.1]
0059FF24  |.  8B45 FC       MOV EAX,DWORD PTR SS:[LOCAL.1]
!0059FF27  |.  8B08          MOV ECX,DWORD PTR DS:[EAX]
0059FF29  |.  890A          MOV DWORD PTR DS:[EDX],ECX
0059FF2B  |.  8B45 FC       MOV EAX,DWORD PTR SS:[LOCAL.1]
0059FF2E  |.  83C0 08       ADD EAX,8
0059FF31  |.  8BE5          MOV ESP,EBP
0059FF33  |.  5D            POP EBP
0059FF34  .  C2 0400       RETN 4

ZZYZX (in Russian from discord):

12:07]ZZYZX:А это не тот же самый краш где нулевой итем? [12:08]ZZYZX:А удаление точки просто перезаписывает карту, вот оно и фиксится [12:08]ZZYZX:Хотя посмотреть надо) [12:10]ZZYZX:ух ты [12:10]ZZYZX:Это вообще как [12:12]ZZYZX:Выглядит как как будто во время итерации по списку (чуть ли не с помощью std::...::iterator) чего-то там оказывается нулл [12:12]ZZYZX:Вопрос в том, почему нет проверки [12:20]ZZYZX:Там такая конструкция странная которая не очень декомпилится идой [12:20]ZZYZX: Attachment file type: unknown unknown.png 7.32 KB [12:20]ZZYZX:Суть в том что sub_59BEDB принимает два аргумента [12:21]ZZYZX:а arg0, это аргумент как раз в 59AB40, которое и крашится [12:21]ZZYZX:а хотя не) [12:21]ZZYZX:Даже веселее [12:21]ZZYZX:В 59AB40 вообще нету аргумента [12:21]ZZYZX:Но при этом изнутри он читается [12:21]ZZYZX:Как — мне непонятно [12:22]ZZYZX:так [12:22]ZZYZX:чё-т я куда-то не туда смотрю :D [12:22]ZZYZX:Там стек чтоли кривой какой-то [12:24]ZZYZX:0059FF27h <= 0059C3DBh это никак не получится, потому что перед 0059C3DBh стоит вызов 59BEDB а не 59FF10 -- [12:26]ZZYZX:Вывод, настоящий вызов находится внутри 59BEDB вот тут: [12:26]ZZYZX: Attachment file type: unknown unknown.png 18.04 KB [12:26]ZZYZX:Хоть стеку и не соответствует, зато ближайший) [12:32]ZZYZX:У меня только один вопрос, на хуя это вообще делается Attachment file type: unknown unknown.png 6.88 KB [12:32]ZZYZX:Этот код условно не делает вообще ничего [12:32]ZZYZX:а, не, делает, кстати) он ставит a1=a1, условно. Просто изнутри это выглядит как a1 = **a1 [12:32]ZZYZX:В общем я примерно понял что происходит [12:33]ZZYZX:Там какой-то linked list [12:33]ZZYZX:Который кончается раньше [12:33]ZZYZX:Чем указано в его размере (v23[3]) [12:34]ZZYZX:Происходит всё это мракобесие в конце загрузки карты [12:34]ZZYZX:Скорее всего опять редактор какую-то дичь туда записал [12:35]ZZYZX:Сохраните карту потом посмотреть чё с ней) [12:35]ZZYZX:а. Был файл [12:36]ZZYZX:В общем самый простой способ пофиксить конкретно это — проверять, что нулл (a1==0), перед вызовом 59FF10 (не внутри!)


temporary workaround on 'map' side - changed this respawn point to proper place..