From 407b2ffd647d8635e655b0bc54c0114d77a2b7b9 Mon Sep 17 00:00:00 2001 From: markt Date: Tue, 23 Nov 2010 10:38:40 +0000 Subject: [PATCH] Make memory leak prevention code that clears ThreadLocal instances more robust against objects with toString() methods that throw exceptions. git-svn-id: https://svn.apache.org/repos/asf/tomcat/trunk@1038041 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/catalina/loader/LocalStrings.properties | 3 +++ .../apache/catalina/loader/WebappClassLoader.java | 20 ++++++++++++++++++-- webapps/docs/changelog.xml | 5 +++++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/java/org/apache/catalina/loader/LocalStrings.properties b/java/org/apache/catalina/loader/LocalStrings.properties index 4350c7196..47fd08330 100644 --- a/java/org/apache/catalina/loader/LocalStrings.properties +++ b/java/org/apache/catalina/loader/LocalStrings.properties @@ -49,6 +49,9 @@ webappClassLoader.clearThreadLocal=The web application [{0}] created a ThreadLoc webappClassLoader.clearThreadLocalDebugClear=To simplify the process of tracing memory leaks, the key has been forcibly removed. webappClassLoader.clearThreadLocalClear=To prevent a memory leak, the ThreadLocal has been forcibly removed. webappClassLoader.clearThreadLocalFail=Failed to clear ThreadLocal references for web application [{0}] +webappClassLoader.clearThreadLocal.badKey=Unable to determine string representation of key of type [{0}] +webappClassLoader.clearThreadLocal.badValue=Unable to determine string representation of value of type [{0}] +webappClassLoader.clearThreadLocal.unknown=Unknown webappClassLoader.stopThreadFail=Failed to terminate thread named [{0}] for web application [{1}] webappClassLoader.stopTimerThreadFail=Failed to terminate TimerThread named [{0}] for web application [{1}] webappClassLoader.validationErrorJarPath=Unable to validate JAR entry with name {0} diff --git a/java/org/apache/catalina/loader/WebappClassLoader.java b/java/org/apache/catalina/loader/WebappClassLoader.java index 8fd663855..36b7d52c2 100644 --- a/java/org/apache/catalina/loader/WebappClassLoader.java +++ b/java/org/apache/catalina/loader/WebappClassLoader.java @@ -2442,11 +2442,27 @@ public class WebappClassLoader args[0] = contextName; if (key != null) { args[1] = key.getClass().getCanonicalName(); - args[2] = key.toString(); + try { + args[2] = key.toString(); + } catch (Exception e) { + log.error(sm.getString( + "webappClassLoader.clearThreadLocal.badKey", + args[1]), e); + args[2] = sm.getString( + "webappClassLoader.clearThreadLocal.unknown"); + } } if (value != null) { args[3] = value.getClass().getCanonicalName(); - args[4] = value.toString(); + try { + args[4] = value.toString(); + } catch (Exception e) { + log.error(sm.getString( + "webappClassLoader.clearThreadLocal.badValue", + args[3]), e); + args[4] = sm.getString( + "webappClassLoader.clearThreadLocal.unknown"); + } } if (value == null) { if (log.isDebugEnabled()) { diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 5d70d273b..b55c1909e 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -159,6 +159,11 @@ AsyncContext.dispatch() once the asynchronous request has timed out. (markt) + + Make memory leak prevention code that clears ThreadLocal instances more + robust against objects with toString() methods that throw exceptions. + (markt) + -- 2.11.0