Repository: karaf Updated Branches: refs/heads/master fef371380 -> e653836d7
[KARAF-4687] Prevent classloader leaks with static Throwables Project: http://git-wip-us.apache.org/repos/asf/karaf/repo Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/09c17953 Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/09c17953 Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/09c17953 Branch: refs/heads/master Commit: 09c1795378115ab46eb537a3b3d9ac6dd3e185af Parents: fef3713 Author: Grzegorz Grzybek <[email protected]> Authored: Wed Aug 31 18:15:08 2016 +0200 Committer: Guillaume Nodet <[email protected]> Committed: Tue Sep 6 13:40:19 2016 +0200 ---------------------------------------------------------------------- .../src/main/java/java/lang/Exception.java | 33 +++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/karaf/blob/09c17953/exception/src/main/java/java/lang/Exception.java ---------------------------------------------------------------------- diff --git a/exception/src/main/java/java/lang/Exception.java b/exception/src/main/java/java/lang/Exception.java index 76eee71..d07c280 100644 --- a/exception/src/main/java/java/lang/Exception.java +++ b/exception/src/main/java/java/lang/Exception.java @@ -18,6 +18,8 @@ package java.lang; import java.lang.reflect.Field; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; import javax.xml.bind.annotation.XmlTransient; @@ -34,13 +36,14 @@ import javax.xml.bind.annotation.XmlTransient; public class Exception extends Throwable { private static final long serialVersionUID = -3387516993124229948L; - private transient Class[] classContext = SecurityManagerEx.getInstance().getThrowableContext(this); + private transient Reference<Class<?>>[] classContext; /** * Constructs a new {@code Exception} that includes the current stack trace. */ public Exception() { super(); + initClassContext(); } /** @@ -52,6 +55,7 @@ public class Exception extends Throwable { */ public Exception(String detailMessage) { super(detailMessage); + initClassContext(); } /** @@ -65,6 +69,7 @@ public class Exception extends Throwable { */ public Exception(String detailMessage, Throwable throwable) { super(detailMessage, throwable); + initClassContext(); } /** @@ -76,6 +81,7 @@ public class Exception extends Throwable { */ public Exception(Throwable throwable) { super(throwable); + initClassContext(); } /** @@ -115,17 +121,36 @@ public class Exception extends Throwable { } catch (Exception e) { e.printStackTrace(); } - + initClassContext(); } @XmlTransient @Deprecated public Class[] getClassContext() { - return classContext; + Class<?>[] context = new Class<?>[classContext.length]; + for (int i = 0; i < classContext.length; i++) { + Class<?> c = classContext[i].get(); + context[i] = c == null ? Object.class : c; + } + return context; + } + + @SuppressWarnings("unchecked") + private void initClassContext() { + Class[] context = SecurityManagerEx.getInstance().getThrowableContext(this); + classContext = new Reference[context.length]; + for (int i = 0; i < context.length; i++) { + classContext[i] = new WeakReference<Class<?>>(context[i]); + } } protected Class[] classContext() { - return classContext; + Class<?>[] context = new Class<?>[classContext.length]; + for (int i = 0; i < classContext.length; i++) { + Class<?> c = classContext[i].get(); + context[i] = c == null ? Object.class : c; + } + return context; } private static class SecurityManagerEx extends SecurityManager
