Here is my fix to do_order's crash bug:
When applying, add cloop_member variable to struct char_data in structs.h:
bool cloop_member; /* For complicated loops handling */
Then paste in the following code:
ACMD(do_order)
{
[...]
} else { /* This is order "followers" */
sprintf(buf, "$n issues the order '%s'.", message);
act(buf, FALSE, ch, 0, 0, TO_ROOM); /* Zmey: replaced vict with 0 */
org_room = ch->in_room; /* Pointer to ch can be lost later */
for (vict = world[org_room].people; vict; vict = vict->next_in_room)
if (vict->master == ch && AFF_FLAGGED(vict, AFF_CHARM)) {
found = TRUE;
/* Mark follower as complicated loop's member */
vict->cloop_member = TRUE;
} else {
/* Otherwise, clear the mark */
vict->cloop_member = FALSE;
}
if (found)
send_to_char(OK, ch);
else
send_to_char("Nobody here is a loyal subject of yours!\r\n", ch);
vict = world[org_room].people;
while (vict) {
if (vict->cloop_member) {
vict->cloop_member = FALSE;
command_interpreter(vict, message);
/* Loop is broken now, start from beginning: */
vict = world[org_room].people;
} else
vict = vict->next_in_room;
}
}
}
}
Btw, currently few more functions have potential crash bugs of that
type. They can be rewritten using additional variable (cloop_member)
for vict's existence checking. The basic algorythm:
1) Cycle through victims, mark them
2) Cycle through victims, lookup marked ones and perform actions.
After every action performed, resume at the 1st member of list.
Zmey // 3MoonsWorld (rmud.net.ru:4000)
+------------------------------------------------------------+
| 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 : 12/15/00 PST