--- client/cl_parse.c.orig	2002-10-10 09:40:17 UTC
+++ client/cl_parse.c
@@ -474,6 +474,9 @@ void CL_LoadClientinfo (clientinfo_t *ci, char *s)
 	strncpy(ci->cinfo, s, sizeof(ci->cinfo));
 	ci->cinfo[sizeof(ci->cinfo)-1] = 0;
 
+	// sku - avoid potential buffer overflow vulnerability
+	s = ci->cinfo;
+
 	// isolate the player's name
 	strncpy(ci->name, s, sizeof(ci->name));
 	ci->name[sizeof(ci->name)-1] = 0;
@@ -602,6 +605,7 @@ void CL_ParseConfigString (void)
 	int		i;
 	char	*s;
 	char	olds[MAX_QPATH];
+	int		length;
 
 	i = MSG_ReadShort (&net_message);
 	if (i < 0 || i >= MAX_CONFIGSTRINGS)
@@ -610,6 +614,12 @@ void CL_ParseConfigString (void)
 
 	strncpy (olds, cl.configstrings[i], sizeof(olds));
 	olds[sizeof(olds) - 1] = 0;
+
+	// sku - avoid potential buffer overflow vulnerability
+	length = strlen (s);
+	if (length > sizeof cl.configstrings - sizeof cl.configstrings[0] * i - 1) {
+		Com_Error (ERR_DROP, "CL_ParseConfigString: oversize configstring");
+	}
 
 	strcpy (cl.configstrings[i], s);
 
--- qcommon/cmd.c.orig	2002-12-12 08:44:37 UTC
+++ qcommon/cmd.c
@@ -217,6 +217,10 @@ void Cbuf_Execute (void)
 		}
 			
 				
+		// sku - remove potential buffer overflow vulnerability
+		if (i > sizeof line - 1) {
+			i = sizeof line - 1;
+		}
 		memcpy (line, text, i);
 		line[i] = 0;
 		
@@ -679,7 +683,8 @@ void Cmd_TokenizeString (char *text, qboolean macroExp
 		{
 			int		l;
 
-			strcpy (cmd_args, text);
+			// sku - remove potential buffer overflow vulnerability
+			strncpy (cmd_args, text, sizeof cmd_args);
 
 			// strip off any trailing whitespace
 			l = strlen(cmd_args) - 1;
--- qcommon/common.c.orig	2002-12-13 11:33:44 UTC
+++ qcommon/common.c
@@ -776,7 +776,9 @@ char *MSG_ReadString (sizebuf_t *msg_read)
 	l = 0;
 	do
 	{
-		c = MSG_ReadChar (msg_read);
+		// sku - replaced MSG_ReadChar with MSG_ReadByte to avoid
+		// potential vulnerability
+		c = MSG_ReadByte (msg_read);
 		if (c == -1 || c == 0)
 			break;
 		string[l] = c;
@@ -796,7 +798,9 @@ char *MSG_ReadStringLine (sizebuf_t *msg_read)
 	l = 0;
 	do
 	{
-		c = MSG_ReadChar (msg_read);
+		// sku - replaced MSG_ReadChar with MSG_ReadByte to avoid
+		// potential vulnerability
+		c = MSG_ReadByte (msg_read);
 		if (c == -1 || c == 0 || c == '\n')
 			break;
 		string[l] = c;
--- server/sv_main.c.orig	2003-05-07 07:19:06 UTC
+++ server/sv_main.c
@@ -314,8 +314,9 @@ void SVC_DirectConnect (void)
 
 	challenge = atoi(Cmd_Argv(3));
 
-	strncpy (userinfo, Cmd_Argv(4), sizeof(userinfo)-1);
-	userinfo[sizeof(userinfo) - 1] = 0;
+	// sku - reserve 32 bytes for the IP address
+	strncpy (userinfo, Cmd_Argv(4), sizeof userinfo - 32);
+	userinfo[sizeof userinfo - 32] = 0;
 
 	// force the IP key/value pair so the game can filter based on ip
 	Info_SetValueForKey (userinfo, "ip", NET_AdrToString(net_from));
@@ -363,6 +364,11 @@ void SVC_DirectConnect (void)
 			&& ( cl->netchan.qport == qport 
 			|| adr.port == cl->netchan.remote_address.port ) )
 		{
+			// sku - avoid reusing slot of the client already connected
+			if (cl->state != cs_zombie) {
+				Netchan_OutOfBandPrint (NS_SERVER, adr, "print\nConnected client from this IP is already present.\n");
+				return;
+			}
 			if (!NET_IsLocalAddress (adr) && (svs.realtime - cl->lastconnect) < ((int)sv_reconnect_limit->value * 1000))
 			{
 				Com_DPrintf ("%s:reconnect rejected : too soon\n", NET_AdrToString (adr));
--- server/sv_user.c.orig	2002-04-13 09:00:30 UTC
+++ server/sv_user.c
@@ -142,6 +142,9 @@ void SV_Configstrings_f (void)
 	}
 	
 	start = atoi(Cmd_Argv(2));
+	if (start < 0) {
+		start = 0;	// sku - catch negative offsets
+	}
 
 	// write a packet full of data
 
@@ -150,9 +153,18 @@ void SV_Configstrings_f (void)
 	{
 		if (sv.configstrings[start][0])
 		{
+			int length;
+
+			// sku - write configstrings that exceed MAX_QPATH in proper-sized chunks
+			length = strlen (sv.configstrings[start]);
+			if (length > MAX_QPATH) {
+				length = MAX_QPATH;
+			}
+
 			MSG_WriteByte (&sv_client->netchan.message, svc_configstring);
 			MSG_WriteShort (&sv_client->netchan.message, start);
-			MSG_WriteString (&sv_client->netchan.message, sv.configstrings[start]);
+			SZ_Write (&sv_client->netchan.message, sv.configstrings[start], length);
+			MSG_WriteByte (&sv_client->netchan.message, 0);
 		}
 		start++;
 	}
@@ -199,6 +211,9 @@ void SV_Baselines_f (void)
 	}
 	
 	start = atoi(Cmd_Argv(2));
+	if (start < 0) {
+		start = 0;
+	}
 
 	memset (&nullstate, 0, sizeof(nullstate));
 
@@ -398,7 +413,7 @@ Dumps the serverinfo info string
 */
 void SV_ShowServerinfo_f (void)
 {
-	Info_Print (Cvar_Serverinfo());
+//	Info_Print (Cvar_Serverinfo());
 }
 
 
