Author: markt
Date: Mon Jun 23 12:55:25 2014
New Revision: 1604788

URL: http://svn.apache.org/r1604788
Log:
Strengthen WebSocket extension parameter validation

Modified:
    tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/websocket/Util.java
    tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties?rev=1604788&r1=1604787&r2=1604788&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/LocalStrings.properties Mon 
Jun 23 12:55:25 2014
@@ -28,6 +28,7 @@ asyncChannelWrapperSecure.wrongStateWrit
 
 backgroundProcessManager.processFailed=A background process failed
 
+util.notToken=An illegal extension parameter was specified with name [{0}] and 
value [{1}]
 util.invalidMessageHandler=The message handler provided does not have an 
onMessage(Object) method
 util.invalidType=Unable to coerce value [{0}] to type [{1}]. That type is not 
supported.
 util.unknownDecoderType=The Decoder type [{0}] is not recognized

Modified: tomcat/trunk/java/org/apache/tomcat/websocket/Util.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/websocket/Util.java?rev=1604788&r1=1604787&r2=1604788&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/websocket/Util.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/websocket/Util.java Mon Jun 23 12:55:25 
2014
@@ -478,10 +478,24 @@ public class Util {
                 } else {
                     name = unparsedParameters[i].substring(0, 
equalsPos).trim();
                     value = unparsedParameters[i].substring(equalsPos + 
1).trim();
-                    if (value.length() > 2 && value.charAt(0) == '\"') {
-                        value = value.substring(1, value.length() - 1);
+                    int len = value.length();
+                    if (len > 1) {
+                        if (value.charAt(0) == '\"' && value.charAt(len - 1) 
== '\"') {
+                            value = value.substring(1, value.length() - 1);
+                        }
                     }
                 }
+                // Make sure value doesn't contain any of the delimiters since
+                // that would indicate something went wrong
+                if (containsDelims(name) || containsDelims(value)) {
+                    throw new IllegalArgumentException(sm.getString(
+                            "util.notToken", name, value));
+                }
+                if (value != null &&
+                        (value.indexOf(',') > -1 || value.indexOf(';') > -1 ||
+                        value.indexOf('\"') > -1 || value.indexOf('=') > -1)) {
+                    throw new IllegalArgumentException(sm.getString("", 
value));
+                }
                 extension.addParameter(new WsExtensionParameter(name, value));
             }
             extensions.add(extension);
@@ -489,6 +503,25 @@ public class Util {
     }
 
 
+    private static boolean containsDelims(String input) {
+        if (input == null || input.length() == 0) {
+            return false;
+        }
+        for (char c : input.toCharArray()) {
+            switch (c) {
+                case ',':
+                case ';':
+                case '\"':
+                case '=':
+                    return true;
+                default:
+                    // NO_OP
+            }
+
+        }
+        return false;
+    }
+
     private static Method getOnMessageMethod(MessageHandler listener) {
         try {
             return listener.getClass().getMethod("onMessage", Object.class);

Modified: tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java?rev=1604788&r1=1604787&r2=1604788&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java (original)
+++ tomcat/trunk/test/org/apache/tomcat/websocket/TestUtil.java Mon Jun 23 
12:55:25 2014
@@ -461,4 +461,13 @@ public class TestUtil {
         Assert.assertEquals(0, params3.size());
     }
 
+    @Test(expected=IllegalArgumentException.class)
+    public void testParseExtensionHeaderInvalid01() {
+        Util.parseExtensionHeader(new ArrayList<Extension>(), "ext;a=\"1;b=2");
+    }
+
+    @Test(expected=IllegalArgumentException.class)
+    public void testParseExtensionHeaderInvalid02() {
+        Util.parseExtensionHeader(new ArrayList<Extension>(), "ext;a=1\";b=2");
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to