about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/ec_client.c30
-rw-r--r--src/engine/client/ec_font.c6
-rw-r--r--src/engine/client/ec_inp.c2
-rw-r--r--src/engine/client/ec_srvbrowse.c4
-rw-r--r--src/engine/e_config.c10
-rw-r--r--src/engine/e_config.h2
-rw-r--r--src/engine/e_console.c8
-rw-r--r--src/engine/e_engine.c12
-rw-r--r--src/engine/e_if_msg.h2
-rw-r--r--src/engine/e_map.c2
-rw-r--r--src/engine/e_network.c4
-rw-r--r--src/engine/e_system.c62
-rw-r--r--src/engine/e_system.h7
-rw-r--r--src/engine/server/es_server.c30
14 files changed, 111 insertions, 70 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c
index f93cb5e5..4d83354b 100644
--- a/src/engine/client/ec_client.c
+++ b/src/engine/client/ec_client.c
@@ -430,7 +430,7 @@ void client_connect(const char *server_address_str)
 
 	dbg_msg("client", "connecting to '%s'", server_address_str);
 
-	strncpy(buf, server_address_str, 512);
+	str_copy(buf, server_address_str, sizeof(buf));
 
 	for(k = 0; buf[k]; k++)
 	{
@@ -500,7 +500,7 @@ static void client_debug_render()
 	}
 	
 	frametime_avg = frametime_avg*0.9f + frametime*0.1f;
