File jetty-hashDOS.patch of Package jetty5.openSUSE_12.1_Update

Index: jetty-5.1.14/src/org/mortbay/http/HttpRequest.java
===================================================================
--- jetty-5.1.14.orig/src/org/mortbay/http/HttpRequest.java	2006-11-23 09:56:52.000000000 +0100
+++ jetty-5.1.14/src/org/mortbay/http/HttpRequest.java	2012-02-10 14:07:03.942175496 +0100
@@ -80,6 +80,14 @@
 
     /* ------------------------------------------------------------ */
     /**
+     * Maximum number of form Keys to protect against DOS attack from crafted hash keys.
+     * Set via the org.eclipse.jetty.server.Request.maxFormKeys
+     */
+    private static int __maxFormKeys = Integer.getInteger(
+            "org.eclipse.jetty.server.Request.maxFormKeys",1000).intValue();
+
+    /* ------------------------------------------------------------ */
+    /**
      * Maximum header line length.
      */
     public static int __maxLineLength = 4096;
@@ -891,7 +899,7 @@
                                 throw new IllegalStateException("Form too large");
                             
                             // Add form params to query params
-                            UrlEncoded.decodeTo(bout.getBuf(), 0, bout.getCount(), _parameters,encoding);
+                            UrlEncoded.decodeTo(bout.getBuf(), 0, bout.getCount(), _parameters, encoding, __maxFormKeys);
                         }
                         catch (EOFException e)
                         {
Index: jetty-5.1.14/src/org/mortbay/util/UrlEncoded.java
===================================================================
--- jetty-5.1.14.orig/src/org/mortbay/util/UrlEncoded.java	2005-12-22 00:14:38.000000000 +0100
+++ jetty-5.1.14/src/org/mortbay/util/UrlEncoded.java	2012-02-10 14:09:59.119192395 +0100
@@ -71,13 +71,13 @@
     /* ----------------------------------------------------------------- */
     public void decode(String query)
     {
-        decodeTo(query,this,StringUtil.__ISO_8859_1);
+        decodeTo(query,this,StringUtil.__ISO_8859_1,-1);
     }
     
     /* ----------------------------------------------------------------- */
     public void decode(String query,String charset)
     {
-        decodeTo(query,this,charset);
+        decodeTo(query,this,charset,-1);
     }
     
     /* -------------------------------------------------------------- */
@@ -162,10 +162,8 @@
      */
     public static void decodeTo(String content,MultiMap map)
     {
-        decodeTo(content,map,StringUtil.__ISO_8859_1);
+        decodeTo(content,map,StringUtil.__ISO_8859_1,-1);
     }
-    
-
 
     /* -------------------------------------------------------------- */
     /** Decoded parameters to Map.
@@ -173,6 +171,15 @@
      */
     public static void decodeTo(String content, MultiMap map, String charset)
     {
+        decodeTo(content,map,charset, -1);
+    }
+
+    /* -------------------------------------------------------------- */
+    /** Decoded parameters to Map.
+     * @param content the string containing the encoded parameters
+     */
+    public static void decodeTo(String content, MultiMap map, String charset, int maxKeys)
+    {
         if (charset==null)
             charset=StringUtil.__ISO_8859_1;
 
@@ -199,6 +206,11 @@
                           map.add(key,value);
                           key = null;
                       }
+                      if (maxKeys>0 && map.size()>maxKeys)
+                      {
+                          log.warn("maxFormKeys limit exceeded keys>" + Integer.valueOf(maxKeys));
+                          return;
+                      }
                       break;
                   case '=':
                       if (key!=null)
@@ -239,7 +251,7 @@
     /** Decoded parameters to Map.
      * @param data the byte[] containing the encoded parameters
      */
-    public static void decodeTo(byte[] data, int offset, int length, MultiMap map, String charset)
+    public static void decodeTo(byte[] data, int offset, int length, MultiMap map, String charset, int maxKeys)
     {
         if (data == null || length == 0)
             return;
@@ -269,6 +281,11 @@
                               key = null;
                           }
                           ox = offset;
+                          if (maxKeys>0 && map.size()>maxKeys)
+                          {
+                              log.warn("maxFormKeys limit exceeded keys>" + Integer.valueOf(maxKeys));
+                              return;
+                          }
                           break;
                       case '=':
                           if (key!=null)
openSUSE Build Service is sponsored by