# HG changeset patch # User sheepluva # Date 1439087441 -7200 # Node ID 79a77bef4c61af84d881b81f26da597c81f26de2 # Parent d29a05a55bbc22c74becf5431605d2c0e3c1217b Hammer had been accessing dangling pointers under particular circumstances (e.g. when hitting a mine/barrel right when it exploded) diff -r d29a05a55bbc -r 79a77bef4c61 hedgewars/uGearsList.pas --- a/hedgewars/uGearsList.pas Sun Aug 09 04:02:23 2015 +0200 +++ b/hedgewars/uGearsList.pas Sun Aug 09 04:30:41 2015 +0200 @@ -155,7 +155,7 @@ Gear^.NextGear^.PrevGear:= Gear^.PrevGear; if Gear^.PrevGear <> nil then Gear^.PrevGear^.NextGear:= Gear^.NextGear -else +else GearsList:= Gear^.NextGear; Gear^.NextGear:= nil; @@ -671,6 +671,7 @@ t,i: Longword; k: boolean; cakeData: PCakeData; + iterator: PGear; begin ScriptCall('onGearDelete', gear^.uid); @@ -679,6 +680,31 @@ FreeAndNilTexture(Gear^.Tex); +// remove potential links to this gear +// currently relevant to: gears linked by hammer +if (Gear^.Kind = gtHedgehog) or (Gear^.Kind = gtMine) or (Gear^.Kind = gtExplosives) then + begin + // check all gears for stuff to port through + iterator := nil; + while true do + begin + + // iterate through GearsList + if iterator = nil then + iterator := GearsList + else + iterator := iterator^.NextGear; + + // end of list? + if iterator = nil then + break; + + if iterator^.LinkedGear = Gear then + iterator^.LinkedGear:= nil; + end; + + end; + // make sure that portals have their link removed before deletion if (Gear^.Kind = gtPortal) then begin