OpenTTD/OpenTTD

[Crash]: max_train_length assertion in ReplaceChain can be triggered for long articulated leading engines when wagon removal is enabled

Opened this issue · 1 comments

Version of OpenTTD

master

Steps to reproduce

Replace/autorenew train when wagon removal is enabled and the leading engine is longer than the current value of the max_train_length setting.

Autoreplace Testing Ltd, 2056-07-05.sav.zip
Or start the train in the attached save.

The default value of max_train_length is 7, but recent NewGRFs such as GETS have engines (i.e. MU consists) longer than that.

Upload crash files

#0  __pthread_kill_implementation (no_tid=0, signo=6, threadid=140735670793792) at ./nptl/pthread_kill.c:44
#1  __pthread_kill_internal (signo=6, threadid=140735670793792) at ./nptl/pthread_kill.c:78
#2  __GI___pthread_kill (threadid=140735670793792, signo=signo@entry=6) at ./nptl/pthread_kill.c:89
#3  0x00007ffff6f9a476 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26
#4  0x00007ffff6f807f3 in __GI_abort () at ./stdlib/abort.c:79
#5  0x00007ffff6f8071b in __assert_fail_base
    (fmt=0x7ffff7135130 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x5555561a1f70 "Train::From(new_head)->gcache.cached_total_length <= _settings_game.vehicle.max_train_length * TILE_SIZE", file=0x5555561a1b78 "/home/jgr/openttd/trunk/src/autoreplace_cmd.cpp", line=613, function=<optimised out>) at ./assert/assert.c:92
#6  0x00007ffff6f91e96 in __GI___assert_fail
    (assertion=0x5555561a1f70 "Train::From(new_head)->gcache.cached_total_length <= _settings_game.vehicle.max_train_length * TILE_SIZE", file=0x5555561a1b78 "/home/jgr/openttd/trunk/src/autoreplace_cmd.cpp", line=613, function=0x5555561a1f00 "CommandCost ReplaceChain(Vehicle**, DoCommandFlag, bool, bool*)") at ./assert/assert.c:101
#7  0x0000555555cf414d in ReplaceChain(Vehicle**, DoCommandFlag, bool, bool*) (chain=0x7fff93aa26e8, flags=DC_NONE, wagon_removal=true, nothing_to_do=<optimised out>) at /home/jgr/openttd/trunk/src/autoreplace_cmd.cpp:613
#8  0x0000555555cf4752 in CmdAutoreplaceVehicle(DoCommandFlag, unsigned int) (flags=flags@entry=DC_NONE, veh_id=veh_id@entry=2) at /home/jgr/openttd/trunk/src/command_type.h:385
#9  0x00005555560dad32 in CommandHelper<(Commands)116, CommandCost (*)(DoCommandFlag, unsigned int), true>::Do(DoCommandFlag, unsigned int) (args#0=2, flags=DC_EXEC) at /home/jgr/openttd/trunk/src/command_func.h:162
#10 CallVehicleTicks() () at /home/jgr/openttd/trunk/src/vehicle.cpp:1088
#11 0x0000555555f3ebc2 in StateGameLoop() () at /home/jgr/openttd/trunk/src/openttd.cpp:1271
#12 0x0000555555f3fddd in GameLoop() () at /home/jgr/openttd/trunk/src/openttd.cpp:1392
#13 0x0000555555cd5632 in VideoDriver::GameLoop() (this=0x55555679a1d0) at /home/jgr/openttd/trunk/src/video/video_driver.cpp:39
#14 0x0000555555cd56d3 in VideoDriver::GameThread() (this=0x55555679a1d0) at /home/jgr/openttd/trunk/src/video/video_driver.cpp:46
#15 0x0000555555cd7ba2 in StartNewThread<void (*)(VideoDriver*), VideoDriver*>(std::thread*, char const*, void (*&&)(VideoDriver*), VideoDriver*&&)::{lambda(char const*, void (*&&)(VideoDriver*), VideoDriver*&&)#1}::operator()(char const*, void (*&&)(VideoDriver*), VideoDriver*&&) const (__closure=<optimised out>, A#0=<optimised out>, F=<optimised out>, name=0x555556199b96 "ottd:game") at /home/jgr/openttd/trunk/src/video/../thread.h:65
#16 std::__invoke_impl<void, StartNewThread<void (*)(VideoDriver*), VideoDriver*>(std::thread*, char const*, void (*&&)(VideoDriver*), VideoDriver*&&)::{lambda(char const*, void (*&&)(VideoDriver*), VideoDriver*&&)#1}, char const*, void (*)(VideoDriver*), VideoDriver*>(std::__invoke_other, StartNewThread<void (*)(VideoDriver*), VideoDriver*>(std::thread*, char const*, void (*&&)(VideoDriver*), VideoDriver*&&)::{lambda(char const*, void (*&&&&)(VideoDriver*), VideoDriver*&&)#1}, char const*&&, void (*&&)(VideoDriver*), VideoDriver*&&) (__f=<optimised out>) at /usr/include/c++/11/bits/invoke.h:61
#17 _ZSt8__invokeIZ14StartNewThreadIPFvP11VideoDriverEJS2_EEbPSt6threadPKcOT_DpOT0_EUlS8_OS4_OS2_E_JS8_S4_S2_EENSt15__invoke_resultIS9_JDpSB_EE4typeESA_SD_ (__fn=<optimised out>) at /usr/include/c++/11/bits/invoke.h:96
#18 std::thread::_Invoker<std::tuple<StartNewThread<void (*)(VideoDriver*), VideoDriver*>(std::thread*, char const*, void (*&&)(VideoDriver*), VideoDriver*&&)::{lambda(char const*, void (*&&)(VideoDriver*), VideoDriver*&&)#1}, char const*, void (*)(VideoDriver*), VideoDriver*> >::_M_invoke<0ul, 1ul, 2ul, 3ul>(std::_Index_tuple<0ul, 1ul, 2ul, 3ul>) (this=<optimised out>) at /usr/include/c++/11/bits/std_thread.h:259
#19 std::thread::_Invoker<std::tuple<StartNewThread<void (*)(VideoDriver*), VideoDriver*>(std::thread*, char const*, void (*&&)(VideoDriver*), VideoDriver*&&)::{lambda(char const*, void (*&&)(VideoDriver*), VideoDriver*&&)#1}, char const*, void (*)(VideoDriver*), VideoDriver*> >::operator()() (this=<optimised out>) at /usr/include/c++/11/bits/std_thread.h:266
#20 std::thread::_State_impl<std::thread::_Invoker<std::tuple<StartNewThread<void (*)(VideoDriver*), VideoDriver*>(std::thread*, char const*, void (*&&)(VideoDriver*), VideoDriver*&&)::{lambda(char const*, void (*&&)(VideoDriver*), VideoDriver*&&)#1}, char const*, void (*)(VideoDriver*), VideoDriver*> > >::_M_run() (this=0x555558538fa0) at /usr/include/c++/11/bits/std_thread.h:211
#21 0x00007ffff7364253 in  () at /lib/x86_64-linux-gnu/libstdc++.so.6
#22 0x00007ffff6fecac3 in start_thread (arg=<optimised out>) at ./nptl/pthread_create.c:442
#23 0x00007ffff707e850 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81

I was able to reproduce the crash on a5c2543, using the much smaller BRTrains GRF.
crash20240510075420.zip