diff -r 08b3b987bdc0 docs/zandronum-history.txt
--- a/docs/zandronum-history.txt	Sat Jan 31 19:31:50 2015 +0200
+++ b/docs/zandronum-history.txt	Sat Feb 07 18:49:09 2015 +0000
@@ -64,6 +64,7 @@
 -	- Fixed: Rotating polyobjects did not stop on map resets. [Dusk, Edward-san]
 -	- Fixed: Emulated multiplayer and multiplayer map changes broke random. [Torr Samaho, Edward-san]
 -	- Fixed: Since Skulltag 98a, chat and announcer stopped producing sounds in game during Time Freeze and in intermission after map exiting while Time Freeze was on. [Edward-san]
+-	- Fixed: On some systems, adding bans and ban exemptions from the server console didn't work. [Konar6]
 !	- Changed intermission proceeding to not rely on spectators if there is active players. [Water]
 !	- The login server selected with authhostname needs to support version 2 of the login protocol. [Torr Samaho]
 !	- Changed how a sentinel variable is handled which makes it much harder for clients to purposely drop packets, thus stopping a speed hack. [Water, Torr Samaho]
diff -r 08b3b987bdc0 src/networkshared.cpp
--- a/src/networkshared.cpp	Sat Jan 31 19:31:50 2015 +0200
+++ b/src/networkshared.cpp	Sat Feb 07 18:49:09 2015 +0000
@@ -918,15 +918,15 @@
 		// If this entry isn't infinite, and expires in the past (or now), remove it.
 		if (( _ipVector[ulIdx].tExpirationDate != 0 ) && ( _ipVector[ulIdx].tExpirationDate - tNow <= 0))
 		{
-			char		szMessage[256];
+			FString		Message;
 
-			sprintf( szMessage, "Temporary ban for %s.%s.%s.%s", _ipVector[ulIdx].szIP[0], _ipVector[ulIdx].szIP[1], _ipVector[ulIdx].szIP[2], _ipVector[ulIdx].szIP[3] );
+			Message.AppendFormat( "Temporary ban for %s.%s.%s.%s", _ipVector[ulIdx].szIP[0], _ipVector[ulIdx].szIP[1], _ipVector[ulIdx].szIP[2], _ipVector[ulIdx].szIP[3] );
 			
 			// Add the ban reason.
 			if ( strlen( _ipVector[ulIdx].szComment ) )
-				sprintf( szMessage, "%s (%s)", szMessage,  _ipVector[ulIdx].szComment );
+				Message.AppendFormat( " (%s)", _ipVector[ulIdx].szComment );
 
-			sprintf( szMessage, "%s has expired", szMessage );
+			Message.AppendFormat( " has expired" );
 
 			// If the entry expired while the server was offline, say when it expired.
 			if ( _ipVector[ulIdx].tExpirationDate - tNow <= -3 )
@@ -936,10 +936,10 @@
 
 				pTimeInfo = localtime( &_ipVector[ulIdx].tExpirationDate );
 				strftime( szDate, 32, "%m/%d/%Y %H:%M", pTimeInfo);
-				sprintf( szMessage, "%s (ended on %s)", szMessage, szDate );
+				Message.AppendFormat( " (ended on %s)", szDate );
 			} 
 				
-			Printf( "%s.\n", szMessage );
+			Printf( "%s.\n", Message.GetChars() );
 			removeEntry( ulIdx );
 		}
 		else
@@ -1104,7 +1104,7 @@
 void IPList::addEntry( const char *pszIP0, const char *pszIP1, const char *pszIP2, const char *pszIP3, const char *pszPlayerName, const char *pszCommentUncleaned, std::string &Message, time_t tExpiration )
 {
 	FILE		*pFile;
-	char		szOutString[512];
+	FString		OutString;
 	char		szDate[32];
 	ULONG		ulIdx;
 	std::stringstream messageStream;
@@ -1135,26 +1135,26 @@
 		*pCleaned = 0;
 	}
 
