From c0aedc4c41ebc4959344a283ac7ea4a2296fb204 Mon Sep 17 00:00:00 2001 From: ultramage Date: Sat, 11 Oct 2008 06:57:14 +0000 Subject: Added safeguards to Redemptio's exp penalty code to prevent arithmetic overflow in case its requirement checks are somehow bypassed (see topic:152196). git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13277 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/map/pc.c | 10 ++-------- src/map/skill.c | 8 ++++---- 2 files changed, 6 insertions(+), 12 deletions(-) (limited to 'src/map') diff --git a/src/map/pc.c b/src/map/pc.c index ca395d955..7774680f7 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -5172,10 +5172,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) if(base_penalty) { if (battle_config.pk_mode && src && src->type==BL_PC) base_penalty*=2; - if(sd->status.base_exp < base_penalty) - sd->status.base_exp = 0; - else - sd->status.base_exp -= base_penalty; + sd->status.base_exp -= min(sd->status.base_exp, base_penalty); clif_updatestatus(sd,SP_BASEEXP); } } @@ -5193,10 +5190,7 @@ int pc_dead(struct map_session_data *sd,struct block_list *src) if(base_penalty) { if (battle_config.pk_mode && src && src->type==BL_PC) base_penalty*=2; - if(sd->status.job_exp < base_penalty) - sd->status.job_exp = 0; - else - sd->status.job_exp -= base_penalty; + sd->status.job_exp -= min(sd->status.job_exp, base_penalty); clif_updatestatus(sd,SP_JOBEXP); } } diff --git a/src/map/skill.c b/src/map/skill.c index 25988faee..86ec51f33 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -3054,8 +3054,8 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in } skill_area_temp[0] = 5 - skill_area_temp[0]; // The actual penalty... if (skill_area_temp[0] > 0 && !map[src->m].flag.noexppenalty) { //Apply penalty - sd->status.base_exp -= pc_nextbaseexp(sd) * skill_area_temp[0] * 2/1000; //0.2% penalty per each. - sd->status.job_exp -= pc_nextjobexp(sd) * skill_area_temp[0] * 2/1000; + sd->status.base_exp -= min(sd->status.base_exp, pc_nextbaseexp(sd) * skill_area_temp[0] * 2/1000); //0.2% penalty per each. + sd->status.job_exp -= min(sd->status.job_exp, pc_nextjobexp(sd) * skill_area_temp[0] * 2/1000); clif_updatestatus(sd,SP_BASEEXP); clif_updatestatus(sd,SP_JOBEXP); } @@ -8152,8 +8152,8 @@ int skill_check_condition(struct map_session_data* sd, short skill, short lv, in case PR_REDEMPTIO: { int exp; - if(((exp = pc_nextbaseexp(sd)) > 0 && sd->status.base_exp*100/exp < 1) || - ((exp = pc_nextjobexp(sd)) > 0 && sd->status.job_exp*100/exp < 1)) { + if( ((exp = pc_nextbaseexp(sd)) > 0 && get_percentage(sd->status.base_exp, exp) < 1) || + ((exp = pc_nextjobexp(sd)) > 0 && get_percentage(sd->status.job_exp, exp) < 1)) { clif_skill_fail(sd,skill,0,0); //Not enough exp. return 0; } -- cgit v1.2.3-70-g09d2