diff --git a/src/main.cpp b/src/main.cpp
index bb2ac5faf..a44a2e611 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -79,6 +79,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "httpfetch.h"
 #include "guiEngine.h"
 #include "mapsector.h"
+#include "player.h"
 
 #include "database-sqlite3.h"
 #ifdef USE_LEVELDB
@@ -1843,6 +1844,13 @@ int main(int argc, char *argv[])
 				break;
 			}
 
+			if (current_playername.length() > PLAYERNAME_SIZE-1) {
+				error_message = wgettext("Player name to long.");
+				playername = current_playername.substr(0,PLAYERNAME_SIZE-1);
+				g_settings->set("name", playername);
+				continue;
+			}
+
 			/*
 				Run game
 			*/
diff --git a/src/server.cpp b/src/server.cpp
index 9bd8e70f3..93d00f369 100644
--- a/src/server.cpp
+++ b/src/server.cpp
@@ -1448,14 +1448,21 @@ void Server::ProcessData(u8 *data, u32 datasize, u16 peer_id)
 		/*
 			Set up player
 		*/
-
-		// Get player name
 		char playername[PLAYERNAME_SIZE];
-		for(u32 i=0; i<PLAYERNAME_SIZE-1; i++)
-		{
-			playername[i] = data[3+i];
+		unsigned int playername_length = 0;
+		for (; playername_length < PLAYERNAME_SIZE; playername_length++ ) {
+			playername[playername_length] = data[3+playername_length];
+			if (data[3+playername_length] == 0)
+				break;
 		}
-		playername[PLAYERNAME_SIZE-1] = 0;
+
+		if (playername_length == PLAYERNAME_SIZE) {
+			actionstream<<"Server: Player with name exceeding max length "
+					<<"tried to connect from "<<addr_s<<std::endl;
+			DenyAccess(peer_id, L"Name to long");
+			return;
+		}
+
 
 		if(playername[0]=='\0')
 		{