On Thu, Nov 23, 2000 at 04:52:38PM -0800, Peter Mardahl wrote: > I checked in a "fix" for this problem, but I think the bug is > actually somewhere else than I "fixed" it. Oops, my bug. And the bug really is in check_fired_arch(). hit_player() is allowed to do about anything. hit_player() can trigger runes, runes can summon monster, monster can pick up stuff, etc. pp. > if (was_destroyed (op, op_tag) || ! was_destroyed (tmp, tmp_tag) ^^^^^^^^^^^^^^^^^^^^^^^^^^ > || (op->stats.dam -= dam) < 0) > { > if(!QUERY_FLAG(op,FLAG_REMOVED)) { /* line ADDED */ > remove_ob (op); ^^^^^^^^^^^^^^^ > free_object(op); > return; > } Broken code (without the QUERY_FLAG) - if 'op' was already destroyed (which means it was already freed), it will be removed and freed again. 'op' may have been reused and therefore not have FLAG_REMOVED, even though it's not the same object anymore. Correct fix would be this: if (was_destroyed (op, op_tag)) return; if ( ! was_destroyed (tmp, tmp_tag) || (op->stats.dam -= dam) < 0) { remove_ob (op); free_object(op); return; } Maybe remove_ob() and free_object() should just print an error message and otherwise ignore objects that are already removed or freed. This would prevent some needless server crashes. -- Jan