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
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user