Welcome to the Builder Academy

Question Crash In free_list()

More
22 May 2017 03:16 - 22 May 2017 03:17 #6762 by WhiskyTest
Hi all,

I have found/created a crash that I'd like to run past the community:

It happened immediately after implementing my points regeneration patch that I posted in the Snippets section (haha yeah I know..)

So the crash happens like this:
Log a character into the Mud and run around a bit - this creates the event to regenerate movement points.
Reconnect to the Mud and log in using the same character, as soon as you enter the password the crash happens.
Code:
free_list (pList=0x0) free_char (ch=0x601476180) perform_dupe_check (d=0x601477790) nanny (d=0x601477790, d@entry=0x601477790, arg=0xffffc480 \"Password1\", arg@entry=0xffffc480 \"Password1\") game_loop (local_mother_desc=3) init_game (local_port=4000) main (argc=1, argv=<optimized out>)

In this case free_list() is called from free_char(), it's when all the events are being cleaned up. For some reason NULL is being sent to free_list().
And it is here that I made the following change:
Code:
db.c, free_char() @ line 3222 /* Mud Events */ if (ch->events != NULL) { if (ch->events->iSize > 0) { struct event * pEvent; while ((pEvent = simple_list(ch->events)) != NULL) event_cancel(pEvent); } + if(ch->events) free_list(ch->events); ch->events = NULL; }
This fixes the crash.

So I'm wondering, is skipping free_list(ch->events) in this case OK ? Or am I causing memory troubles further down the road?
If someone could idiot check my thinking here it would be much appreciated :)
Last edit: 22 May 2017 03:17 by WhiskyTest.

Please Log in or Create an account to join the conversation.

More
22 May 2017 05:08 #6763 by WhiskyTest
Replied by WhiskyTest on topic Crash In free_list()
Further testing reveals the above changes do NOT fix the crash, they merely delay it.
I get the following warnings immediately before the next crash:
Code:
May 22 17:02:53 201 :: WARNING: Attempting to merge iterator to NULL list. May 22 17:02:53 201 :: WARNING: Attempting to remove iterator from NULL list. May 22 17:02:53 201 :: WARNING: Attempting to remove contents that don't exist in list.

I have undone the changes I made above, and slowly disabled and tested each part of the event regeneration.
I appears that when check_regen_rates() is called and it creates a new event, this will cause the crash if you reconnect while that event is still queued up to fire.

Here is that piece of code:
Code:
void check_regen_rates(struct char_data *ch) { int gain = 0; long time; /* Incapacitated or worse won't regenerate */ if (GET_POS(ch) < POS_STUNNED) return; /* Check movement regeneration */ if (GET_MOVE(ch) < GET_MAX_MOVE(ch)) { gain = move_gain(ch); time = (SECS_PER_MUD_HOUR*PASSES_PER_SEC) / (gain ? gain : 1); /* If there is no eHIT_REGEN create one, otherwise update the existing event with the new time */ if (!char_has_mud_event(ch, eMOVE_REGEN)) NEW_EVENT(eMOVE_REGEN, ch, NULL, time); else change_event_duration(ch, eMOVE_REGEN, time); }

Hopefully I'm just missing something simple, if anyone has any pointers sing out :D

Please Log in or Create an account to join the conversation.

More
22 May 2017 23:54 #6767 by WhiskyTest
Replied by WhiskyTest on topic Crash In free_list()
When a character disconnects and reconnects their events get cleared.
If an event that was created prior to the disconnect then fires, it will crash when trying to free/cancel itself because it's trying to free events from ch that are already free due to the disconnect.

I think.

Please Log in or Create an account to join the conversation.

More
26 Jan 2018 21:01 #7451 by Sascha
Replied by Sascha on topic Crash In free_list()
I just saw this come up here:

Alycia the Trapper leaves east.

i1 510H 110M 92V >

[ WARNING: Attempting to get content from iterator with NULL list. ]
[ WARNING: Attempting to remove iterator from NULL list. ]

i1 510H 110M 92V >

Alycia the Trapper has arrived.

Since I'm running your event regen patch, I think you're on the right track. I haven't crashed yet, though. (knock on wood)

Will you stand against the coming Storm? After the Breaking: STORMRIDERS MUD - atbmud.dune.net port 4000

Please Log in or Create an account to join the conversation.

More
27 Jan 2018 00:15 #7453 by WhiskyTest
Replied by WhiskyTest on topic Crash In free_list()
This was only happening in the original event regen which used mud_events.
The patch you have doesn't generate the above warnings.

I am wondering though, Welcor fixed an issue where if a character logs out and back in they get a different pointer. That would explain the crash in the original post. I might revisit the mud_event regen with that fix in place.

Thanks for reminding me :D

Please Log in or Create an account to join the conversation.

More
27 Jan 2018 17:02 #7456 by Sascha
Replied by Sascha on topic Crash In free_list()
Awesome, thanks for the updated info regarding the current patch!

Will you stand against the coming Storm? After the Breaking: STORMRIDERS MUD - atbmud.dune.net port 4000

Please Log in or Create an account to join the conversation.

Time to create page: 0.231 seconds