Ancyker - May 28, 2015 16:42
[b]skill.c[/b][code=auto:0]
switch (sg->unit_id) {
case UNT_FIREWALL:
case UNT_KAEN: {
int count=0;
const int x = bl->x, y = bl->y;
if( sg->skill_id == GN_WALLOFTHORN && !map_flag_vs(bl->m) )
break;
//Take into account these hit more times than the timer interval can handle.
do
skill->attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick+count*sg->interval,0);
while(--src->val2 && x == bl->x && y == bl->y
&& ++count < SKILLUNITTIMER_INTERVAL/sg->interval && !status->isdead(bl));
if (src->val2<=0)
skill->delunit(src);
}
break;
[/code]
If SA_LANDPROTECTOR is cast over a UNT_FIREWALL or UNT_KAEN unit during the while statements execution, the code will pull garbage data and crash.
The above is an assumption, as I did not test further. This was discovered by spamming firewall (and firepillar) on a player that had a Detale card.