浏览代码

BETA: Fixing broken Double-Checked Locking:
* Fixed NPE vulnerability in `L2AttackableAI`.

'''Note:''' Please refer to the following documentation links: [https://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java Wikipedia: Double-checked locking: Usage_in_Java] and [http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html The University of Maryland: The Double-Checked Locking is Broken Declaration]

Zoey76 11 年之前
父节点
当前提交
e18192088b

+ 13 - 10
L2J_Server_BETA/java/com/l2jserver/gameserver/ai/L2AttackableAI.java

@@ -1722,19 +1722,22 @@ public class L2AttackableAI extends L2CharacterAI implements Runnable
 				if (caster.isMinion() && (sk.getTargetType() != L2TargetType.SELF))
 				{
 					L2Character leader = caster.getLeader();
-					if ((leader != null) && leader.isDead())
+					if (leader != null)
 					{
-						if (!Util.checkIfInRange((sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius()), caster, leader, false) && !isParty(sk) && !caster.isMovementDisabled())
+						if (leader.isDead())
 						{
-							moveToPawn(leader, sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius());
+							if (!Util.checkIfInRange((sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius()), caster, leader, false) && !isParty(sk) && !caster.isMovementDisabled())
+							{
+								moveToPawn(leader, sk.getCastRange() + caster.getTemplate().getCollisionRadius() + leader.getTemplate().getCollisionRadius());
+							}
+						}
+						if (GeoData.getInstance().canSeeTarget(caster, leader))
+						{
+							clientStopMoving(null);
+							caster.setTarget(leader);
+							caster.doCast(sk);
+							return true;
 						}
-					}
-					if (GeoData.getInstance().canSeeTarget(caster, leader))
-					{
-						clientStopMoving(null);
-						caster.setTarget(leader);
-						caster.doCast(sk);
-						return true;
 					}
 				}
 				

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/instancemanager/CHSiegeManager.java

@@ -83,7 +83,7 @@ public final class CHSiegeManager
 		}
 		catch (Exception e)
 		{
-			_log.warning("CHSiegeManager: Could not load siegable clan halls!:");
+			_log.warning("CHSiegeManager: Could not load siegable clan halls!:" + e.getMessage());
 		}
 	}
 	

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/AbsorberInfo.java

@@ -63,7 +63,7 @@ public final class AbsorberInfo implements IUniqueId
 			return true;
 		}
 		
-		if (obj instanceof DamageDoneInfo)
+		if (obj instanceof AbsorberInfo)
 		{
 			return (((AbsorberInfo) obj).getObjectId() == _objectId);
 		}

+ 7 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/CharEffectList.java

@@ -63,19 +63,19 @@ public final class CharEffectList
 {
 	private static final Logger _log = Logger.getLogger(CharEffectList.class.getName());
 	/** Map containing all effects from buffs for this effect list. */
-	private FastMap<Integer, BuffInfo> _buffs;
+	private volatile FastMap<Integer, BuffInfo> _buffs;
 	/** Map containing all triggered skills for this effect list. */
-	private FastMap<Integer, BuffInfo> _triggered;
+	private volatile FastMap<Integer, BuffInfo> _triggered;
 	/** Map containing all dances/songs for this effect list. */
-	private FastMap<Integer, BuffInfo> _dances;
+	private volatile FastMap<Integer, BuffInfo> _dances;
 	/** Map containing all toggle for this effect list. */
-	private FastMap<Integer, BuffInfo> _toggles;
+	private volatile FastMap<Integer, BuffInfo> _toggles;
 	/** Map containing all debuffs for this effect list. */
-	private FastMap<Integer, BuffInfo> _debuffs;
+	private volatile FastMap<Integer, BuffInfo> _debuffs;
 	/** They bypass most of the actions, they are not included in most operations. */
-	private FastMap<Integer, BuffInfo> _passives;
+	private volatile FastMap<Integer, BuffInfo> _passives;
 	/** Map containing the all stacked effect in progress for each abnormal type. */
-	private Map<AbnormalType, BuffInfo> _stackedEffects;
+	private volatile Map<AbnormalType, BuffInfo> _stackedEffects;
 	/** Set containing all abnormal types that shouldn't be added to this character effect list. */
 	private volatile Set<AbnormalType> _blockedBuffSlots = null;
 	/** Short buff skill ID. */

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/instance/L2PcInstance.java

@@ -776,7 +776,7 @@ public final class L2PcInstance extends L2Playable
 	private int _fishy = 0;
 	private int _fishz = 0;
 	
-	private Set<Integer> _transformAllowedSkills;
+	private volatile Set<Integer> _transformAllowedSkills;
 	private ScheduledFuture<?> _taskRentPet;
 	private ScheduledFuture<?> _taskWater;
 	

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/BuffInfo.java

@@ -52,7 +52,7 @@ public final class BuffInfo
 	private final List<AbstractEffect> _effects = new ArrayList<>(1);
 	// Tasks
 	/** Effect tasks for ticks. */
-	private Map<AbstractEffect, EffectTaskInfo> _tasks;
+	private volatile Map<AbstractEffect, EffectTaskInfo> _tasks;
 	/** Task for effect ending. */
 	private BuffTimeTask _effectTimeTask;
 	/** Scheduled future. */

+ 1 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/skills/Skill.java

@@ -228,7 +228,7 @@ public final class Skill implements IChanceSkillTrigger, IIdentifiable
 	
 	private final String _icon;
 	
-	private Byte[] _effectTypes;
+	private volatile Byte[] _effectTypes;
 	
 	// Channeling data
 	private final int _channelingSkillId;

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/model/zone/type/L2EffectZone.java

@@ -47,7 +47,7 @@ public class L2EffectZone extends L2ZoneType
 	private int _reuse;
 	protected boolean _bypassConditions;
 	private boolean _isShowDangerIcon;
-	protected FastMap<Integer, Integer> _skills;
+	protected volatile FastMap<Integer, Integer> _skills;
 	
 	public L2EffectZone(int id)
 	{
@@ -197,6 +197,7 @@ public class L2EffectZone extends L2ZoneType
 			removeSkill(skillId);
 			return;
 		}
+		
 		if (_skills == null)
 		{
 			synchronized (this)