Jump to content

FIX packet flooder


Recommended Posts

this as a temporary solution for L2j-Killer

fix this, [c]DS

Index: java/com/l2jserver/gameserver/GameServer.java
===================================================================
--- java/com/l2jserver/gameserver/GameServer.java	(revision 3728)
+++ java/com/l2jserver/gameserver/GameServer.java	(working copy)
@@ -437,7 +437,7 @@
		sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT;

		final L2GamePacketHandler gph = new L2GamePacketHandler();
-		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null);
+		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, gph);

		InetAddress bindAddress = null;
		if (!Config.GAMESERVER_HOSTNAME.equals("*"))
Index: java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
===================================================================
--- java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(revision 3728)
+++ java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(working copy)
@@ -14,11 +14,15 @@
  */
package com.l2jserver.gameserver.network;

+import java.net.InetAddress;
import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.HashMap;
import java.util.concurrent.RejectedExecutionException;
import java.util.logging.Logger;


+import org.mmocore.network.IAcceptFilter;
import org.mmocore.network.IClientFactory;
import org.mmocore.network.IMMOExecutor;
import org.mmocore.network.IPacketHandler;
@@ -29,6 +33,8 @@
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.network.L2GameClient.GameClientState;
import com.l2jserver.gameserver.network.clientpackets.*;
+import com.l2jserver.loginserver.SelectorHelper;
+import com.l2jserver.loginserver.SelectorHelper.Flood;
import com.l2jserver.util.Util;

/**
@@ -40,9 +46,10 @@
  * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states.
  * @author  KenM
  */
-public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>
+public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>, IAcceptFilter
{
     private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName());
+    private final HashMap<Integer, Flood> _ipFloodMap = new HashMap<Integer, Flood>();

	// implementation
	public ReceivablePacket<L2GameClient> handlePacket(ByteBuffer buf, L2GameClient client)
@@ -1130,4 +1137,52 @@
			}
		}
	}
+
+	@Override
+	public boolean accept(SocketChannel sc)
+	{
+		InetAddress addr = sc.socket().getInetAddress();
+		int h = SelectorHelper.hash(addr.getAddress());
+		
+		long current = System.currentTimeMillis();
+		Flood f;
+		synchronized (_ipFloodMap)
+		{
+			f = _ipFloodMap.get(h);
+		}
+		if (f != null)
+		{
+			if (f.trys == -1)
+			{
+				f.lastAccess = current;
+				return false;
+			}
+			
+			if (f.lastAccess + 1000 > current)
+			{
+				f.lastAccess = current;
+				
+				if (f.trys >= 3)
+				{
+					f.trys = -1;
+					return false;
+				}
+				
+				f.trys++;
+			}
+			else
+			{
+				f.lastAccess = current;
+			}
+		}
+		else
+		{
+			synchronized (_ipFloodMap)
+			{
+				_ipFloodMap.put(h, new Flood());
+			}
+		}
+		
+		return true;
+	}
}
Index: java/com/l2jserver/loginserver/SelectorHelper.java
===================================================================
--- java/com/l2jserver/loginserver/SelectorHelper.java	(revision 3728)
+++ java/com/l2jserver/loginserver/SelectorHelper.java	(working copy)
@@ -123,18 +123,18 @@
	 * @param ip
	 * @return
	 */
-	private int hash(byte[] ip)
+	public static int hash(byte[] ip)
	{
		return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24
		        & 0xFF000000;
	}

-	private class Flood
+	public static class Flood
	{
-		long lastAccess;
-		int trys;
+		public long lastAccess;
+		public int trys;

-		Flood()
+		public Flood()
		{
			lastAccess = System.currentTimeMillis();
			trys = 0;

Link to comment
Share on other sites

the author of this patch is DrHouse, from the l2jserver team

 

And GoodT knew that?? OMG Credits?? Why I cant see them?? Indeed c/p is not a good thing !!!

Link to comment
Share on other sites

And GoodT knew that??

 

He has probably used it?

Instead of trolling everybody, just thank the author.

 

Anyway, I think that these shares should stay out of mxc ^^

More dead servers = less Lineage ][ Destruction.

 

Thanks for the share tho.

Link to comment
Share on other sites

My friend Coyote I thought that GoodT spammed (31 post and comment "Thx,Good share" ?)

 

My mistake then...Of course we thank the author for that java code :P

Link to comment
Share on other sites

patch works fine, but i added here also the removal of expired "bans", because without it, the IP could not login till gameserver restart (bad for LAN house..)

Index: java/com/l2jserver/gameserver/GameServer.java
===================================================================
--- java/com/l2jserver/gameserver/GameServer.java	(revision 3703)
+++ java/com/l2jserver/gameserver/GameServer.java	(working copy)
@@ -437,7 +437,7 @@
		sc.HELPER_BUFFER_COUNT = Config.MMO_HELPER_BUFFER_COUNT;

		final L2GamePacketHandler gph = new L2GamePacketHandler();
-		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, null);
+		_selectorThread = new SelectorThread<L2GameClient>(sc, gph, gph, gph, gph);

		InetAddress bindAddress = null;
		if (!Config.GAMESERVER_HOSTNAME.equals("*"))
Index: java/com/l2jserver/gameserver/network/L2GamePacketHandler.java
===================================================================
--- java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(revision 3703)
+++ java/com/l2jserver/gameserver/network/L2GamePacketHandler.java	(working copy)
@@ -14,11 +14,17 @@
  */
package com.l2jserver.gameserver.network;

+import java.net.InetAddress;
import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map.Entry;
import java.util.concurrent.RejectedExecutionException;
import java.util.logging.Logger;


+import org.mmocore.network.IAcceptFilter;
import org.mmocore.network.IClientFactory;
import org.mmocore.network.IMMOExecutor;
import org.mmocore.network.IPacketHandler;
@@ -29,6 +35,8 @@
import com.l2jserver.gameserver.ThreadPoolManager;
import com.l2jserver.gameserver.network.L2GameClient.GameClientState;
import com.l2jserver.gameserver.network.clientpackets.*;
+import com.l2jserver.loginserver.SelectorHelper;
+import com.l2jserver.loginserver.SelectorHelper.Flood;
import com.l2jserver.util.Util;

/**
@@ -40,9 +48,51 @@
  * Note: If for a given exception a packet needs to be handled on more then one state, then it should be added to all these states.
  * @author  KenM
  */
-public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>
+public final class L2GamePacketHandler implements IPacketHandler<L2GameClient>, IClientFactory<L2GameClient>, IMMOExecutor<L2GameClient>, IAcceptFilter
{
     private static final Logger _log = Logger.getLogger(L2GamePacketHandler.class.getName());
+    private final HashMap<Integer, Flood> _ipFloodMap = new HashMap<Integer, Flood>();
+    
+	public L2GamePacketHandler()
+	{
+		super();
+		Thread cleanUpIpFloodMap = new Thread()
+		{
+			public void run()
+			{
+				while (true)
+				{
+					long reference = System.currentTimeMillis() - (1000 * 300);
+					ArrayList<Integer> toRemove = new ArrayList<Integer>();
+					synchronized (_ipFloodMap)
+					{
+						for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())
+						{
+							Flood f = e.getValue();
+							if (f.lastAccess < reference)
+								toRemove.add(e.getKey());
+						}
+					}
+					
+					synchronized (_ipFloodMap)
+					{
+						_ipFloodMap.keySet().removeAll(toRemove);
+					}
+					
+					try
+					{
+						Thread.sleep(5000);
+					}
+					catch (InterruptedException e)
+					{
+						
+					}
+				}
+			}
+		};
+		cleanUpIpFloodMap.setDaemon(true);
+		cleanUpIpFloodMap.start();
+	}

	// implementation
	public ReceivablePacket<L2GameClient> handlePacket(ByteBuffer buf, L2GameClient client)
@@ -1130,4 +1180,52 @@
			}
		}
	}
