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());
+    }
 }


Reply via email to