فهرست منبع

Converted CZ_BROADCAST to struct (#8793)

Lemongrass3110 6 ماه پیش
والد
کامیت
957ac0e521
3فایلهای تغییر یافته به همراه22 افزوده شده و 10 حذف شده
  1. 14 9
      src/map/clif.cpp
  2. 1 1
      src/map/clif_packetdb.hpp
  3. 7 0
      src/map/packets.hpp

+ 14 - 9
src/map/clif.cpp

@@ -11930,19 +11930,24 @@ void clif_parse_WisMessage(int fd, map_session_data* sd)
 }
 
 
-/// /b /nb (CZ_BROADCAST).
+/// /b /nb.
 /// Request to broadcast a message on whole server.
-/// 0099 <packet len>.W <text>.?B 00
+/// 0099 <packet len>.W <text>.?B 00 (CZ_BROADCAST)
 void clif_parse_Broadcast(int fd, map_session_data* sd) {
-	char command[CHAT_SIZE_MAX+11];
-	struct s_packet_db* info = &packet_db[RFIFOW(fd,0)];
-	uint32 len = RFIFOW(fd,info->pos[0])-4;
-	char* msg = RFIFOCP(fd,info->pos[1]);
+	const PACKET_CZ_BROADCAST* p = reinterpret_cast<PACKET_CZ_BROADCAST*>( RFIFOP( fd, 0 ) );
 
-	// as the length varies depending on the command used, just block unreasonably long strings
-	mes_len_check(msg, len, CHAT_SIZE_MAX);
+	if( p->packetSize < sizeof( *p ) ){
+		return;
+	}
+
+	char message[CHAT_SIZE_MAX];
+
+	safestrncpy( message, p->message, std::min<size_t>( sizeof( message ), p->packetSize - sizeof( *p ) + 1 ) );
+
+	char command[CHAT_SIZE_MAX];
+
+	safesnprintf( command, sizeof( command ),"%ckami %s", atcommand_symbol, message );
 
-	safesnprintf(command,sizeof(command),"%ckami %s", atcommand_symbol, msg);
 	is_atcommand(fd, sd, command, 1);
 }
 

+ 1 - 1
src/map/clif_packetdb.hpp

@@ -45,7 +45,7 @@
 	packet(0x0093,2);
 	parseable_packet(0x0094,6,clif_parse_GetCharNameRequest,2);
 	parseable_packet(0x0096,-1,clif_parse_WisMessage,2,4,28);
-	parseable_packet(0x0099,-1,clif_parse_Broadcast,2,4);
+	parseable_packet( HEADER_CZ_BROADCAST, -1, clif_parse_Broadcast, 0 );
 	parseable_packet(0x009b,5,clif_parse_ChangeDir,2,4);
 	packet( HEADER_ZC_ITEM_ENTRY, sizeof( struct PACKET_ZC_ITEM_ENTRY ) );
 	packet(0x009e,17);

+ 7 - 0
src/map/packets.hpp

@@ -1417,6 +1417,13 @@ struct PACKET_CZ_MOVETO_MAP{
 } __attribute__((packed));
 DEFINE_PACKET_HEADER(CZ_MOVETO_MAP, 0x140);
 
+struct PACKET_CZ_BROADCAST{
+	int16 packetType;
+	uint16 packetSize;
+	char message[];
+} __attribute__((packed));
+DEFINE_PACKET_HEADER(CZ_BROADCAST, 0x99);
+
 // NetBSD 5 and Solaris don't like pragma pack but accept the packed attribute
 #if !defined( sun ) && ( !defined( __NETBSD__ ) || __NetBSD_Version__ >= 600000000 )
 	#pragma pack( pop )