From ed3b6aaac2e0a2ebb1a6dcfb61f9b512d4fd2097 Mon Sep 17 00:00:00 2001 From: Lee Salzman Date: Wed, 6 Jun 2007 01:27:26 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@1146 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/clients2c.cpp | 5 ++++- source/src/protocol.cpp | 17 +++++++++++++++++ source/src/protos.h | 1 + source/src/server.cpp | 18 +++++++++++++++--- 4 files changed, 37 insertions(+), 4 deletions(-) diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 10ae170b..aa9c1d51 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -145,6 +145,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) { int cn = getint(p); getstring(text, p); + filtertext(text, text); playerent *d = getclient(cn); if(!d) break; conoutf("%s:\f1 %s", colorname(d), text); @@ -161,6 +162,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) else if(d) { getstring(text, p); + filtertext(text, text); conoutf("%s:\f0 %s", colorname(d), text); } else return; @@ -198,6 +200,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) { d = newclient(cn); getstring(text, p); + filtertext(text, text, false, MAXNAMELEN); if(!text[0]) s_strcpy(text, "unarmed"); if(d->name[0]) // already connected { @@ -212,7 +215,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) } s_strncpy(d->name, text, MAXNAMELEN+1); getstring(text, p); - s_strncpy(d->team, text, MAXTEAMLEN+1); + filtertext(d->team, text, false, MAXTEAMLEN); setskin(d, getint(p)); d->lifesequence = getint(p); c2si = true; diff --git a/source/src/protocol.cpp b/source/src/protocol.cpp index 4731b4bc..a77185d7 100644 --- a/source/src/protocol.cpp +++ b/source/src/protocol.cpp @@ -74,6 +74,23 @@ void getstring(char *text, ucharbuf &p, int len) while(*t++); } +void filtertext(char *dst, const char *src, bool whitespace, int len) +{ + for(int c = *src; c; c = *++src) + { + switch(c) + { + case '\f': ++src; continue; + } + if(isspace(c) ? whitespace : isprint(c)) + { + *dst++ = c; + if(!--len) break; + } + } + *dst = '\0'; +} + const char *modenames[] = { "team deathmatch", "coopedit", "deathmatch", "survivor", diff --git a/source/src/protos.h b/source/src/protos.h index 57a95c19..0c784f8e 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -300,6 +300,7 @@ extern void putuint(ucharbuf &p, int n); extern int getuint(ucharbuf &p); extern void sendstring(const char *t, ucharbuf &p); extern void getstring(char *t, ucharbuf &p, int len = MAXTRANS); +extern void filtertext(char *dst, const char *src, bool whitespace = true, int len = sizeof(string)-1); extern void startintermission(); extern void restoreserverstate(vector &ents); extern uchar *retrieveservers(uchar *buf, int buflen); diff --git a/source/src/server.cpp b/source/src/server.cpp index f4599d73..4d2d3bd1 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -751,7 +751,7 @@ uchar *copydata = NULL; void sendmapserv(int n, string mapname, int mapsize, uchar *mapdata) { - if(mapsize <= 0 || mapsize > 256*256) return; + if(!mapname[0] || mapsize <= 0 || mapsize > 256*256) return; s_strcpy(copyname, mapname); copysize = mapsize; DELETEA(copydata); @@ -831,6 +831,9 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 if(packet->flags&ENET_PACKET_FLAG_RELIABLE) reliablemessages = true; #define QUEUE_MSG { if(cl->type==ST_TCPIP) while(curmsgmessages.add(p.buf[curmsg++]); } + #define QUEUE_INT(n) { if(cl->type==ST_TCPIP) { curmsg = p.length(); ucharbuf buf = cl->messages.reserve(5); putint(buf, n); cl->messages.addbuf(buf); } } + #define QUEUE_STR(text) { if(cl->type==ST_TCPIP) { curmsg = p.length(); ucharbuf buf = cl->messages.reserve(2*strlen(text)+1); sendstring(text, buf); cl->messages.addbuf(buf); } } + int curmsg; while((curmsg = p.length()) < p.maxlen) switch(type = checktype(getint(p), cl)) { @@ -840,20 +843,26 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 case SV_TEAMTEXT: getstring(text, p); + filtertext(text, text); sendteamtext(text, sender); break; case SV_TEXT: - getstring(text, p); QUEUE_MSG; + getstring(text, p); + filtertext(text, text); + QUEUE_STR(text); break; case SV_INITC2S: { + QUEUE_MSG; bool newclient = false; if(!cl->name[0]) newclient = true; getstring(text, p); + filtertext(text, text, false, MAXNAMELEN); if(!text[0]) s_strcpy(text, "unarmed"); + QUEUE_STR(text); s_strncpy(cl->name, text, MAXNAMELEN+1); if(newclient && cl->type==ST_TCPIP) { @@ -865,7 +874,8 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 } } getstring(text, p); - s_strncpy(cl->team, text, MAXTEAMLEN+1); + filtertext(cl->team, text, false, MAXTEAMLEN); + QUEUE_STR(text); getint(p); getint(p); QUEUE_MSG; @@ -875,6 +885,7 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 case SV_MAPCHANGE: { getstring(text, p); + filtertext(text, text); int reqmode = getint(p); if(cl->type==ST_TCPIP && !m_mp(reqmode)) reqmode = 0; if(smapname[0] && !mapreload && !vote(text, reqmode, sender)) return; @@ -933,6 +944,7 @@ void process(ENetPacket *packet, int sender, int chan) // sender may be -1 case SV_SENDMAP: { getstring(text, p); + filtertext(text, text); int mapsize = getint(p); if(p.remaining() < mapsize) {