Author: jukka
Date: Fri Nov 11 11:25:34 2011
New Revision: 1200815

URL: http://svn.apache.org/viewvc?rev=1200815&view=rev
Log:
TIKA-780: Optimize loading of the media type registry

Add a maximum size limit to the static set of simple media types kept in 
memory. This prevents a potential DOS attack against the library.

Fix handling of media type parameters.

Modified:
    tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java

Modified: tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java
URL: 
http://svn.apache.org/viewvc/tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java?rev=1200815&r1=1200814&r2=1200815&view=diff
==============================================================================
--- tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java 
(original)
+++ tika/trunk/tika-core/src/main/java/org/apache/tika/mime/MediaType.java Fri 
Nov 11 11:25:34 2011
@@ -17,8 +17,10 @@
 package org.apache.tika.mime;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.SortedMap;
@@ -115,7 +117,8 @@ public final class MediaType implements 
                 int slash = string.indexOf('/');
                 if (slash == -1) {
                     return null;
-                } else if (isSimpleName(string.substring(0, slash))
+                } else if (SIMPLE_TYPES.size() < 10000
+                        && isSimpleName(string.substring(0, slash))
                         && isSimpleName(string.substring(slash + 1))) {
                     type = new MediaType(string, slash);
                     SIMPLE_TYPES.put(string, type);
@@ -228,18 +231,15 @@ public final class MediaType implements 
             builder.append(subtype);
 
             SortedMap<String, String> map = new TreeMap<String, String>();
-            if (!(parameters instanceof SortedMap<?, ?>)) {
-                parameters = new TreeMap<String, String>(parameters);
-            }
             for (Map.Entry<String, String> entry : parameters.entrySet()) {
                 String key = entry.getKey().trim().toLowerCase(Locale.ENGLISH);
-                String value = entry.getValue();
-
-                map.put(key, value);
-
+                map.put(key, entry.getValue());
+            }
+            for (Map.Entry<String, String> entry : map.entrySet()) {
                 builder.append("; ");
-                builder.append(key);
+                builder.append(entry.getKey());
                 builder.append("=");
+                String value = entry.getValue();
                 if (SPECIAL_OR_WHITESPACE.matcher(value).find()) {
                     builder.append('"');
                     
builder.append(SPECIAL.matcher(value).replaceAll("\\\\$0"));


Reply via email to