Jelajahi Sumber

Removed name checks from /b and /lb after finding out that /nb and /nlb use the same packet...

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@11387 54d463be-8e91-2dee-dedb-b68131a5f0ec
ultramage 17 tahun lalu
induk
melakukan
44e2d917a6
2 mengubah file dengan 20 tambahan dan 50 penghapusan
  1. 0 1
      Changelog-Trunk.txt
  2. 20 49
      src/map/clif.c

+ 0 - 1
Changelog-Trunk.txt

@@ -9,7 +9,6 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 	- removed some too aggressive checks in clif_parse_globalmessage()
 	- removed CHAT_SIZE define as it actually doesn't apply anywhere
 	- added CHAT_SIZE_MAX to serve as a custom limit to input string lengths
-	- added length/contents checks to /b and /lb (against fake names)
 2007/10/08
 	* Delayed the check for required items when a skill is cast to when they 
 	  are consumed. Now skills only fail due to lack of items after being cast.

+ 20 - 49
src/map/clif.c

@@ -8759,13 +8759,13 @@ void clif_parse_Wis(int fd, struct map_session_data* sd)
 }
 
 /*==========================================
- * /b
- * S 0099 <packet len>.w <text>.?B (<name>: <message>) 00
+ * /b /nb
+ * S 0099 <packet len>.w <text>.?B 00
  *------------------------------------------*/
 void clif_parse_GMmessage(int fd, struct map_session_data* sd)
 {
-	char *text, *name, *message;
-	unsigned int textlen, namelen, messagelen;
+	char* msg = (char*)RFIFOP(fd,4);
+	unsigned int len = RFIFOW(fd,2)-4;
 	int lv;
 
 	if (battle_config.atc_gmonly && !pc_isGM(sd))
@@ -8773,27 +8773,15 @@ void clif_parse_GMmessage(int fd, struct map_session_data* sd)
 	if (pc_isGM(sd) < (lv=get_atcommand_level(AtCommand_Broadcast)))
 		return;
 
-	text = (char*)RFIFOP(fd,4);
-	textlen = RFIFOW(fd,2) - 4;
+	// as the length varies depending on the command used, just block unreasonably long strings
+	mes_len_check(msg, len, CHAT_SIZE_MAX);
 
-	name = text;
-	namelen = strnlen(sd->status.name, NAME_LENGTH - 1);
-	// verify <name> part of the packet
-	if( strncmp(name, sd->status.name, namelen) || // the text must start with the speaker's name
-		name[namelen] != ':' || name[namelen+1] != ' ' ) // followed by ': '
-		return;
-
-	// make sure the <message> part of the packet is safe to handle
-	message = text + namelen + 2;
-	messagelen = textlen - namelen - 2; // this should be the message length (w/ zero byte included)
-	mes_len_check(message, messagelen, CHATBOX_SIZE);
-
-	intif_GMmessage(text, textlen, 0);
+	intif_GMmessage(msg, len, 0);
 
 	if(log_config.gm && lv >= log_config.gm) {
-		char msg[CHATBOX_SIZE+4];
-		sprintf(msg, "/b %s", message);
-		log_atcommand(sd, msg);
+		char logmsg[CHAT_SIZE_MAX+4];
+		sprintf(logmsg, "/b %s", msg);
+		log_atcommand(sd, logmsg);
 	}
 }
 
@@ -9773,15 +9761,13 @@ void clif_parse_ResetChar(int fd, struct map_session_data *sd)
 }
 
 /*==========================================
- * /lb
- * S 019c <packet len>.w <text>.?B (<name>: <message>) 00
+ * /lb /nlb
+ * S 019c <packet len>.w <text>.?B 00
  *------------------------------------------*/
 void clif_parse_LGMmessage(int fd, struct map_session_data* sd)
 {
-	char *text, *name, *message;
-	unsigned int textlen, namelen, messagelen;
-
-	unsigned char buf[CHATBOX_SIZE+4];
+	char* msg = (char*)RFIFOP(fd,4);
+	unsigned int len = RFIFOW(fd,2)-4;
 	int lv;
 
 	if (battle_config.atc_gmonly && !pc_isGM(sd))
@@ -9789,30 +9775,15 @@ void clif_parse_LGMmessage(int fd, struct map_session_data* sd)
 	if (pc_isGM(sd) < (lv=get_atcommand_level(AtCommand_LocalBroadcast)))
 		return;
 
-	text = (char*)RFIFOP(fd,4);
-	textlen = RFIFOW(fd,2) - 4;
+	// as the length varies depending on the command used, just block unreasonably long strings
+	mes_len_check(msg, len, CHAT_SIZE_MAX);
 
-	name = text;
-	namelen = strnlen(sd->status.name, NAME_LENGTH - 1);
-	// verify <name> part of the packet
-	if( strncmp(name, sd->status.name, namelen) || // the text must start with the speaker's name
-		name[namelen] != ':' || name[namelen+1] != ' ' ) // followed by ': '
-		return;
-
-	// make sure the <message> part of the packet is safe to handle
-	message = text + namelen + 2;
-	messagelen = textlen - namelen - 2; // this should be the message length (w/ zero byte included)
-	mes_len_check(message, messagelen, CHATBOX_SIZE);
-
-	WBUFW(buf,0) = 0x9a;
-	WBUFW(buf,2) = textlen+4;
-	memcpy(WBUFP(buf,4), text, textlen);
-	clif_send(buf, WBUFW(buf,2), &sd->bl, ALL_SAMEMAP);
+	clif_GMmessage(&sd->bl, msg, len, 1);
 
 	if(log_config.gm && lv >= log_config.gm) {
-		char msg[CHATBOX_SIZE+5];
-		sprintf(msg, "/lb %s", message);
-		log_atcommand(sd, msg);
+		char logmsg[CHAT_SIZE_MAX+5];
+		sprintf(logmsg, "/lb %s", msg);
+		log_atcommand(sd, logmsg);
 	}
 }