-	szOutString[0] = 0;
-	if ( pszPlayerName && strlen( pszPlayerName ))
+	if (pszPlayerName && strlen(pszPlayerName))
 	{
-		sprintf( szOutString, "%s", szOutString );
+		OutString.AppendFormat( "%s", pszPlayerName );
 		if ( pszComment && strlen( pszComment ))
-			sprintf( szOutString, "%s:", szOutString );
+			OutString.AppendFormat( ": %s", pszComment );
 	}
-	if ( pszComment )
-		sprintf( szOutString, "%s%s", szOutString, pszComment );
+	else if ( pszComment && strlen( pszComment ))
+		OutString.AppendFormat( "%s", pszComment );
+
 
 	// Address is already in the list.
 	ulIdx = doesEntryExist( pszIP0, pszIP1, pszIP2, pszIP3 );
 	if ( ulIdx != _ipVector.size() )
 	{
 		messageStream << pszIP0 << "." << pszIP1 << "."	<< pszIP2 << "." << pszIP3 << " already exists in list";
-		if ( ( getEntry ( ulIdx ).tExpirationDate != tExpiration ) || ( stricmp ( getEntry ( ulIdx ).szComment, szOutString ) ) )
+		if ( ( getEntry ( ulIdx ).tExpirationDate != tExpiration ) || ( stricmp ( getEntry ( ulIdx ).szComment, OutString.GetChars() ) ) )
 		{
 			messageStream << ". Just updating the expiration date and reason.\n";
 			_ipVector[ulIdx].tExpirationDate = tExpiration;
-			strncpy( _ipVector[ulIdx].szComment, szOutString, 127 );
+			strncpy( _ipVector[ulIdx].szComment, OutString.GetChars(), 127 );
 			_ipVector[ulIdx].szComment[127] = 0;
 			rewriteListToFile();
 		}
@@ -1171,7 +1171,7 @@
 	sprintf( newIPEntry.szIP[1], "%s", pszIP1 );
 	sprintf( newIPEntry.szIP[2], "%s", pszIP2 );
 	sprintf( newIPEntry.szIP[3], "%s", pszIP3 );
-	strncpy( newIPEntry.szComment, szOutString, 127 );
+	strncpy( newIPEntry.szComment, OutString.GetChars(), 127 );
 	newIPEntry.szComment[127] = 0;
 	newIPEntry.tExpirationDate = tExpiration;
 	_ipVector.push_back( newIPEntry );
@@ -1179,7 +1179,7 @@
 	// Finally, append the IP to the file.
 	if ( (pFile = fopen( _filename.c_str(), "a" )) )
 	{
-		sprintf( szOutString, "\n%s.%s.%s.%s", pszIP0, pszIP1, pszIP2, pszIP3 );
+		OutString.Format( "\n%s.%s.%s.%s", pszIP0, pszIP1, pszIP2, pszIP3 );
 
 		// [RC] Write the expiration date of this ban.
 		if ( tExpiration )
@@ -1188,14 +1188,14 @@
 
 			pTimeInfo = localtime( &tExpiration );
 			strftime( szDate, 32, "%m/%d/%Y %H:%M", pTimeInfo);
-			sprintf( szOutString, "%s<%s>", szOutString, szDate );
+			OutString.AppendFormat( "<%s>", szDate );
 		}
 
 		if ( pszPlayerName && strlen( pszPlayerName ))
-			sprintf( szOutString, "%s:%s", szOutString, pszPlayerName );
+			OutString.AppendFormat( ":%s", pszPlayerName );
 		if ( pszComment && strlen( pszComment ))
-			sprintf( szOutString, "%s:%s", szOutString, pszComment );
-		fputs( szOutString, pFile );
+			OutString.AppendFormat( ": %s", pszComment );
+		fputs( OutString.GetChars(), pFile );
 		fclose( pFile );
 
 		messageStream << pszIP0 << "." << pszIP1 << "."	<< pszIP2 << "." << pszIP3 << " added to list.";
@@ -1211,8 +1211,7 @@
 		Message = GenerateCouldNotOpenFileErrorString( "IPList::addEntry", _filename.c_str(), errno );
 	}
 
-	if ( pszComment )
-		delete pszComment;
+	delete[] pszComment;
 }
 
 //*****************************************************************************
