You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mina.apache.org by tr...@apache.org on 2008/03/12 07:51:34 UTC

svn commit: r636220 - in /mina: branches/1.0/core/src/main/java/org/apache/mina/filter/codec/textline/ branches/1.1/core/src/main/java/org/apache/mina/filter/codec/textline/ trunk/core/src/main/java/org/apache/mina/filter/codec/textline/ trunk/core/src...

Author: trustin
Date: Tue Mar 11 23:51:31 2008
New Revision: 636220

URL: http://svn.apache.org/viewvc?rev=636220&view=rev
Log:
Fixed issue: DIRMINA-536 - TextLineDecoder throws an IndexOutOfBoundsException
* Added an if block that checks the case that matchCount is greater than the current buffer position


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
    mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.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=636220&r1=636219&r2=636220&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 Tue Mar 11 23:51:31 2008
@@ -254,9 +254,14 @@
                     matchCount = 0;
                 }
             } else {
-                // fix for DIRMINA-506
-                in.position(in.position()-matchCount);
-                matchCount = 0;
+                // fix for DIRMINA-506 & DIRMINA-536
+                if (in.position() >= matchCount) {
+                    in.position(in.position() - matchCount);
+                    matchCount = 0;
+                } else {
+                    matchCount -= in.position();
+                    in.position(0);
+                }
             }
         }
 

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=636220&r1=636219&r2=636220&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 Tue Mar 11 23:51:31 2008
@@ -252,9 +252,14 @@
                     matchCount = 0;
                 }
             } else {
-		// fix for DIRMINA-506
-		in.position(in.position()-matchCount);
-                matchCount = 0;
+                // fix for DIRMINA-506 & DIRMINA-536
+                if (in.position() >= matchCount) {
+                    in.position(in.position() - matchCount);
+                    matchCount = 0;
+                } else {
+                    matchCount -= in.position();
+                    in.position(0);
+                }
             }
         }
 

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=636220&r1=636219&r2=636220&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 Tue Mar 11 23:51:31 2008
@@ -277,9 +277,14 @@
                     matchCount = 0;
                 }
             } else {
-                // fix for DIRMINA-506
-                in.position(in.position()-matchCount);
-                matchCount = 0;
+                // fix for DIRMINA-506 & DIRMINA-536
+                if (in.position() >= matchCount) {
+                    in.position(in.position() - matchCount);
+                    matchCount = 0;
+                } else {
+                    matchCount -= in.position();
+                    in.position(0);
+                }
             }
         }
 

Modified: mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java
URL: http://svn.apache.org/viewvc/mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java?rev=636220&r1=636219&r2=636220&view=diff
==============================================================================
--- mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java (original)
+++ mina/trunk/core/src/test/java/org/apache/mina/filter/codec/textline/TextLineDecoderTest.java Tue Mar 11 23:51:31 2008
@@ -316,4 +316,21 @@
         // Memory consumption should be minimal.
         Assert.assertTrue(Runtime.getRuntime().freeMemory() - oldFreeMemory < 1048576);
     }
+    
+    public void testSMTPDataBounds() throws Exception {
+        TextLineDecoder decoder = new TextLineDecoder(Charset.forName("ISO-8859-1"),
+                new LineDelimiter("\r\n.\r\n"));
+
+        CharsetEncoder encoder = Charset.forName("ISO-8859-1").newEncoder();
+        ProtocolCodecSession session = new ProtocolCodecSession();
+        IoBuffer in = IoBuffer.allocate(16).setAutoExpand(true);
+
+        in.putString("\r\n", encoder).flip().mark();
+        decoder.decode(session, in.reset().mark(), session.getDecoderOutput());
+        Assert.assertEquals(0, session.getDecoderOutputQueue().size());
+        in.putString("Body\r\n.\r\n", encoder).flip().mark();
+        decoder.decode(session, in.reset().mark(), session.getDecoderOutput());
+        Assert.assertEquals(1, session.getDecoderOutputQueue().size());
+        Assert.assertEquals("\r\n\r\nBody", session.getDecoderOutputQueue().poll());
+    }
 }