diff options
| -rw-r--r-- | scripts/netobj.py | 17 | ||||
| -rw-r--r-- | src/game/client/gc_hooks.cpp | 2 | ||||
| -rw-r--r-- | src/game/g_protocol.def | 20 | ||||
| -rw-r--r-- | src/game/server/gs_server.cpp | 2 |
4 files changed, 21 insertions, 20 deletions
diff --git a/scripts/netobj.py b/scripts/netobj.py index bd090b67..6d9a1412 100644 --- a/scripts/netobj.py +++ b/scripts/netobj.py @@ -16,6 +16,8 @@ class variable: return [] def emit_unpack(self): return ["msg.%s = msg_unpack_int();" % self.name] + def emit_unpack_check(self): + return [] def emit_pack(self): return ["\t\tmsg_pack_int(%s);" % self.name] @@ -28,14 +30,10 @@ class var_range(variable): variable.__init__(self, args, name) self.min = args[0] self.max = args[1] + def emit_unpack_check(self): + return ["if(msg.%s < %s || msg.%s > %s) { msg_failed_on = \"%s\"; return 0; }" % (self.name, self.min, self.name, self.max, self.name)] def emit_secure(self): return [self.linedef(), "obj->%s = netobj_clamp_int(obj->%s, %s, %s);" % (self.name, self.name, self.min, self.max)] - -class var_clientid(variable): - def __init__(self, args, name): - variable.__init__(self, args, name) - def emit_secure(self): - return [self.linedef(), "obj->%s = netobj_clamp_int(obj->%s, -1, MAX_CLIENTS);" % (self.name, self.name)] class var_string(variable): def __init__(self, args, name): @@ -168,6 +166,8 @@ class message: lines = [] for m in self.members: lines += m.emit_unpack() + for m in self.members: + lines += m.emit_unpack_check() return lines def emit_pack(self): @@ -282,6 +282,7 @@ def emit_header_file(f, p): print >>f, "" print >>f, "void *netmsg_secure_unpack(int type);" print >>f, "const char *netmsg_get_name(int type);" + print >>f, "const char *netmsg_failed_on();" print >>f, "" for obj in p.objects: @@ -300,9 +301,10 @@ def emit_source_file(f, p, protofilename): for l in p.source_raw: print >>f, l - print >>f, "" + print >>f, "const char *msg_failed_on = \"\";" print >>f, "static int num_corrections = 0;" print >>f, "int netobj_num_corrections() { return num_corrections; }" + print >>f, "const char *netmsg_failed_on() { return msg_failed_on; }" print >>f, "" print >>f, "static int netobj_clamp_int(int v, int min, int max)" print >>f, "{" @@ -399,6 +401,7 @@ def emit_source_file(f, p, protofilename): print >>f, "void *netmsg_secure_unpack(int type)" print >>f, "{" print >>f, "\tvoid *msg;" + print >>f, "\tmsg_failed_on = \"\";" print >>f, "\tif(type < 0 || type >= NUM_NETMSGTYPES) return 0;" print >>f, "\tmsg = secure_unpack_funcs[type]();" print >>f, "\tif(msg_unpack_error()) return 0;" diff --git a/src/game/client/gc_hooks.cpp b/src/game/client/gc_hooks.cpp index 9c242ffc..0d2db63b 100644 --- a/src/game/client/gc_hooks.cpp +++ b/src/game/client/gc_hooks.cpp @@ -503,7 +503,7 @@ extern "C" void modc_message(int msgtype) void *rawmsg = netmsg_secure_unpack(msgtype); if(!rawmsg) { - dbg_msg("client", "dropped weird message '%s' (%d)", netmsg_get_name(msgtype), msgtype); + dbg_msg("client", "dropped weird message '%s' (%d), failed on '%s'", netmsg_get_name(msgtype), msgtype, netmsg_failed_on()); return; } diff --git a/src/game/g_protocol.def b/src/game/g_protocol.def index 6e0a4806..4a7b79bc 100644 --- a/src/game/g_protocol.def +++ b/src/game/g_protocol.def @@ -85,7 +85,7 @@ end object flag any x, y range(0, 1) team - clientid carried_by + range(-1,MAX_CLIENTS-1) carried_by end object game @@ -113,7 +113,7 @@ object player_core any angle range(0, 3) jumped - clientid hooked_player + range(-1,MAX_CLIENTS-1) hooked_player range(0, 3) hook_state range(0, max_int) hook_tick @@ -143,7 +143,7 @@ end // information about the player that is always needed object player_info range(0, 1) local - clientid cid + range(0,MAX_CLIENTS-1) cid range(-1, 1) team any score @@ -166,7 +166,7 @@ end event death any x, y - clientid cid + range(0,MAX_CLIENTS-1) cid end event air_jump @@ -199,12 +199,12 @@ end message sv_chat range(0, 1) team - clientid cid + range(-1,MAX_CLIENTS-1) cid string message end message sv_setinfo - clientid cid + range(0,MAX_CLIENTS-1) cid string name string skin range(0,1) use_custom_color @@ -213,8 +213,8 @@ message sv_setinfo end message sv_killmsg - clientid killer - clientid victim + range(-1,MAX_CLIENTS-1) killer + range(-1,MAX_CLIENTS-1) victim range(-1,NUM_WEAPONS-1) weapon any mode_special end @@ -231,7 +231,6 @@ message sv_sound_global end message cl_startinfo - clientid who string name string skin range(0,1) use_custom_color @@ -240,7 +239,6 @@ message cl_startinfo end message cl_changeinfo - clientid who string name string skin range(0,1) use_custom_color @@ -253,7 +251,7 @@ message sv_weapon_pickup end message sv_emoticon - clientid cid + range(0,MAX_CLIENTS-1) cid range(0,NUM_EMOTICONS-1) emoticon end diff --git a/src/game/server/gs_server.cpp b/src/game/server/gs_server.cpp index 356a2fba..21b2f61f 100644 --- a/src/game/server/gs_server.cpp +++ b/src/game/server/gs_server.cpp @@ -2186,7 +2186,7 @@ void mods_message(int msgtype, int client_id) void *rawmsg = netmsg_secure_unpack(msgtype); if(!rawmsg) { - dbg_msg("server", "dropped weird message '%s' (%d)", netmsg_get_name(msgtype), msgtype); + dbg_msg("server", "dropped weird message '%s' (%d), failed on '%s'", netmsg_get_name(msgtype), msgtype, netmsg_failed_on()); return; } |