Author: trustin
Date: Mon Oct 15 23:21:30 2007
New Revision: 585053

URL: http://svn.apache.org/viewvc?rev=585053&view=rev
Log:
Fixed issue: DIRMINA-454 (Trivial denial of service in TextLineDecoder)
* Applied Owen Jacobson's patch


Modified:
    
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
    
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
    
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java

Modified: 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java?rev=585053&r1=585052&r2=585053&view=diff
==============================================================================
--- 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
 (original)
+++ 
mina/branches/1.0/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
 Mon Oct 15 23:21:30 2007
@@ -170,11 +170,7 @@
                 in.limit(pos);
                 in.position(oldPos);
 
-                buf.put(in);
-                if (buf.position() > maxLineLength) {
-                    throw new BufferDataException("Line is too long: "
-                            + buf.position());
-                }
+                appendToOutput (in, buf);
                 buf.flip();
                 buf.limit(buf.limit() - matchCount);
                 out.write(buf.getString(decoder));
@@ -189,7 +185,7 @@
 
         // Put remainder to buf.
         in.position(oldPos);
-        buf.put(in);
+        appendToOutput (in, buf);
 
         return matchCount;
     }
@@ -218,11 +214,7 @@
                     in.limit(pos);
                     in.position(oldPos);
 
-                    buf.put(in);
-                    if (buf.position() > maxLineLength) {
-                        throw new BufferDataException("Line is too long: "
-                                + buf.position());
-                    }
+                    appendToOutput (in, buf);
                     buf.flip();
                     buf.limit(buf.limit() - matchCount);
                     out.write(buf.getString(decoder));
@@ -240,9 +232,17 @@
 
         // Put remainder to buf.
         in.position(oldPos);
-        buf.put(in);
+        appendToOutput (in, buf);
 
         return matchCount;
+    }
+
+    private void appendToOutput (ByteBuffer in, ByteBuffer buf) {
+      buf.put(in);
+      if (buf.position() > maxLineLength) {
+          throw new BufferDataException("Line is too long: "
+                  + buf.position());
+      }
     }
 
     private class Context {

Modified: 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
URL: 
http://svn.apache.org/viewvc/mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java?rev=585053&r1=585052&r2=585053&view=diff
==============================================================================
--- 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
 (original)
+++ 
mina/branches/1.1/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
 Mon Oct 15 23:21:30 2007
@@ -168,11 +168,7 @@
                 in.limit(pos);
                 in.position(oldPos);
 
-                buf.put(in);
-                if (buf.position() > maxLineLength) {
-                    throw new BufferDataException("Line is too long: "
-                            + buf.position());
-                }
+                appendToOutput (in, buf);
                 buf.flip();
                 buf.limit(buf.limit() - matchCount);
                 out.write(buf.getString(decoder));
@@ -187,7 +183,7 @@
 
         // Put remainder to buf.
         in.position(oldPos);
-        buf.put(in);
+        appendToOutput (in, buf);
 
         return matchCount;
     }
@@ -216,11 +212,7 @@
                     in.limit(pos);
                     in.position(oldPos);
 
-                    buf.put(in);
-                    if (buf.position() > maxLineLength) {
-                        throw new BufferDataException("Line is too long: "
-                                + buf.position());
-                    }
+                    appendToOutput (in, buf);
                     buf.flip();
                     buf.limit(buf.limit() - matchCount);
                     out.write(buf.getString(decoder));
@@ -238,9 +230,17 @@
 
         // Put remainder to buf.
         in.position(oldPos);
-        buf.put(in);
+        appendToOutput (in, buf);
 
         return matchCount;
+    }
+
+    private void appendToOutput (ByteBuffer in, ByteBuffer buf) {
+      buf.put(in);
+      if (buf.position() > maxLineLength) {
+          throw new BufferDataException("Line is too long: "
+                  + buf.position());
+      }
     }
 
     private class Context {

Modified: 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
URL: 
http://svn.apache.org/viewvc/mina/trunk/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java?rev=585053&r1=585052&r2=585053&view=diff
==============================================================================
--- 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
 (original)
+++ 
mina/trunk/core/src/main/java/org/apache/mina/filter/codec/textline/TextLineDecoder.java
 Mon Oct 15 23:21:30 2007
@@ -168,11 +168,7 @@
                 in.limit(pos);
                 in.position(oldPos);
 
-                buf.put(in);
-                if (buf.position() > maxLineLength) {
-                    throw new BufferDataException("Line is too long: "
-                            + buf.position());
-                }
+                appendToOutput (in, buf);
                 buf.flip();
                 buf.limit(buf.limit() - matchCount);
                 out.write(buf.getString(decoder));
@@ -187,7 +183,7 @@
 
         // Put remainder to buf.
         in.position(oldPos);
-        buf.put(in);
+        appendToOutput (in, buf);
 
         return matchCount;
     }
@@ -216,11 +212,7 @@
                     in.limit(pos);
                     in.position(oldPos);
 
-                    buf.put(in);
-                    if (buf.position() > maxLineLength) {
-                        throw new BufferDataException("Line is too long: "
-                                + buf.position());
-                    }
+                    appendToOutput (in, buf);
                     buf.flip();
                     buf.limit(buf.limit() - matchCount);
                     out.write(buf.getString(decoder));
@@ -238,9 +230,17 @@
 
         // Put remainder to buf.
         in.position(oldPos);
-        buf.put(in);
+        appendToOutput (in, buf);
 
         return matchCount;
+    }
+
+    private void appendToOutput (ByteBuffer in, ByteBuffer buf) {
+      buf.put(in);
+      if (buf.position() > maxLineLength) {
+          throw new BufferDataException("Line is too long: "
+                  + buf.position());
+      }
     }
 
     private class Context {


Reply via email to