소스 검색

BETA: Misc fixes:
* NPE vulnerability for _partys in L2CommandChannel.
* In L2Manor if seeds.xml is not valid it shouldn't NPE.
* NPE vulnerability for clan in Fort.
* Hero rework.
1. Performance fixes, using entries instead iterating over keys and getting the values.
1. Cleanup.
1. Fixed static variables assigned in instanced methods.
* Useless cast to float and then round in Siege.
* In MailSystem if MailList.xml is not valid it shouldn't NPE.
* Reverting [5143], hiding the problem won't fix it.
* Finalizing L2LoginServer class, uses Thread.start() in constructor if it's sub-classed the superclass thread will start before the sub-classed constructor is initialized.

Zoey76 13 년 전
부모
커밋
d5e27c82f7

+ 2 - 3
L2J_Server_BETA/java/com/l2jserver/L2DatabaseFactory.java

@@ -27,7 +27,7 @@ import com.mchange.v2.c3p0.ComboPooledDataSource;
 
 public class L2DatabaseFactory
 {
-	static Logger _log = Logger.getLogger(L2DatabaseFactory.class.getName());
+	private static final Logger _log = Logger.getLogger(L2DatabaseFactory.class.getName());
 	
 	public static enum ProviderType
 	{
@@ -154,7 +154,7 @@ public class L2DatabaseFactory
 	
 	public final String safetyString(String... whatToCheck)
 	{
-		// NOTE: Use brace as a safty precaution just incase name is a reserved word
+		// NOTE: Use brace as a safety precaution just in case name is a reserved word
 		final char braceLeft;
 		final char braceRight;
 		
@@ -208,7 +208,6 @@ public class L2DatabaseFactory
 	public Connection getConnection()
 	{
 		Connection con = null;
-		
 		while (con == null)
 		{
 			try

+ 2 - 3
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2CommandChannel.java

@@ -30,7 +30,6 @@ import com.l2jserver.gameserver.network.serverpackets.L2GameServerPacket;
 import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
 
 /**
- *
  * @author  chris_00
  */
 public class L2CommandChannel
@@ -116,12 +115,12 @@ public class L2CommandChannel
 				if(party != null)
 					removeParty(party);
 			}
+			_partys.clear();
 		}
-		_partys.clear();
 	}
 	
 	/**
-	 * @return overall membercount of the Command Channel
+	 * @return overall member count of the Command Channel
 	 */
 	public int getMemberCount()
 	{

+ 1 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/L2Manor.java

@@ -386,6 +386,7 @@ public class L2Manor
 		catch (Exception e)
 		{
 			_log.log(Level.WARNING, "Could not parse seeds.xml file: " + e.getMessage(), e);
+			return;
 		}
 		
 		doc.getDocumentElement().normalize();

+ 7 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Fort.java

@@ -436,10 +436,13 @@ public class Fort
 	 */
 	public boolean setOwner(L2Clan clan, boolean updateClansReputation)
 	{
-		L2Clan oldowner = getOwnerClan();
-		
-		// Remove old owner
-		if (oldowner != null && clan != null && clan != oldowner)
+		if (clan == null)
+		{
+			_log.warning(getClass().getSimpleName() + ": Updating Fort owner with null clan!!!");
+			return false;
+		}
+		final L2Clan oldowner = getOwnerClan();
+		if (oldowner != null && clan != oldowner)
 		{
 			// Remove points from old owner
 			updateClansReputation(oldowner, true);

+ 45 - 50
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Hero.java

@@ -29,6 +29,7 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -73,16 +74,16 @@ public class Hero
 	// delete hero items
 	private static final String DELETE_ITEMS = "DELETE FROM items WHERE item_id IN " + "(6842, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619, 6620, 6621, 9388, 9389, 9390) " + "AND owner_id NOT IN (SELECT charId FROM characters WHERE accesslevel > 0)";
 	
-	private static Map<Integer, StatsSet> _heroes;
-	private static Map<Integer, StatsSet> _completeHeroes;
+	private static final Map<Integer, StatsSet> _heroes = new FastMap<Integer, StatsSet>();
+	private static final Map<Integer, StatsSet> _completeHeroes = new FastMap<Integer, StatsSet>();
 	
-	private static Map<Integer, StatsSet> _herocounts;
-	private static Map<Integer, List<StatsSet>> _herofights;
-	private static List<StatsSet> _fights;
+	private static final Map<Integer, StatsSet> _herocounts = new FastMap<Integer, StatsSet>();
+	private static final Map<Integer, List<StatsSet>> _herofights = new FastMap<Integer, List<StatsSet>>();
+	private static final List<StatsSet> _fights = new FastList<StatsSet>();
 	
-	private static Map<Integer, List<StatsSet>> _herodiary;
-	private static Map<Integer, String> _heroMessage;
-	private static List<StatsSet> _diary;
+	private static final Map<Integer, List<StatsSet>> _herodiary = new FastMap<Integer, List<StatsSet>>();
+	private static final Map<Integer, String> _heroMessage = new FastMap<Integer, String>();
+	private static final List<StatsSet> _diary = new FastList<StatsSet>();
 	
 	public static final String COUNT = "count";
 	public static final String PLAYED = "played";
@@ -107,13 +108,12 @@ public class Hero
 	
 	private void init()
 	{
-		_heroes = new FastMap<Integer, StatsSet>();
-		_completeHeroes = new FastMap<Integer, StatsSet>();
-		
-		_herofights = new FastMap<Integer, List<StatsSet>>();
-		_herocounts = new FastMap<Integer, StatsSet>();
-		_herodiary = new FastMap<Integer, List<StatsSet>>();
-		_heroMessage = new FastMap<Integer, String>();
+		_heroes.clear();
+		_completeHeroes.clear();
+		_herocounts.clear();
+		_herofights.clear();
+		_herodiary.clear();
+		_heroMessage.clear();
 		
 		Connection con = null;
 		try
@@ -232,11 +232,7 @@ public class Hero
 		}
 		catch (SQLException e)
 		{
-			_log.warning("Hero System: Couldnt load Heroes");
-			if (Config.DEBUG)
-			{
-				_log.log(Level.WARNING, "", e);
-			}
+			_log.log(Level.WARNING, "Hero System: Couldnt load Heroes", e);
 		}
 		finally
 		{
@@ -289,8 +285,7 @@ public class Hero
 	
 	public void loadDiary(int charId)
 	{
-		_diary = new FastList<StatsSet>();
-		
+		_diary.clear();
 		int diaryentries = 0;
 		Connection con = null;
 		try
@@ -343,9 +338,7 @@ public class Hero
 		}
 		catch (SQLException e)
 		{
-			_log.warning("Hero System: Couldnt load Hero Diary for CharId: " + charId);
-			if (Config.DEBUG)
-				_log.log(Level.WARNING, "", e);
+			_log.log(Level.WARNING, "Hero System: Couldnt load Hero Diary for CharId: " + charId, e);
 		}
 		finally
 		{
@@ -355,10 +348,8 @@ public class Hero
 	
 	public void loadFights(int charId)
 	{
-		_fights = new FastList<StatsSet>();
-		
+		_fights.clear();
 		StatsSet _herocountdata = new StatsSet();
-		
 		Calendar _data = Calendar.getInstance();
 		_data.set(Calendar.DAY_OF_MONTH, 1);
 		_data.set(Calendar.HOUR_OF_DAY, 0);
@@ -381,16 +372,24 @@ public class Hero
 			statement.setLong(3, from);
 			ResultSet rset = statement.executeQuery();
 			
+			int charOneId;
+			int charOneClass;
+			int charTwoId;
+			int charTwoClass;
+			int winner;
+			long start;
+			int time;
+			int classed;
 			while (rset.next())
 			{
-				int charOneId = rset.getInt("charOneId");
-				int charOneClass = rset.getInt("charOneClass");
-				int charTwoId = rset.getInt("charTwoId");
-				int charTwoClass = rset.getInt("charTwoClass");
-				int winner = rset.getInt("winner");
-				long start = rset.getLong("start");
-				int time = rset.getInt("time");
-				int classed = rset.getInt("classed");
+				charOneId = rset.getInt("charOneId");
+				charOneClass = rset.getInt("charOneClass");
+				charTwoId = rset.getInt("charTwoId");
+				charTwoClass = rset.getInt("charTwoClass");
+				winner = rset.getInt("winner");
+				start = rset.getLong("start");
+				time = rset.getInt("time");
+				classed = rset.getInt("classed");
 				
 				if (charId == charOneId)
 				{
@@ -479,9 +478,7 @@ public class Hero
 		}
 		catch (SQLException e)
 		{
-			_log.warning("Hero System: Couldnt load Hero fights history for CharId: " + charId);
-			if (Config.DEBUG)
-				_log.log(Level.WARNING, "", e);
+			_log.log(Level.WARNING, "Hero System: Couldnt load Hero fights history for CharId: " + charId, e);
 		}
 		finally
 		{
@@ -787,10 +784,10 @@ public class Hero
 		
 		updateHeroes(false);
 		
+		L2PcInstance player;
 		for(Integer charId : _heroes.keySet())
 		{
-			L2PcInstance player = L2World.getInstance().getPlayer(charId);
-			
+			player = L2World.getInstance().getPlayer(charId);
 			if (player != null)
 			{
 				player.setHero(true);
@@ -878,11 +875,13 @@ public class Hero
 			}
 			else
 			{
-				for (Integer heroId : _heroes.keySet())
+				StatsSet hero;
+				int heroId;
+				for (Entry<Integer, StatsSet> entry : _heroes.entrySet())
 				{
-					StatsSet hero = _heroes.get(heroId);
-					
-					if ((_completeHeroes == null) || !_completeHeroes.containsKey(heroId))
+					hero = entry.getValue();
+					heroId = entry.getKey();
+					if (_completeHeroes.isEmpty() || !_completeHeroes.containsKey(heroId))
 					{
 						statement = con.prepareStatement(INSERT_HERO);
 						statement.setInt(1, heroId);
@@ -946,11 +945,7 @@ public class Hero
 		}
 		catch (SQLException e)
 		{
-			_log.warning("Hero System: Couldnt update Heroes");
-			if (Config.DEBUG)
-			{
-				_log.log(Level.WARNING, "", e);
-			}
+			_log.log(Level.WARNING, "Hero System: Couldnt update Heroes", e);
 		}
 		finally
 		{

+ 4 - 4
L2J_Server_BETA/java/com/l2jserver/gameserver/model/entity/Siege.java

@@ -104,28 +104,28 @@ public class Siege implements Siegable
 				else if ((timeRemaining <= 3600000) && (timeRemaining > 600000))
 				{
 					SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_MINUTES_UNTIL_SIEGE_CONCLUSION);
-					sm.addNumber(Math.round(timeRemaining / 60000));
+					sm.addNumber((int) timeRemaining / 60000);
 					announceToPlayer(sm, true);
 					ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleEndSiegeTask(_castleInst), timeRemaining - 600000); // Prepare task for 10 minute left.
 				}
 				else if ((timeRemaining <= 600000) && (timeRemaining > 300000))
 				{
 					SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_MINUTES_UNTIL_SIEGE_CONCLUSION);
-					sm.addNumber(Math.round(timeRemaining / 60000));
+					sm.addNumber((int) timeRemaining / 60000);
 					announceToPlayer(sm, true);
 					ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleEndSiegeTask(_castleInst), timeRemaining - 300000); // Prepare task for 5 minute left.
 				}
 				else if ((timeRemaining <= 300000) && (timeRemaining > 10000))
 				{
 					SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_MINUTES_UNTIL_SIEGE_CONCLUSION);
-					sm.addNumber(Math.round(timeRemaining / 60000));
+					sm.addNumber((int) timeRemaining / 60000);
 					announceToPlayer(sm, true);
 					ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleEndSiegeTask(_castleInst), timeRemaining - 10000); // Prepare task for 10 seconds count down
 				}
 				else if ((timeRemaining <= 10000) && (timeRemaining > 0))
 				{
 					SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.CASTLE_SIEGE_S1_SECONDS_LEFT);
-					sm.addNumber(Math.round(timeRemaining / 1000));
+					sm.addNumber((int) timeRemaining / 1000);
 					announceToPlayer(sm, true);
 					ThreadPoolManager.getInstance().scheduleGeneral(new ScheduleEndSiegeTask(_castleInst), timeRemaining); // Prepare task for second count down
 				}

+ 64 - 51
L2J_Server_BETA/java/com/l2jserver/gameserver/model/itemcontainer/Inventory.java

@@ -842,9 +842,8 @@ public abstract class Inventory extends ItemContainer
 	}
 	
 	/**
-	 * Returns the item in the paperdoll slot
-	 * @param slot 
-	 * @return L2ItemInstance
+	 * @param slot the slot.
+	 * @return the item in the paperdoll slot
 	 */
 	public L2ItemInstance getPaperdollItem(int slot)
 	{
@@ -920,7 +919,7 @@ public abstract class Inventory extends ItemContainer
 	}
 	
 	/**
-	 * Returns the ID of the item in the paperdol slot
+	 * Returns the ID of the item in the paperdoll slot
 	 * @param slot : int designating the slot
 	 * @return int designating the ID of the item
 	 */
@@ -1056,55 +1055,74 @@ public abstract class Inventory extends ItemContainer
 	public int getSlotFromItem(L2ItemInstance item)
 	{
 		int slot = -1;
-		int location = item.getLocationSlot();
-		
+		final int location = item.getLocationSlot();
 		switch(location)
 		{
-			case PAPERDOLL_UNDER:		slot = L2Item.SLOT_UNDERWEAR;
-			break;
-			case PAPERDOLL_LEAR:		slot = L2Item.SLOT_L_EAR;
-			break;
-			case PAPERDOLL_REAR:		slot = L2Item.SLOT_R_EAR;
-			break;
-			case PAPERDOLL_NECK:		slot = L2Item.SLOT_NECK;
-			break;
-			case PAPERDOLL_RFINGER:		slot = L2Item.SLOT_R_FINGER;
-			break;
-			case PAPERDOLL_LFINGER:		slot = L2Item.SLOT_L_FINGER;
-			break;
-			case PAPERDOLL_HAIR:		slot = L2Item.SLOT_HAIR;
-			break;
-			case PAPERDOLL_HAIR2:		slot = L2Item.SLOT_HAIR2;
-			break;
-			case PAPERDOLL_HEAD:		slot = L2Item.SLOT_HEAD;
-			break;
-			case PAPERDOLL_RHAND:		slot = L2Item.SLOT_R_HAND;
-			break;
-			case PAPERDOLL_LHAND:		slot = L2Item.SLOT_L_HAND;
-			break;
-			case PAPERDOLL_GLOVES:		slot = L2Item.SLOT_GLOVES;
-			break;
-			case PAPERDOLL_CHEST:		slot = item.getItem().getBodyPart();
-			break;
-			case PAPERDOLL_LEGS:		slot = L2Item.SLOT_LEGS;
-			break;
-			case PAPERDOLL_CLOAK:		slot = L2Item.SLOT_BACK;
-			break;
-			case PAPERDOLL_FEET:		slot = L2Item.SLOT_FEET;
-			break;
-			case PAPERDOLL_LBRACELET:	 slot = L2Item.SLOT_L_BRACELET;
-			break;
-			case PAPERDOLL_RBRACELET:	 slot = L2Item.SLOT_R_BRACELET;
-			break;
+			case PAPERDOLL_UNDER:
+				slot = L2Item.SLOT_UNDERWEAR;
+				break;
+			case PAPERDOLL_LEAR:
+				slot = L2Item.SLOT_L_EAR;
+				break;
+			case PAPERDOLL_REAR:
+				slot = L2Item.SLOT_R_EAR;
+				break;
+			case PAPERDOLL_NECK:
+				slot = L2Item.SLOT_NECK;
+				break;
+			case PAPERDOLL_RFINGER:
+				slot = L2Item.SLOT_R_FINGER;
+				break;
+			case PAPERDOLL_LFINGER:
+				slot = L2Item.SLOT_L_FINGER;
+				break;
+			case PAPERDOLL_HAIR:
+				slot = L2Item.SLOT_HAIR;
+				break;
+			case PAPERDOLL_HAIR2:
+				slot = L2Item.SLOT_HAIR2;
+				break;
+			case PAPERDOLL_HEAD:
+				slot = L2Item.SLOT_HEAD;
+				break;
+			case PAPERDOLL_RHAND:
+				slot = L2Item.SLOT_R_HAND;
+				break;
+			case PAPERDOLL_LHAND:
+				slot = L2Item.SLOT_L_HAND;
+				break;
+			case PAPERDOLL_GLOVES:
+				slot = L2Item.SLOT_GLOVES;
+				break;
+			case PAPERDOLL_CHEST:
+				slot = item.getItem().getBodyPart();
+				break;
+			case PAPERDOLL_LEGS:
+				slot = L2Item.SLOT_LEGS;
+				break;
+			case PAPERDOLL_CLOAK:
+				slot = L2Item.SLOT_BACK;
+				break;
+			case PAPERDOLL_FEET:
+				slot = L2Item.SLOT_FEET;
+				break;
+			case PAPERDOLL_LBRACELET:
+				slot = L2Item.SLOT_L_BRACELET;
+				break;
+			case PAPERDOLL_RBRACELET:
+				slot = L2Item.SLOT_R_BRACELET;
+				break;
 			case PAPERDOLL_DECO1:
 			case PAPERDOLL_DECO2:
 			case PAPERDOLL_DECO3:
 			case PAPERDOLL_DECO4:
 			case PAPERDOLL_DECO5:
-			case PAPERDOLL_DECO6:		slot = L2Item.SLOT_DECO;
-			break;
-			case PAPERDOLL_BELT:		slot = L2Item.SLOT_BELT;
-			break;
+			case PAPERDOLL_DECO6:
+				slot = L2Item.SLOT_DECO;
+				break;
+			case PAPERDOLL_BELT:
+				slot = L2Item.SLOT_BELT;
+				break;
 		}
 		return slot;
 	}
@@ -1585,12 +1603,7 @@ public abstract class Inventory extends ItemContainer
 			L2ItemInstance item;
 			while (inv.next())
 			{
-				// Check if that item already exists in OID map.
-				if (L2World.getInstance().findObject(inv.getInt("object_id")) != null)
-					continue;
-				
 				item = L2ItemInstance.restoreFromDb(getOwnerId(), inv);
-				
 				if (item == null)
 					continue;
 				

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/DocumentBase.java

@@ -352,7 +352,7 @@ abstract class DocumentBase
 		
 		EffectTemplate lt;
 		
-		final boolean isChanceSkillTrigger = (name == "ChanceSkillTrigger");
+		final boolean isChanceSkillTrigger = name.equals("ChanceSkillTrigger");
 		int trigId = 0;
 		if (attrs.getNamedItem("triggeredId") != null)
 			trigId = Integer.parseInt(getValue(attrs.getNamedItem("triggeredId").getNodeValue(), template));

+ 1 - 2
L2J_Server_BETA/java/com/l2jserver/loginserver/L2LoginServer.java

@@ -41,10 +41,9 @@ import com.l2jserver.loginserver.network.L2LoginPacketHandler;
 import com.l2jserver.status.Status;
 
 /**
- *
  * @author  KenM
  */
-public class L2LoginServer
+public final class L2LoginServer
 {
 	private final Logger _log = Logger.getLogger(L2LoginServer.class.getName());
 	

+ 9 - 7
L2J_Server_BETA/java/com/l2jserver/loginserver/mail/MailSystem.java

@@ -32,14 +32,13 @@ import org.w3c.dom.Node;
 import com.l2jserver.Config;
 
 /**
- * 
  * @author mrTJO
  */
 public class MailSystem
 {
 	private final static Logger _log = Logger.getLogger(MailSystem.class.getName());
 	private final Map<String, MailContent> _mailData = new FastMap<String, MailContent>();
-		
+	
 	public static MailSystem getInstance()
 	{
 		return SingletonHolder._instance;
@@ -72,6 +71,7 @@ public class MailSystem
 			catch (Exception e)
 			{
 				_log.log(Level.WARNING, "Could not parse MailList.xml file: " + e.getMessage(), e);
+				return;
 			}
 			
 			Node n = doc.getFirstChild();
@@ -85,7 +85,7 @@ public class MailSystem
 					
 					try
 					{
-						FileInputStream fis = new FileInputStream(new File(Config.DATAPACK_ROOT, "data/mail/"+maFile));
+						FileInputStream fis = new FileInputStream(new File(Config.DATAPACK_ROOT, "data/mail/" + maFile));
 						BufferedInputStream bis = new BufferedInputStream(fis);
 						int bytes = bis.available();
 						byte[] raw = new byte[bytes];
@@ -100,24 +100,26 @@ public class MailSystem
 					}
 					catch (IOException e)
 					{
-						_log.warning("IOException while reading "+maFile);
+						_log.warning("IOException while reading " + maFile);
 					}
 				}
 			}
 			_log.info("eMail System Loaded");
 		}
 		else
+		{
 			_log.warning("Cannot load eMail System - Missing file MailList.xml");
+		}
 	}
 	
-	class MailContent
+	public class MailContent
 	{
 		private final String _subject;
 		private final String _text;
 		
 		/**
-		 * @param subject 
-		 * @param text 
+		 * @param subject
+		 * @param text
 		 */
 		public MailContent(String subject, String text)
 		{