Forráskód Böngészése

Added protection from segfault by int overflow in atcommand heal. (bugreport:1886)

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@13321 54d463be-8e91-2dee-dedb-b68131a5f0ec
Paradox924X 16 éve
szülő
commit
53264778f7
2 módosított fájl, 11 hozzáadás és 2 törlés
  1. 1 0
      Changelog-Trunk.txt
  2. 10 2
      src/map/atcommand.c

+ 1 - 0
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/24
+	* Added protection from segfault by int overflow in atcommand heal. (bugreport:1886) [Paradox924X]
 	* Commented out unused function clif_marriage_process. [Paradox924X]
 2008/10/21
 	* Added a check to make sure a player wasn't in a guild when they accepted a guild invitation. [Paradox924X]

+ 10 - 2
src/map/atcommand.c

@@ -1504,14 +1504,22 @@ 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) {
+	if ( ( hp == 0 && sp == 0 )
+		|| ( hp > 2147483647 || sp > 2147483647 ) ) { // 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
 			clif_displaymessage(fd, msg_txt(17)); // HP, SP recovered.
 		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, -hp, 0 , 4, 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.