From b8930b01796ed45000a6929b56d1f3a92b8d40c0 Mon Sep 17 00:00:00 2001 From: Paradox924X Date: Tue, 28 Oct 2008 05:45:34 +0000 Subject: Fixed all overflow checks and made the code a bit cleaner from r13322. git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@13331 54d463be-8e91-2dee-dedb-b68131a5f0ec --- Changelog-Trunk.txt | 1 + src/map/atcommand.c | 46 +++++++++++++++++++++++++++++++++++---------- src/map/charcommand.c | 52 ++++++++++++++++++++++++++++++++++++++------------- 3 files changed, 76 insertions(+), 23 deletions(-) diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt index a5d2ab0c1..049e73428 100644 --- a/Changelog-Trunk.txt +++ b/Changelog-Trunk.txt @@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK. 2008/10/27 + * Fixed all overflow checks and made the code a bit cleaner from r13322. [Paradox924X] * Removed leftovers of "bLoseSPWhenUnequip" and "bDamageWhenUnequip". [Paradox924X] 2008/10/24 * Added protection from segfault by int overflow in charcommand heal and fixed a typo in atcommand heal. (Follow-up to r13321) [Paradox924X] diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 260288690..e37c712af 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -1505,7 +1505,7 @@ int atcommand_heal(const int fd, struct map_session_data* sd, const char* comman sscanf(message, "%d %d", &hp, &sp); if ( ( hp == 0 && sp == 0 ) - || ( hp > 2147483647 || sp > 2147483647 ) ) { // Prevent overflow. [Paradox924X] + || ( hp > INT_MAX && sp > INT_MAX ) ) { // Prevent overflow. [Paradox924X] if (!status_percent_heal(&sd->bl, 100, 100)) clif_displaymessage(fd, msg_txt(157)); // HP and SP have already been recovered. else @@ -1513,14 +1513,40 @@ int atcommand_heal(const int fd, struct map_session_data* sd, const char* comman return 0; } - if ( hp < -2147483647 || sp < -2147483647 ) { // Prevent overflow. [Paradox924X] - status_damage(NULL, &sd->bl, 2147483647, 2147483647, 0, 0); - clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, 2147483647, 0 , 4, 0); + // Prevent overflow. [Paradox924X] + if ( hp < -INT_MAX && sp < -INT_MAX ) { + status_damage(NULL, &sd->bl, INT_MAX, INT_MAX, 0, 0); + clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, INT_MAX, 0, 4, 0); clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. return 0; } - if(hp > 0 && sp >= 0) { + // Prevent overflow. [Paradox924X] + if ( hp > INT_MAX ) { + if (!status_percent_heal(&sd->bl, 100, 0)) + clif_displaymessage(fd, msg_txt(157)); // HP and SP have already been recovered. + else + clif_displaymessage(fd, msg_txt(17)); // HP, SP recovered. + return 0; + } else if ( hp < -INT_MAX ) { + status_damage(NULL, &sd->bl, INT_MAX, 0, 0, 0); + clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, INT_MAX, 0, 4, 0); + clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. + return 0; + } + + // Prevent overflow. [Paradox924X] + if ( sp > INT_MAX ) { + status_heal(&sd->bl, 0, INT_MAX, 0); + clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. + return 0; + } else if ( sp < -INT_MAX ) { + status_damage(NULL, &sd->bl, 0, INT_MAX, 0, 0); + clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. + return 0; + } + + if ( hp > 0 && sp >= 0 ) { if(!status_heal(&sd->bl, hp, sp, 0)) clif_displaymessage(fd, msg_txt(157)); // HP and SP are already with the good value. else @@ -1528,24 +1554,24 @@ int atcommand_heal(const int fd, struct map_session_data* sd, const char* comman return 0; } - if(hp < 0 && sp <= 0) { + if ( hp < 0 && sp <= 0 ) { status_damage(NULL, &sd->bl, -hp, -sp, 0, 0); - clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0); + clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, 4, 0); clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. return 0; } //Opposing signs. - if (hp) { + if ( hp ) { if (hp > 0) status_heal(&sd->bl, hp, 0, 0); else { status_damage(NULL, &sd->bl, -hp, 0, 0, 0); - clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0); + clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0, 4, 0); } } - if (sp) { + if ( sp ) { if (sp > 0) status_heal(&sd->bl, 0, sp, 0); else diff --git a/src/map/charcommand.c b/src/map/charcommand.c index f3590e08d..39d4f817e 100644 --- a/src/map/charcommand.c +++ b/src/map/charcommand.c @@ -1795,7 +1795,7 @@ int charcommand_heal(const int fd, struct map_session_data* sd, const char* comm } if ( ( hp == 0 && sp == 0 ) - || ( hp > 2147483647 || sp > 2147483647 ) ) { // Prevent overflow. [Paradox924X] + || ( hp > INT_MAX && sp > INT_MAX ) ) { // Prevent overflow. [Paradox924X] if (!status_percent_heal(&pl_sd->bl, 100, 100)) clif_displaymessage(fd, msg_txt(157)); // HP and SP are already with the good value. else @@ -1807,37 +1807,63 @@ int charcommand_heal(const int fd, struct map_session_data* sd, const char* comm return 0; } - if ( hp < -2147483647 || sp < -2147483647 ) { // Prevent overflow. [Paradox924X] - status_damage(NULL, &pl_sd->bl, 2147483647, 2147483647, 0, 0); - clif_damage(&pl_sd->bl,&pl_sd->bl, gettick(), 0, 0, 2147483647, 0 , 4, 0); + // Prevent overflow. [Paradox924X] + if ( hp < -INT_MAX && sp < -INT_MAX ) { + status_damage(NULL, &pl_sd->bl, INT_MAX, INT_MAX, 0, 0); + clif_damage(&pl_sd->bl,&pl_sd->bl, gettick(), 0, 0, INT_MAX, 0 , 4, 0); clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. return 0; } - + + // Prevent overflow. [Paradox924X] + if ( hp > INT_MAX ) { + if (!status_percent_heal(&pl_sd->bl, 100, 0)) + clif_displaymessage(fd, msg_txt(157)); // HP and SP have already been recovered. + else + clif_displaymessage(fd, msg_txt(17)); // HP, SP recovered. + return 0; + } else if ( hp < -INT_MAX ) { + status_damage(NULL, &pl_sd->bl, INT_MAX, 0, 0, 0); + clif_damage(&pl_sd->bl,&pl_sd->bl, gettick(), 0, 0, INT_MAX, 0, 4, 0); + clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. + return 0; + } + + // Prevent overflow. [Paradox924X] + if ( sp > INT_MAX ) { + status_heal(&pl_sd->bl, 0, INT_MAX, 0); + clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. + return 0; + } else if ( sp < -INT_MAX ) { + status_damage(NULL, &pl_sd->bl, 0, INT_MAX, 0, 0); + clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. + return 0; + } + if(hp > 0 && sp >= 0) { - if(!status_heal(&pl_sd->bl, hp, sp, 2)) + if( !status_heal(&pl_sd->bl, hp, sp, 2) ) clif_displaymessage(fd, msg_txt(157)); // HP and SP are already with the good value. else { clif_displaymessage(pl_sd->fd, msg_txt(17)); // HP, SP recovered. - if (pl_sd->fd != fd) + if ( pl_sd->fd != fd ) clif_displaymessage(fd, msg_txt(17)); // HP, SP recovered. } return 0; } - if(hp < 0 && sp <= 0) { + if( hp < 0 && sp <= 0 ) { status_damage(NULL, &pl_sd->bl, -hp, -sp, 0, 0); clif_damage(&pl_sd->bl,&pl_sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0); clif_displaymessage(pl_sd->fd, msg_txt(156)); // HP or/and SP modified. - if (pl_sd->fd != fd) + if ( pl_sd->fd != fd ) clif_displaymessage(fd, msg_txt(156)); // HP or/and SP modified. return 0; } //Opposing signs. - if (hp) { - if (hp > 0) + if ( hp ) { + if ( hp > 0 ) status_heal(&pl_sd->bl, hp, 0, 2); else { status_damage(NULL, &pl_sd->bl, -hp, 0, 0, 0); @@ -1845,8 +1871,8 @@ int charcommand_heal(const int fd, struct map_session_data* sd, const char* comm } } - if (sp) { - if (sp > 0) + if ( sp ) { + if ( sp > 0 ) status_heal(&pl_sd->bl, 0, sp, 2); else status_damage(NULL, &pl_sd->bl, 0, -sp, 0, 0); -- cgit v1.2.3-70-g09d2