ihhub / fheroes2

fheroes2 is a recreation of Heroes of Might and Magic II game engine.
https://ihhub.github.io/fheroes2/
GNU General Public License v2.0
2.61k stars 365 forks source link

Crash in isValidShadowSprite() when loading a MX2 map #4519

Closed a1exsh closed 2 years ago

a1exsh commented 2 years ago

Preliminary checks

Platform

Linux

Describe the bug

Start a new standard or multi-player hotseat game using the attached map file.

14:49:55: [DBG_ENGINE]  main:  Free Heroes of Might and Magic II, version: 0.9.8
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 113
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 80
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 76
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 72
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 68
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 32
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 188
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 112
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 81
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 77
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 73
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 69
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 65
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 33
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 189
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 28
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 20
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 16
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 12
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 41
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 29
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 21
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 17
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 13
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 41
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 13
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 5
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 28
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 29
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 16
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 17
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 8
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 12
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 21
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 9
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 20
14:50:01: [DBG_GAME]    LoadMapMP2:  load castle: not found, index: 280
14:50:01: [DBG_GAME]    LoadMapMP2:  read maps: unknown block addons, size: 70
14:50:01: [DBG_GAME]    LoadMapMP2:  read maps: unknown block addons, size: 70
14:50:01: [DBG_GAME]    LoadMapMP2:  load castle: not found, index: 310
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 39
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 39
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 113
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 80
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 76
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 72
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 68
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 32
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 188
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 191
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 112
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 114
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 81
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 77
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 73
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 69
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 65
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 42
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 42
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 33
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 189
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 55
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 28
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 34
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 20
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 16
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 12
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 41
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 29
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 21
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 17
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 13
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 41
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 13
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 5
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 14
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 28
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 29
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 6
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 15
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 23
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 30
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 7
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 16
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 17
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 22
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 31
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 8
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 12
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 18
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 21
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 9
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 11
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 19
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 20
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 42
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 33
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 28
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 34
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 39
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 39
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 39
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 39
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
14:50:01: [DBG_GAME]    GetICNObject:  unknown type: 40
fheroes2: ../fheroes2/maps/maps_tiles.cpp:152: bool {anonymous}::isValidShadowSprite(int, uint8_t): Assertion `0' failed.
Aborted (core dumped)
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `/home/ash/src/fheroes2/fheroes2'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50  ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
[Current thread is 1 (Thread 0x7fae1e025e80 (LWP 3221))]
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
#1  0x00007fae1e055537 in __GI_abort () at abort.c:79
#2  0x00007fae1e05540f in __assert_fail_base (fmt=0x7fae1e1be128 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x56380abf8cb8 "0", 
    file=0x56380abf8c98 "../fheroes2/maps/maps_tiles.cpp", line=152, function=<optimized out>) at assert.c:92
#3  0x00007fae1e064662 in __GI___assert_fail (assertion=0x56380abf8cb8 "0", file=0x56380abf8c98 "../fheroes2/maps/maps_tiles.cpp", line=152, 
    function=0x56380abf8c60 "bool {anonymous}::isValidShadowSprite(int, uint8_t)") at assert.c:101
#4  0x000056380ab0917b in (anonymous namespace)::isValidShadowSprite (icn=455, icnIndex=0 '\000') at ../fheroes2/maps/maps_tiles.cpp:152
#5  0x000056380ab0a1de in Maps::Tiles::isShadowSprite (icn=455, icnIndex=0 '\000') at ../fheroes2/maps/maps_tiles.cpp:604
#6  0x000056380ab0a20b in Maps::Tiles::isShadowSprite (tileset=159 '\237', icnIndex=0 '\000') at ../fheroes2/maps/maps_tiles.cpp:609
#7  0x000056380ab0dfc4 in Maps::Tiles::isShadow (this=0x56380cf94290) at ../fheroes2/maps/maps_tiles.cpp:1680
#8  0x000056380ab0ac28 in Maps::Tiles::getOriginalPassability (this=0x56380cf94290) at ../fheroes2/maps/maps_tiles.cpp:911
#9  0x000056380ab0acc0 in Maps::Tiles::setInitialPassability (this=0x56380cf94290) at ../fheroes2/maps/maps_tiles.cpp:928
#10 0x000056380ab52b47 in World::PostLoad (this=0x56380ad0ee20 <World::Get()::insideWorld>, setTilePassabilities=true) at ../fheroes2/world/world.cpp:1328
#11 0x000056380ab61979 in World::ProcessNewMap (this=0x56380ad0ee20 <World::Get()::insideWorld>) at ../fheroes2/world/world_loadmap.cpp:701
#12 0x000056380ab60ed3 in World::LoadMapMP2 (this=0x56380ad0ee20 <World::Get()::insideWorld>, filename="./MAPS/ALLTEST.MX2") at ../fheroes2/world/world_loadmap.cpp:542
#13 0x000056380aa67c9a in (anonymous namespace)::LoadNewMap () at ../fheroes2/game/game_scenarioinfo.cpp:375
#14 0x000056380aa68053 in Game::ScenarioInfo () at ../fheroes2/game/game_scenarioinfo.cpp:412
#15 0x000056380aa5cd40 in Game::mainGameLoop (isFirstGameRun=false) at ../fheroes2/game/game_mainmenu.cpp:122
#16 0x000056380aa402e8 in main (argc=1, argv=0x7ffc5f748868) at ../fheroes2/game/fheroes2.cpp:226
(gdb) 

Map file

ALLTEST.zip

Additional info

The map could be loaded normally before I've added all the random monsters in the editor here: editor2_001

a1exsh commented 2 years ago

The map could be loaded normally before I've added all the random monsters in the editor...

No, it's actually a regression caused by these recent changes (random monsters have nothing to do with that): #4514

ihhub commented 2 years ago

I'll take a look.

a1exsh commented 2 years ago

@ihhub thanks for prompt fixing! :)