瀏覽代碼

BETA: Fixed a bug that was allowing same account to be logged in twice.

Reported by: Kingzor, angkor_tm
Nos 11 年之前
父節點
當前提交
5d609e5d10

+ 3 - 2
L2J_Server_BETA/java/com/l2jserver/gameserver/LoginServerThread.java

@@ -461,10 +461,11 @@ public class LoginServerThread extends Thread
 	 * Adds the game server login.
 	 * @param account the account
 	 * @param client the client
+	 * @return {@code true} if account was not already logged in, {@code false} otherwise
 	 */
-	public void addGameServerLogin(String account, L2GameClient client)
+	public boolean addGameServerLogin(String account, L2GameClient client)
 	{
-		_accountsInGameServer.put(account, client);
+		return _accountsInGameServer.putIfAbsent(account, client) == null;
 	}
 	
 	/**

+ 10 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/network/clientpackets/AuthLogin.java

@@ -71,9 +71,16 @@ public final class AuthLogin extends L2GameClientPacket
 		// avoid potential exploits
 		if (client.getAccountName() == null)
 		{
-			client.setAccountName(_loginName);
-			LoginServerThread.getInstance().addGameServerLogin(_loginName, client);
-			LoginServerThread.getInstance().addWaitingClientAndSendRequest(_loginName, client, key);
+			// Preventing duplicate login in case client login server socket was disconnected or this packet was not sent yet
+			if (LoginServerThread.getInstance().addGameServerLogin(_loginName, client))
+			{
+				client.setAccountName(_loginName);
+				LoginServerThread.getInstance().addWaitingClientAndSendRequest(_loginName, client, key);
+			}
+			else
+			{
+				client.close((L2GameServerPacket) null);
+			}
 		}
 	}