-	sprintf(buffer, "ticks: %8d %8d send: %6d recv: %6d snaploss: %d  mem %dk   gfxmem: %dk  fps: %3d",
+	str_format(buffer, sizeof(buffer), "ticks: %8d %8d send: %6d recv: %6d snaploss: %d  mem %dk   gfxmem: %dk  fps: %3d",
 		current_tick, current_predtick,
 		(current.send_bytes-prev.send_bytes)*10,
 		(current.recv_bytes-prev.recv_bytes)*10,
@@ -517,7 +517,7 @@ static void client_debug_render()
 		{
 			if(snapshot_data_rate[i])
 			{
-				sprintf(buffer, "%4d : %8d %8d %8d", i, snapshot_data_rate[i]/8, snapshot_data_updates[i],
+				str_format(buffer, sizeof(buffer), "%4d : %8d %8d %8d", i, snapshot_data_rate[i]/8, snapshot_data_updates[i],
 					(snapshot_data_rate[i]/snapshot_data_updates[i])/8);
 				gfx_quads_text(2, 100+i*8, 16, buffer);
 			}
@@ -564,7 +564,7 @@ static const char *client_load_map(const char *filename, int wanted_crc)
 	df = datafile_load(filename);
 	if(!df)
 	{
-		sprintf(errormsg, "map '%s' not found", filename);
+		str_format(errormsg, sizeof(errormsg), "map '%s' not found", filename);
 		return errormsg;
 	}
 	
@@ -573,7 +573,7 @@ static const char *client_load_map(const char *filename, int wanted_crc)
 	if(crc != wanted_crc)
 	{
 		datafile_unload(df);
-		sprintf(errormsg, "map differs from the server. %08x != %08x", crc, wanted_crc);
+		str_format(errormsg, sizeof(errormsg), "map differs from the server. %08x != %08x", crc, wanted_crc);
 		return errormsg;
 	}
 	
@@ -592,13 +592,13 @@ static const char *client_load_map_search(const char *mapname, int wanted_crc)
 	client_set_state(CLIENTSTATE_LOADING);
 	
 	/* try the normal maps folder */
-	sprintf(buf, "data/maps/%s.map", mapname);
+	str_format(buf, sizeof(buf), "data/maps/%s.map", mapname);
 	error = client_load_map(buf, wanted_crc);
 	if(!error)
 		return error;
 
 	/* try the downloaded maps */
-	sprintf(buf2, "%s_%8x.map", mapname, wanted_crc);
+	str_format(buf2, sizeof(buf2), "%s_%8x.map", mapname, wanted_crc);
 	engine_savepath(buf2, buf, sizeof(buf));
 	error = client_load_map(buf, wanted_crc);
 	return error;
@@ -628,10 +628,10 @@ static void client_process_packet(NETPACKET *packet)
 #endif
 
 				info.latency = 999;
-				sprintf(info.address, "%d.%d.%d.%d:%d",
+				str_format(info.address, sizeof(info.address), "%d.%d.%d.%d:%d",
 					addr.ip[0], addr.ip[1], addr.ip[2],
 					addr.ip[3], addr.port);
-				sprintf(info.name, "\255%d.%d.%d.%d:%d", /* the \255 is to make sure that it's sorted last */
+				str_format(info.name, sizeof(info.name), "\255%d.%d.%d.%d:%d", /* the \255 is to make sure that it's sorted last */
 					addr.ip[0], addr.ip[1], addr.ip[2],
 					addr.ip[3], addr.port);
 				
@@ -668,21 +668,21 @@ static void client_process_packet(NETPACKET *packet)
 
 				unpacker_reset(&up, (unsigned char*)packet->data+sizeof(SERVERBROWSE_INFO), packet->data_size-sizeof(SERVERBROWSE_INFO));
 
-				strncpy(info.version, unpacker_get_string(&up), 32);
-				strncpy(info.name, unpacker_get_string(&up), 64);
-				strncpy(info.map, unpacker_get_string(&up), 32);
+				str_copy(info.version, unpacker_get_string(&up), sizeof(info.version));
+				str_copy(info.name, unpacker_get_string(&up), sizeof(info.name));
+				str_copy(info.map, unpacker_get_string(&up), sizeof(info.map));
 				info.game_type = atol(unpacker_get_string(&up));
 				info.flags = atol(unpacker_get_string(&up));
 				info.progression = atol(unpacker_get_string(&up));
 				info.num_players = atol(unpacker_get_string(&up));
 				info.max_players = atol(unpacker_get_string(&up));
-				sprintf(info.address, "%d.%d.%d.%d:%d",
+				str_format(info.address, sizeof(info.address), "%d.%d.%d.%d:%d",
 					packet->address.ip[0], packet->address.ip[1], packet->address.ip[2],
 					packet->address.ip[3], packet->address.port);
 				
 				for(i = 0; i < info.num_players; i++)
 				{
-					strncpy(info.player_names[i], unpacker_get_string(&up), 48);
+					str_copy(info.player_names[i], unpacker_get_string(&up), sizeof(info.player_names[i]));
 					info.player_scores[i] = atol(unpacker_get_string(&up));
 				}
 				
@@ -727,7 +727,7 @@ static void client_process_packet(NETPACKET *packet)
 					else
 					{
 						char buf[512];
-						sprintf(buf, "%s_%8x.map", map, map_crc);
+						str_format(buf, sizeof(buf), "%s_%8x.map", map, map_crc);
 						engine_savepath(buf, mapdownload_filename, sizeof(mapdownload_filename));
 
 						dbg_msg("client/network", "starting to download map to '%s'", mapdownload_filename);
diff --git a/src/engine/client/ec_font.c b/src/engine/client/ec_font.c
index 04f8b954..707c481f 100644
--- a/src/engine/client/ec_font.c
+++ b/src/engine/client/ec_font.c
@@ -107,9 +107,9 @@ int font_set_load(FONT_SET *font_set, const char *font_filename, const char *tex
         FONT *font = &font_set->fonts[i];
 
         size = va_arg(va, int);
-        sprintf(composed_font_filename, font_filename, size);
-        sprintf(composed_text_texture_filename, text_texture_filename, size);
-        sprintf(composed_outline_texture_filename, outline_texture_filename, size);
+        str_format(composed_font_filename, sizeof(composed_font_filename), font_filename, size);
+        str_format(composed_text_texture_filename, sizeof(composed_text_texture_filename), text_texture_filename, size);
+        str_format(composed_outline_texture_filename, sizeof(composed_outline_texture_filename), outline_texture_filename, size);
 
         if (font_load(font, composed_font_filename))
         {
diff --git a/src/engine/client/ec_inp.c b/src/engine/client/ec_inp.c
index 41689d8a..3e0bfef7 100644
--- a/src/engine/client/ec_inp.c
+++ b/src/engine/client/ec_inp.c
@@ -209,7 +209,7 @@ void inp_update()
     
 	/* clear and begin count on the other one */
 	mem_zero(&input_count[input_current], sizeof(input_count[input_current]));
-	memcpy(input_state[input_current], input_state[input_current^1], sizeof(input_state[input_current]));
+	mem_copy(input_state[input_current], input_state[input_current^1], sizeof(input_state[input_current]));
 	input_current^=1;
 
     if(keyboard_first)
diff --git a/src/engine/client/ec_srvbrowse.c b/src/engine/client/ec_srvbrowse.c
index 0a6ebbf8..e7d42cc1 100644
--- a/src/engine/client/ec_srvbrowse.c
+++ b/src/engine/client/ec_srvbrowse.c
@@ -214,7 +214,7 @@ static void client_serverbrowse_sort()
 	for(i = 0; i < num_sorted_servers; i++)
 		serverlist[sorted_serverlist[i]]->info.sorted_index = i;
 	
-	strncpy(filterstring, config.b_filter_string, sizeof(filterstring)-1); 
+	str_copy(filterstring, config.b_filter_string, sizeof(filterstring)); 
 	sorthash = client_serverbrowse_sorthash();
 }
 
@@ -278,7 +278,7 @@ void client_serverbrowse_set(NETADDR4 *addr, int request, SERVER_INFO *info)
 		SERVERENTRY **newlist;
 		num_server_capacity += 100;
 		newlist = mem_alloc(num_server_capacity*sizeof(SERVERENTRY*), 1);
-		memcpy(newlist, serverlist, num_servers*sizeof(SERVERENTRY*));
+		mem_copy(newlist, serverlist, num_servers*sizeof(SERVERENTRY*));
 		mem_free(serverlist);
 		serverlist = newlist;
 	}
diff --git a/src/engine/e_config.c b/src/engine/e_config.c
index ddb6c742..e71d2ad3 100644
--- a/src/engine/e_config.c
+++ b/src/engine/e_config.c
@@ -13,7 +13,7 @@ CONFIGURATION config;
 void config_reset()
 {
     #define MACRO_CONFIG_INT(name,def,min,max) config.name = def;
-    #define MACRO_CONFIG_STR(name,len,def) strncpy(config.name, def, len);
+    #define MACRO_CONFIG_STR(name,len,def) str_copy(config.name, def, len);
  
     #include "e_config_variables.h" 
  
@@ -44,12 +44,10 @@ void config_set(const char *line)
 		char *var_str = var;
 		char *val_str = val;
 
-		strcpy(val, c+1);
-
+		str_copy(val, c+1, sizeof(val));
 		mem_copy(var, line, c - line);
 		var[c - line] = 0;
 
-
 		strip_spaces(&var_str);
 		strip_spaces(&val_str);
 
@@ -98,7 +96,7 @@ void config_save(const char *filename)
 #endif
 		const int newline_len = sizeof(newline)-1;
 		
-    	#define MACRO_CONFIG_INT(name,def,min,max) { char str[256]; sprintf(str, "%s=%i%s", #name, config.name, newline); io_write(file, str, strlen(str)); }
+    	#define MACRO_CONFIG_INT(name,def,min,max) { char str[256]; str_format(str, sizeof(str), "%s=%i%s", #name, config.name, newline); io_write(file, str, strlen(str)); }
     	#define MACRO_CONFIG_STR(name,len,def) { io_write(file, #name, strlen(#name)); io_write(file, "=", 1); io_write(file, config.name, strlen(config.name)); io_write(file, newline, newline_len); }
  
     	#include "e_config_variables.h" 
@@ -119,7 +117,7 @@ void config_save(const char *filename)
 #undef MACRO_CONFIG_STR
 
 #define MACRO_CONFIG_INT(name,def,min,max) void config_set_ ## name (CONFIGURATION *c, int val) { if(min != max) { if (val < min) val = min; if (max != 0 && val > max) val = max; } c->name = val; }
-#define MACRO_CONFIG_STR(name,len,def) void config_set_ ## name (CONFIGURATION *c, const char *str) { strncpy(c->name, str, len-1); c->name[sizeof(c->name)-1] = 0; }
+#define MACRO_CONFIG_STR(name,len,def) void config_set_ ## name (CONFIGURATION *c, const char *str) { str_copy(c->name, str, len-1); c->name[sizeof(c->name)-1] = 0; }
 #include "e_config_variables.h"
 #undef MACRO_CONFIG_INT
 #undef MACRO_CONFIG_STR
diff --git a/src/engine/e_config.h b/src/engine/e_config.h
index f1145f6a..78ffdd02 100644
--- a/src/engine/e_config.h
+++ b/src/engine/e_config.h
@@ -9,7 +9,7 @@ extern "C"{
 typedef struct
 { 
     #define MACRO_CONFIG_INT(name,def,min,max) int name;
-    #define MACRO_CONFIG_STR(name,len,def) char name[len];
+    #define MACRO_CONFIG_STR(name,len,def) char name[len]; /* Flawfinder: ignore */
     #include "e_config_variables.h" 
     #undef MACRO_CONFIG_INT 
     #undef MACRO_CONFIG_STR 
diff --git a/src/engine/e_console.c b/src/engine/e_console.c
index 2c6a6bc8..db0398b4 100644
--- a/src/engine/e_console.c
+++ b/src/engine/e_console.c
@@ -359,7 +359,7 @@ void console_execute(const char *str)
 			if (console_validate(command, &result))
 			{
 				char buf[256];
-				sprintf(buf, "Invalid arguments... Usage: %s %s", command->name, command->params);
+				str_format(buf, sizeof(buf), "Invalid arguments... Usage: %s %s", command->name, command->params);
 				console_print(buf);
 			}
 			else
@@ -368,7 +368,7 @@ void console_execute(const char *str)
 		else
 		{
 			char buf[256];
-			sprintf(buf, "No such command: %s.", name);
+			str_format(buf, sizeof(buf), "No such command: %s.", name);
 			console_print(buf);
 		}
 	}
@@ -402,7 +402,7 @@ static void int_variable_command(void *result, void *user_data)
 	if (console_result_int(result, 1, &new_val))
 	{
 		char buf[256];
-		sprintf(buf, "Value: %d", data->getter(&config));
+		str_format(buf, sizeof(buf), "Value: %d", data->getter(&config));
 		console_print(buf);
 	}
 	else
@@ -419,7 +419,7 @@ static void str_variable_command(void *result, void *user_data)
 	if (console_result_string(result, 1, &new_val))
 	{
 		char buf[256];
-		sprintf(buf, "Value: %s", data->getter(&config));
+		str_format(buf, sizeof(buf), "Value: %s", data->getter(&config));
 		console_print(buf);
 	}
 	else
diff --git a/src/engine/e_engine.c b/src/engine/e_engine.c
index b85f1eb3..c5cb3616 100644
--- a/src/engine/e_engine.c
+++ b/src/engine/e_engine.c
@@ -20,7 +20,7 @@ static char application_save_path[512] = {0};
 
 const char *engine_savepath(const char *filename, char *buffer, int max)
 {
-	sprintf(buffer, "%s/%s", application_save_path, filename);
+	str_format(buffer, max, "%s/%s", application_save_path, filename);
 	return buffer;
 }
 
@@ -45,12 +45,10 @@ void engine_init(const char *appname)
 		fs_storage_path(appname, application_save_path, sizeof(application_save_path));
 		if(fs_makedir(application_save_path) == 0)
 		{		
-			strcpy(path, application_save_path);
-			strcat(path, "/screenshots");
+			str_format(path, sizeof(path), "%s/screenshots", application_save_path);
 			fs_makedir(path);
 
-			strcpy(path, application_save_path);
-			strcat(path, "/maps");
+			str_format(path, sizeof(path), "%s/maps", application_save_path);
 			fs_makedir(path);
 		}
 	}
@@ -165,7 +163,7 @@ static void perf_dump_imp(PERFORMACE_INFO *info, int indent)
 	for(i = 0; i < indent; i++)
 		buf[i] = ' ';
 	
-	sprintf(&buf[indent], "%-20s %8.2f %8.2f", info->name, info->total*1000/(float)freq, info->biggest*1000/(float)freq);
+	str_format(&buf[indent], sizeof(buf)-indent, "%-20s %8.2f %8.2f", info->name, info->total*1000/(float)freq, info->biggest*1000/(float)freq);
 	dbg_msg("perf", "%s", buf);
 	
 	info = info->first_child;
@@ -374,7 +372,7 @@ int mastersrv_save()
 	for(i = 0; i < MAX_MASTERSERVERS; i++)
 	{
 		char buf[1024];
-		sprintf(buf, "%s %d.%d.%d.%d\n", master_servers[i].hostname,
+		str_format(buf, sizeof(buf), "%s %d.%d.%d.%d\n", master_servers[i].hostname,
 			master_servers[i].addr.ip[0], master_servers[i].addr.ip[1],
 			master_servers[i].addr.ip[2], master_servers[i].addr.ip[3]);
 			
diff --git a/src/engine/e_if_msg.h b/src/engine/e_if_msg.h
index 7355f8ce..11360b43 100644
--- a/src/engine/e_if_msg.h
+++ b/src/engine/e_if_msg.h
@@ -89,7 +89,7 @@ typedef struct
 const MSG_INFO *msg_get_info();
 
 /* message unpacking */
-int msg_unpack_start(const void *data, int data_size, int *system);
+int msg_unpack_start(const void *data, int data_size, int *is_system);
 
 /*
 	Function: msg_unpack_int
diff --git a/src/engine/e_map.c b/src/engine/e_map.c
index 9f7a910e..c689be45 100644
--- a/src/engine/e_map.c
+++ b/src/engine/e_map.c
@@ -53,7 +53,7 @@ int map_is_loaded()
 int map_load(const char *mapname)
 {
 	char buf[512];
-	sprintf(buf, "data/maps/%s.map", mapname);
+	str_format(buf, sizeof(buf), "data/maps/%s.map", mapname);
 	map = datafile_load(buf);
 	return map != 0;
 }
diff --git a/src/engine/e_network.c b/src/engine/e_network.c
index 3e242618..acf723ba 100644
--- a/src/engine/e_network.c
+++ b/src/engine/e_network.c
@@ -221,7 +221,7 @@ static const char *conn_error(NETCONNECTION *conn)
 
 static void conn_set_error(NETCONNECTION *conn, const char *str)
 {
-	strcpy(conn->error_string, str);
+	str_copy(conn->error_string, str, sizeof(conn->error_string));
 }
 
 /*
@@ -337,7 +337,7 @@ static void conn_disconnect(NETCONNECTION *conn, const char *reason)
 
 		conn->error_string[0] = 0;
 		if(reason)
-			strcpy(conn->error_string, reason);
+			str_copy(conn->error_string, reason, sizeof(conn->error_string));
 	}
 	
 	conn_reset(conn);
diff --git a/src/engine/e_system.c b/src/engine/e_system.c
index 9a8b2a94..d2fb4eeb 100644
--- a/src/engine/e_system.c
+++ b/src/engine/e_system.c
@@ -77,7 +77,7 @@ void dbg_msg(const char *sys, const char *fmt, ...)
 #if defined(CONF_FAMILY_WINDOWS)
 	char str[1024];
 	va_start(args, fmt);
-	vsprintf(str, fmt, args);
+	_vnsprintf(str, sizeof(str), fmt, args);
 	va_end(args);
 	OutputDebugString(str);
 	OutputDebugString("\n");
@@ -92,11 +92,17 @@ void dbg_msg(const char *sys, const char *fmt, ...)
 
 	{
 		char str[2048];
+		int len;
 
-		sprintf(str, "[%s]: ", sys);
+		str_format(str, sizeof(str), "[%s]: ", sys);
 
 		va_start(args, fmt);
-		vsprintf(str+strlen(str), fmt, args);
+		len = strlen(str);
+#if defined(CONF_FAMILY_WINDOWS)
+		_vsnprintf(str+len, sizeof(str)-len, fmt, args);
+#else
+		vsnprintf(str+len, sizeof(str)-len, fmt, args);
+#endif
 		va_end(args);
 
 		console_print(str);
@@ -180,7 +186,7 @@ void mem_debug_dump()
 	
 	while(header)
 	{
-		sprintf(buf, "%s(%d): %d\n", header->filename, header->line, header->size);
+		str_format(buf, sizeof(buf), "%s(%d): %d\n", header->filename, header->line, header->size);
 		io_write(f, buf, strlen(buf));
 		header = header->next;
 	}
@@ -675,8 +681,7 @@ int fs_listdir(const char *dir, fs_listdir_callback cb, void *user)
 	WIN32_FIND_DATA finddata;
 	HANDLE handle;
 	char buffer[1024*2];
-	strcpy(buffer, dir);
-	strcat(buffer, "/*");
+	str_format(buffer, sizeof(buffer), "%s/*", dir);
 
 	handle = FindFirstFileA(buffer, &finddata);
 
@@ -777,10 +782,6 @@ void swap_endian(void *data, unsigned elem_size, unsigned num)
 
 int net_socket_read_wait(NETSOCKET sock, int time)
 {
-	/*
-#if defined(CONF_FAMILY_WINDOWS)
-	#error Not implemented
-#else*/
     struct timeval tv;
     fd_set readfds;
 
@@ -795,8 +796,6 @@ int net_socket_read_wait(NETSOCKET sock, int time)
     if(FD_ISSET(sock, &readfds))
     	return 1;
     return 0;
-    /*
-#endif*/
 }
 
 unsigned time_timestamp()
@@ -804,6 +803,45 @@ unsigned time_timestamp()
 	return time(0);
 }
 
+void str_append(char *dst, const char *src, int dst_size)
+{
+	int s = strlen(dst);
+	int i = 0;
+	while(s < dst_size)
+	{
+		dst[s] = src[i];
+		if(!src[i]) /* check for null termination */
+			break;
+		s++;
+		i++;
+	}
+	
+	dst[dst_size-1] = 0; /* assure null termination */
+}
+
+void str_copy(char *dst, const char *src, int dst_size)
+{
+	strncpy(dst, src, dst_size);
+	dst[dst_size-1] = 0; /* assure null termination */
+}
+
+void str_format(char *buffer, int buffer_size, const char *format, ...)
+{
+#if defined(CONF_FAMILY_WINDOWS)
+	va_list ap;
+	va_start(ap, format);
+	_vsnprintf(buffer, buffer_size, format, ap);
+    va_end(ap);
+#else
+	va_list ap;
+	va_start(ap, format);
+	vsnprintf(buffer, buffer_size, format, ap);
+    va_end(ap);
+#endif
+
+	buffer[buffer_size-1] = 0; /* assure null termination */
+}
+
 #if defined(__cplusplus)
 }
 #endif
diff --git a/src/engine/e_system.h b/src/engine/e_system.h
index bfd8cd8c..1fd929e8 100644
--- a/src/engine/e_system.h
+++ b/src/engine/e_system.h
@@ -520,6 +520,13 @@ void swap_endian(void *data, unsigned elem_size, unsigned num);
 
 /* #define cache_prefetch(addr) __builtin_prefetch(addr) */
 
+/*typedef unsigned char [256] pstr;
+void pstr_format(pstr *str, )*/
+
+void str_append(char *dst, const char *src, int dst_size);
+void str_copy(char *dst, const char *src, int dst_size);
+void str_format(char *buffer, int buffer_size, const char *format, ...);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c
index 415b67fe..7bfb7a20 100644
--- a/src/engine/server/es_server.c
+++ b/src/engine/server/es_server.c
@@ -205,7 +205,7 @@ void server_setclientname(int client_id, const char *name)
 {
 	if(client_id < 0 || client_id > MAX_CLIENTS || clients[client_id].state < SRVCLIENT_STATE_READY)
 		return;
-	strncpy(clients[client_id].name, name, MAX_NAME_LENGTH);
+	str_copy(clients[client_id].name, name, MAX_NAME_LENGTH);
 }
 
 void server_setclientscore(int client_id, int score)
@@ -548,18 +548,18 @@ static void server_process_client_packet(NETPACKET *packet)
 		{
 			char version[64];
 			const char *password;
-			strncpy(version, msg_unpack_string(), 64);
+			str_copy(version, msg_unpack_string(), 64);
 			if(strcmp(version, mods_net_version()) != 0)
 			{
 				/* OH FUCK! wrong version, drop him */
 				char reason[256];
-				sprintf(reason, "wrong version. server is running %s.", mods_net_version());
+				str_format(reason, sizeof(reason), "wrong version. server is running %s.", mods_net_version());
 				netserver_drop(net, cid, reason);
 				return;
 			}
 			
-			strncpy(clients[cid].name, msg_unpack_string(), MAX_NAME_LENGTH);
-			strncpy(clients[cid].clan, msg_unpack_string(), MAX_CLANNAME_LENGTH);
+			str_copy(clients[cid].name, msg_unpack_string(), MAX_NAME_LENGTH);
+			str_copy(clients[cid].clan, msg_unpack_string(), MAX_CLANNAME_LENGTH);
 			password = msg_unpack_string();
 			
 			if(config.password[0] != 0 && strcmp(config.password, password) != 0)
@@ -704,29 +704,29 @@ static void server_send_serverinfo(NETADDR4 *addr, int lan)
 	packer_add_string(&p, config.sv_map, 32);
 
 	/* gametype */
-	sprintf(buf, "%d", browseinfo_gametype);
+	str_format(buf, sizeof(buf), "%d", browseinfo_gametype);
 	packer_add_string(&p, buf, 2);
 
 	/* flags */
 	i = 0;
-	if(strlen(config.password))
+	if(config.password[0])
 		i |= 1;
-	sprintf(buf, "%d", i);
+	str_format(buf, sizeof(buf), "%d", i);
 	packer_add_string(&p, buf, 2);
 
 	/* progression */
-	sprintf(buf, "%d", browseinfo_progression);
+	str_format(buf, sizeof(buf), "%d", browseinfo_progression);
 	packer_add_string(&p, buf, 4);
 	
-	sprintf(buf, "%d", c); packer_add_string(&p, buf, 3);  /* num players */
-	sprintf(buf, "%d", netserver_max_clients(net)); packer_add_string(&p, buf, 3); /* max players */
+	str_format(buf, sizeof(buf), "%d", c); packer_add_string(&p, buf, 3);  /* num players */
+	str_format(buf, sizeof(buf), "%d", netserver_max_clients(net)); packer_add_string(&p, buf, 3); /* max players */
 
 	for(i = 0; i < MAX_CLIENTS; i++)
 	{
 		if(clients[i].state != SRVCLIENT_STATE_EMPTY)
 		{
 			packer_add_string(&p, clients[i].name, 48);  /* player name */
-			sprintf(buf, "%d", clients[i].score); packer_add_string(&p, buf, 6);  /* player score */
+			str_format(buf, sizeof(buf), "%d", clients[i].score); packer_add_string(&p, buf, 6);  /* player score */
 		}
 	}
 	
@@ -798,7 +798,7 @@ static int server_load_map(const char *mapname)
 {
 	DATAFILE *df;
 	char buf[512];
-	sprintf(buf, "data/maps/%s.map", mapname);
+	str_format(buf, sizeof(buf), "data/maps/%s.map", mapname);
 	df = datafile_load(buf);
 	if(!df)
 		return 0;
@@ -810,7 +810,7 @@ static int server_load_map(const char *mapname)
 	current_map_crc = datafile_crc(buf);
 	dbg_msg("server", "%s crc is %08x", buf, current_map_crc);
 		
-	strcpy(current_map, mapname);
+	str_copy(current_map, mapname, sizeof(current_map));
 	map_set(df);
 	
 	/* load compelate map into memory for download */
@@ -842,7 +842,7 @@ static int server_run()
 	}
 	
 	/* start server */
-	if(strlen(config.sv_bindaddr) && net_host_lookup(config.sv_bindaddr, config.sv_port, &bindaddr) != 0)
+	if(config.sv_bindaddr[0] && net_host_lookup(config.sv_bindaddr, config.sv_port, &bindaddr) != 0)
 	{
 		/* sweet! */
 	}