Re: [NEWBIE] Crashing circle30bpl16-dg7a-oasis2.0

From: Patrick Dughi (dughi@imaxx.net)
Date: 03/22/00


> del wrote:
> This topic has been up before, if you check the archives.. I believe the
> solution was to check to make sure there was a victim in fight code.
>
> steve wrote:
> I've been dabbling with the circle30bpl16-dg7a-oasis2.0 archive from the
> ftp site and I have come up with the following crash...
>
> Whenever a mortal character "kills" another mob, the mud crashes.
> I have narrowed down the error (as best I think I know how to) to fight.c
> in the raw_kill or die methods.
>
> void die(struct char_data * ch, struct char_data * killer)
> {
>   gain_exp(ch, -(GET_EXP(ch) / 2));
>   if (!IS_NPC(ch)) {
>     REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_KILLER);
>     REMOVE_BIT_AR(PLR_FLAGS(ch), PLR_THIEF);
>   }
>   raw_kill(ch, killer);  <-------
> }
>

        I read along in the archives, and apparently, this happens - yes -
due to one of these (usually the ch - person being killed) being
..well..killed, extracted, etc.  The fix was to check above to only run
the hitprcnt_mtrigger() code if damage does not return a -1 (-1 indicates
death).  Since you indicated that it was the death_mtrigger(), I suspect
this is a slightly different issue.

        The problem here is that you cannot necessarily check for the
validity of "ch".  If the character has been extracted, and that memory
freed, you have no guarentee that "ch" will be NULL, or has already been
reallocated, etc.  I have seen this problem a while ago with mobprogs
where the death code included loading up a new mob, and purging themselves
(to make it look like a death-transformation thing).  If you'd like to
know a good way to get around this sort of design limitation, check out my
moblists patch (and associated readme) at
ftp://ftp.circlemud.org/pub/CircleMUD/contrib/code/moblists.tar.gz

        I can't say this is the solution for sure, but it does allow a
sort of deferred status for characters to be extracted.  What I'm most
surprised about is that you imply this happens with every mob, when the
same situation happened to me before, only with specific mobs and was
state specific, so it didn't always go boom.

        So, i'd also take a long hard look at your version of
death_mtrigger - make sure that you don't do any extraction of characters
in there, or otherwise mangling your pointer.
                                                        PjD


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     |  http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html  |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 04/10/01 PDT