diff --git a/src/hu_stuff.c b/src/hu_stuff.c
index 4c07e07d9804faac9da768587291efd303d75b03..edbb2d8ec4bcea964905a02387a06a996c7cc438 100644
--- a/src/hu_stuff.c
+++ b/src/hu_stuff.c
@@ -634,8 +634,7 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
 	SINT8 target;
 	UINT8 flags;
 	const char *dispname;
-	char msgbuf[HU_MAXMSGLEN + 1];
-	char *msg = msgbuf;
+	char *msg;
 	boolean action = false;
 	char *ptr;
 	INT32 spam_eatmsg = 0;
@@ -644,7 +643,8 @@ static void Got_Saycmd(UINT8 **p, INT32 playernum)
 
 	target = READSINT8(*p);
 	flags = READUINT8(*p);
-	READSTRINGN(*p, msgbuf, HU_MAXMSGLEN);
+	msg = (char *)*p;
+	SKIPSTRINGN(*p, HU_MAXMSGLEN);
 
 	if ((cv_mute.value || flags & (HU_CSAY|HU_SERVER_SAY)) && playernum != serverplayer && !(IsPlayerAdmin(playernum)))
 	{
@@ -913,11 +913,7 @@ static void HU_sendChatMessage(void)
 		if (c >= ' ' && !(c & 0x80))
 			buf[ci] = c;
 	};
-	if (ci-2 < HU_MAXMSGLEN)
-	{
-		buf[ci] = '\0';
-		ci++;
-	}
+	buf[ci] = '\0';
 
 	memset(w_chat, '\0', sizeof(w_chat));
 	c_input = 0;
@@ -985,7 +981,7 @@ static void HU_sendChatMessage(void)
 	{
 		buf[0] = teamtalk ? -1 : target; // target
 		buf[1] = 0; // flags
-		SendNetXCmd(XD_SAY, buf, ci);
+		SendNetXCmd(XD_SAY, buf, 2 + strlen(&buf[2]) + 1);
 	}
 }