svn commit: r1853824 - in /cocoon/branches/BRANCH_2_1_X: src/blocks/xsp/java/org/apache/cocoon/components/language/generator/GeneratorSelector.java src/java/org/apache/cocoon/reading/ResourceReader.java status.xml

[email protected] Mon, 18 Feb 2019 20:52:23 -0000
Newsgroups gmane.text.xml.cocoon.cvs
Message-ID <[email protected]>
Author: anathaniel
Date: Mon Feb 18 20:52:23 2019
New Revision: 1853824

URL: http://svn.apache.org/viewvc?rev=1853824&view=rev
Log:
Unsynchronized HashMap.put in ResourceReader and GeneratorSelector may lead to infinite loop

Modified:
    cocoon/branches/BRANCH_2_1_X/src/blocks/xsp/java/org/apache/cocoon/components/language/generator/GeneratorSelector.java
    cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ResourceReader.java
    cocoon/branches/BRANCH_2_1_X/status.xml

Modified: cocoon/branches/BRANCH_2_1_X/src/blocks/xsp/java/org/apache/cocoon/components/language/generator/GeneratorSelector.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/blocks/xsp/java/org/apache/cocoon/components/language/generator/GeneratorSelector.java?rev=1853824&r1=1853823&r2=1853824&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/blocks/xsp/java/org/apache/cocoon/components/language/generator/GeneratorSelector.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/blocks/xsp/java/org/apache/cocoon/components/language/generator/GeneratorSelector.java Mon Feb 18 20:52:23 2019
@@ -5,9 +5,9 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -36,6 +36,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * This interface is the common base of all Compiled Components.  This
@@ -63,7 +64,7 @@ public class GeneratorSelector extends E
     protected Map componentHandlers = new HashMap();
 
     /** Dynamic component handlers mapping. */
-    private Map componentMapping = new HashMap();
+    private Map componentMapping = new ConcurrentHashMap();
 
 
     public void contextualize(Context context) {

Modified: cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ResourceReader.java
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ResourceReader.java?rev=1853824&r1=1853823&r2=1853824&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ResourceReader.java (original)
+++ cocoon/branches/BRANCH_2_1_X/src/java/org/apache/cocoon/reading/ResourceReader.java Mon Feb 18 20:52:23 2019
@@ -41,7 +41,6 @@ import org.xml.sax.SAXException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -93,7 +92,8 @@ public class ResourceReader extends Abst
     /**
      * The list of generated documents
      */
-    private static final Map documents = Collections.synchronizedMap(new HashMap());
+    private static final Map documents = new HashMap();
+    private static final Object documentsLock = new Object();
 
     protected long configuredExpires;
     protected boolean configuredQuickTest;
@@ -235,12 +235,14 @@ public class ResourceReader extends Abst
             return inputSource.getLastModified();
         }
 
-        final String systemId = (String) documents.get(request.getRequestURI());
-        if (systemId == null || inputSource.getURI().equals(systemId)) {
-            return inputSource.getLastModified();
-        }
+        synchronized (documentsLock) {
+            final String systemId = (String) documents.get(request.getRequestURI());
+            if (systemId == null || inputSource.getURI().equals(systemId)) {
+                return inputSource.getLastModified();
+            }
 
-        documents.remove(request.getRequestURI());
+            documents.remove(request.getRequestURI());
+        }
         return 0;
     }
 
@@ -288,7 +290,7 @@ public class ResourceReader extends Abst
             }
 
             response.setHeader("Content-Range", "bytes " + entityRange + "/" + entityLength);
-            
+
             if (actualByteRange.length() != -1) {
                 response.setHeader("Content-Length", String.valueOf(actualByteRange.length()));
             }
@@ -345,7 +347,9 @@ public class ResourceReader extends Abst
             if (!quickTest) {
                 // if everything is ok, add this to the list of generated documents
                 // (see http://marc.theaimsgroup.com/?l=xml-cocoon-dev&m=102921894301915 )
-                documents.put(request.getRequestURI(), inputSource.getURI());
+                synchronized (documentsLock) {
+                    documents.put(request.getRequestURI(), inputSource.getURI());
+                }
             }
         } catch (IOException e) {
             // COCOON-2307: if the client severed the connection, no matter for it that we rethrow the exception as it will never receive it

Modified: cocoon/branches/BRANCH_2_1_X/status.xml
URL: http://svn.apache.org/viewvc/cocoon/branches/BRANCH_2_1_X/status.xml?rev=1853824&r1=1853823&r2=1853824&view=diff
==============================================================================
--- cocoon/branches/BRANCH_2_1_X/status.xml (original)
+++ cocoon/branches/BRANCH_2_1_X/status.xml Mon Feb 18 20:52:23 2019
@@ -184,6 +184,9 @@
 
   <changes>
   <release version="2.1.13" date="TBD">
+    <action dev="AN" type="fix">
+      Unsynchronized HashMap.put in ResourceReader and GeneratorSelector may lead to infinite loop.
+    </action>
     <action dev="AN" type="update">
       Update to poi-3.14
     </action>