Author: remm Date: Mon Jan 2 14:28:20 2017 New Revision: 1776937 URL: http://svn.apache.org/viewvc?rev=1776937&view=rev Log: 60513: Fix thread safety issue with RMI cleanup code.
Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java tomcat/trunk/webapps/docs/changelog.xml Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java?rev=1776937&r1=1776936&r2=1776937&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoaderBase.java Mon Jan 2 14:28:20 2017 @@ -2077,37 +2077,39 @@ public abstract class WebappClassLoaderB return; } - // Iterate over the values in the table - if (objTable instanceof Map<?,?>) { - Iterator<?> iter = ((Map<?,?>) objTable).values().iterator(); - while (iter.hasNext()) { - Object obj = iter.next(); - Object cclObject = cclField.get(obj); - if (this == cclObject) { - iter.remove(); - Object stubObject = stubField.get(obj); - log.error(sm.getString("webappClassLoader.clearRmi", - stubObject.getClass().getName(), stubObject)); + synchronized (objTable) { + // Iterate over the values in the table + if (objTable instanceof Map<?,?>) { + Iterator<?> iter = ((Map<?,?>) objTable).values().iterator(); + while (iter.hasNext()) { + Object obj = iter.next(); + Object cclObject = cclField.get(obj); + if (this == cclObject) { + iter.remove(); + Object stubObject = stubField.get(obj); + log.error(sm.getString("webappClassLoader.clearRmi", + stubObject.getClass().getName(), stubObject)); + } } } - } - // Clear the implTable map - Field implTableField = objectTableClass.getDeclaredField("implTable"); - implTableField.setAccessible(true); - Object implTable = implTableField.get(null); - if (implTable == null) { - return; - } + // Clear the implTable map + Field implTableField = objectTableClass.getDeclaredField("implTable"); + implTableField.setAccessible(true); + Object implTable = implTableField.get(null); + if (implTable == null) { + return; + } - // Iterate over the values in the table - if (implTable instanceof Map<?,?>) { - Iterator<?> iter = ((Map<?,?>) implTable).values().iterator(); - while (iter.hasNext()) { - Object obj = iter.next(); - Object cclObject = cclField.get(obj); - if (this == cclObject) { - iter.remove(); + // Iterate over the values in the table + if (implTable instanceof Map<?,?>) { + Iterator<?> iter = ((Map<?,?>) implTable).values().iterator(); + while (iter.hasNext()) { + Object obj = iter.next(); + Object cclObject = cclField.get(obj); + if (this == cclObject) { + iter.remove(); + } } } } Modified: tomcat/trunk/webapps/docs/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1776937&r1=1776936&r2=1776937&view=diff ============================================================================== --- tomcat/trunk/webapps/docs/changelog.xml (original) +++ tomcat/trunk/webapps/docs/changelog.xml Mon Jan 2 14:28:20 2017 @@ -56,6 +56,9 @@ Update the warnings that reference required options for running on Java 9 to use the latest syntax for those options. (markt) </update> + <fix> + <bug>60513</bug>: Fix thread safety issue with RMI cleanup code. (remm) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org