about summary refs log tree commit diff
path: root/src/engine/e_msg.c
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-02-11 22:25:10 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-02-11 22:25:10 +0000
commit1ea859c431b33a384727c0016917dde15bceeff3 (patch)
treea2e8a040abaa6334e6e5c0442a75b5777355000d /src/engine/e_msg.c
parent79dfdb3cd71a44ec3cd8e1dab15263837381cbbf (diff)
downloadzcatch-1ea859c431b33a384727c0016917dde15bceeff3.tar.gz
zcatch-1ea859c431b33a384727c0016917dde15bceeff3.zip
security audit: fixed so the packer functions checks for errors
Diffstat (limited to 'src/engine/e_msg.c')
-rw-r--r--src/engine/e_msg.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/engine/e_msg.c b/src/engine/e_msg.c
index 0bdaf856..f9efc2bf 100644
--- a/src/engine/e_msg.c
+++ b/src/engine/e_msg.c
@@ -5,6 +5,7 @@
 /* message packing */
 static PACKER msg_packer;
 static MSG_INFO pack_info;
+static int packer_failed = 0;
 
 void msg_pack_int(int i) { packer_add_int(&msg_packer, i); }
 void msg_pack_string(const char *p, int limit) { packer_add_string(&msg_packer, p, limit); }
@@ -15,6 +16,7 @@ void msg_pack_start_system(int msg, int flags)
 	packer_reset(&msg_packer);
 	pack_info.msg = (msg<<1)|1;
 	pack_info.flags = flags;
+	packer_failed = 0;
 	
 	msg_pack_int(pack_info.msg);
 }
@@ -24,18 +26,30 @@ void msg_pack_start(int msg, int flags)
 	packer_reset(&msg_packer);
 	pack_info.msg = msg<<1;
 	pack_info.flags = flags;
+	packer_failed = 0;
 	
 	msg_pack_int(pack_info.msg);
 }
 
 void msg_pack_end()
 {
-	pack_info.size = packer_size(&msg_packer);
-	pack_info.data = packer_data(&msg_packer);
+	if(msg_packer.error)
+	{
+		packer_failed = 1;
+		pack_info.size = 0;
+		pack_info.data = (unsigned char *)"";
+	}
+	else
+	{
+		pack_info.size = packer_size(&msg_packer);
+		pack_info.data = packer_data(&msg_packer);
+	}
 }
 
 const MSG_INFO *msg_get_info()
 {
+	if(packer_failed)
+		return 0;
 	return &pack_info;
 }
 
@@ -53,3 +67,4 @@ int msg_unpack_start(const void *data, int data_size, int *system)
 int msg_unpack_int() { return unpacker_get_int(&msg_unpacker); }
 const char *msg_unpack_string() { return unpacker_get_string(&msg_unpacker); }
 const unsigned char *msg_unpack_raw(int size)  { return unpacker_get_raw(&msg_unpacker, size); }
+int msg_unpack_error() { return msg_unpacker.error; }