Author: pauls
Date: Wed Apr 14 19:32:29 2010
New Revision: 934141
URL: http://svn.apache.org/viewvc?rev=934141&view=rev
Log:
Fix a memory leak (FELIX-2283).
Modified:
felix/trunk/framework.security/pom.xml
felix/trunk/framework.security/src/main/java/org/apache/felix/framework/security/util/Permissions.java
Modified: felix/trunk/framework.security/pom.xml
URL:
http://svn.apache.org/viewvc/felix/trunk/framework.security/pom.xml?rev=934141&r1=934140&r2=934141&view=diff
==============================================================================
--- felix/trunk/framework.security/pom.xml (original)
+++ felix/trunk/framework.security/pom.xml Wed Apr 14 19:32:29 2010
@@ -40,7 +40,7 @@
<dependency>
<groupId>${pom.groupId}</groupId>
<artifactId>org.apache.felix.framework</artifactId>
- <version>2.1.0-SNAPSHOT</version>
+ <version>2.0.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
Modified:
felix/trunk/framework.security/src/main/java/org/apache/felix/framework/security/util/Permissions.java
URL:
http://svn.apache.org/viewvc/felix/trunk/framework.security/src/main/java/org/apache/felix/framework/security/util/Permissions.java?rev=934141&r1=934140&r2=934141&view=diff
==============================================================================
---
felix/trunk/framework.security/src/main/java/org/apache/felix/framework/security/util/Permissions.java
(original)
+++
felix/trunk/framework.security/src/main/java/org/apache/felix/framework/security/util/Permissions.java
Wed Apr 14 19:32:29 2010
@@ -28,6 +28,7 @@ import java.security.AllPermission;
import java.security.Permission;
import java.security.PermissionCollection;
import java.security.PrivilegedAction;
+import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
@@ -121,11 +122,16 @@ public final class Permissions
Permissions result = null;
synchronized (m_permissions)
{
- result = (Permissions) m_permissions.get(permissionInfos);
+ result = (Permissions) m_permissions.get(new
Entry(permissionInfos));
}
if (result == null)
{
- result = new Permissions(permissionInfos, m_context, m_action);
+ //permissionInfos may not be referenced by the new
Permissions, as
+ //otherwise the reference in m_permissions prevents the
key from
+ //being garbage collectable.
+ PermissionInfo[] permissionInfosClone = new
PermissionInfo[permissionInfos.length];
+ System.arraycopy(permissionInfos, 0, permissionInfosClone, 0,
permissionInfos.length);
+ result = new Permissions(permissionInfosClone, m_context,
m_action);
synchronized (m_permissions)
{
m_permissions.put(
@@ -175,13 +181,26 @@ public final class Permissions
Object entry = super.get();
- if (entry == null)
- {
- return false;
- }
-
if (o instanceof Entry)
{
+
+ Object otherEntry = ((Entry) o).get();
+ if (entry == null)
+ {
+ return otherEntry == null;
+ }
+ if (otherEntry == null)
+ {
+ return false;
+ }
+ if
(!entry.getClass().equals(otherEntry.getClass()))
+ {
+ return false;
+ }
+ if (entry instanceof Object[])
+ {
+ return Arrays.equals((Object[])entry,
(Object[])otherEntry);
+ }
return entry.equals(((Entry) o).get());
}
else