+
+	@Override
+	public boolean accept(SocketChannel sc)
+	{
+		InetAddress addr = sc.socket().getInetAddress();
+		int h = SelectorHelper.hash(addr.getAddress());
+		
+		long current = System.currentTimeMillis();
+		Flood f;
+		synchronized (_ipFloodMap)
+		{
+			f = _ipFloodMap.get(h);
+		}
+		if (f != null)
+		{
+			if (f.trys == -1)
+			{
+				f.lastAccess = current;
+				return false;
+			}
+			
+			if (f.lastAccess + 1000 > current)
+			{
+				f.lastAccess = current;
+				
+				if (f.trys >= 3)
+				{
+					f.trys = -1;
+					return false;
+				}
+				
+				f.trys++;
+			}
+			else
+			{
+				f.lastAccess = current;
+			}
+		}
+		else
+		{
+			synchronized (_ipFloodMap)
+			{
+				_ipFloodMap.put(h, new Flood());
+			}
+		}
+		
+		return true;
+	}
}
Index: java/com/l2jserver/loginserver/SelectorHelper.java
===================================================================
--- java/com/l2jserver/loginserver/SelectorHelper.java	(revision 3703)
+++ java/com/l2jserver/loginserver/SelectorHelper.java	(working copy)
@@ -34,8 +34,7 @@
  * 
  * @author KenM
  */
-public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>,
-        IClientFactory<L2LoginClient>, IAcceptFilter
+public class SelectorHelper extends Thread implements IMMOExecutor<L2LoginClient>, IClientFactory<L2LoginClient>, IAcceptFilter
{
	private HashMap<Integer, Flood> _ipFloodMap;
	private ThreadPoolExecutor _generalPacketsThreadPool;
@@ -123,18 +122,17 @@
	 * @param ip
	 * @return
	 */
-	private int hash(byte[] ip)
+	public static int hash(byte[] ip)
	{
-		return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24
-		        & 0xFF000000;
+		return ip[0] & 0xFF | ip[1] << 8 & 0xFF00 | ip[2] << 16 & 0xFF0000 | ip[3] << 24 & 0xFF000000;
	}

-	private class Flood
+	public static class Flood
	{
-		long lastAccess;
-		int trys;
+		public long lastAccess;
+		public int trys;

-		Flood()
+		public Flood()
		{
			lastAccess = System.currentTimeMillis();
			trys = 0;
@@ -151,7 +149,7 @@
		while (true)
		{
			long reference = System.currentTimeMillis() - (1000 * 300);
-			ArrayList<Integer> toRemove = new ArrayList<Integer>(50);
+			ArrayList<Integer> toRemove = new ArrayList<Integer>();
			synchronized (_ipFloodMap)
			{
				for (Entry<Integer, Flood> e : _ipFloodMap.entrySet())
@@ -164,10 +162,7 @@

			synchronized (_ipFloodMap)
			{
-				for (Integer i : toRemove)
-				{
-					_ipFloodMap.remove(i);
-				}
+				_ipFloodMap.keySet().removeAll(toRemove);
			}

			try

[c]DrHouse and janiii

Link to comment
Share on other sites

I can't really see the commit at l2jserver timeline. I might be blind =/

who said they commited it anyway? its a temp fix that drhouse posted on l2j forums.. maybe it doesnt even work (well it should since its drhouse's but nobody seems have tested it.. least nobody posted some feedback)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



×
×
  • Create New...

AdBlock Extension Detected!

Our website is made possible by displaying online advertisements to our members.

Please disable AdBlock browser extension first, to be able to use our community.

I've Disabled AdBlock