You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2011/05/03 13:28:02 UTC
svn commit: r1099013 - in /james/server/trunk/pop3server/src:
main/java/org/apache/james/pop3server/core/
test/java/org/apache/james/pop3server/
Author: norman
Date: Tue May 3 11:28:01 2011
New Revision: 1099013
URL: http://svn.apache.org/viewvc?rev=1099013&view=rev
Log:
CRLFTerminatedInputStream did not respect the buffer offset in all case which could block the RETRCmdHandler forever. See JAMES-1222
Added:
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractInputStreamTest.java
Modified:
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/CRLFTerminatedInputStream.java
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/CRLFTerminatedInputStreamTest.java
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java
Modified: james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/CRLFTerminatedInputStream.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/CRLFTerminatedInputStream.java?rev=1099013&r1=1099012&r2=1099013&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/CRLFTerminatedInputStream.java (original)
+++ james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/CRLFTerminatedInputStream.java Tue May 3 11:28:01 2011
@@ -53,7 +53,9 @@ public class CRLFTerminatedInputStream e
return fillArray(b, off, len);
} else {
- last = b[r - 1];
+ // Make sure we respect the offset. Otherwise it could let the RETRCmdHandler
+ // hang forever. See JAMES-1222
+ last = b[off + r - 1];
return r;
}
} else {
Added: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractInputStreamTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractInputStreamTest.java?rev=1099013&view=auto
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractInputStreamTest.java (added)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/AbstractInputStreamTest.java Tue May 3 11:28:01 2011
@@ -0,0 +1,41 @@
+package org.apache.james.pop3server;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import junit.framework.TestCase;
+
+
+public abstract class AbstractInputStreamTest extends TestCase{
+
+ protected void checkRead(InputStream in, String expected) throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ int i = -1;
+ while ((i = in.read()) != -1) {
+ out.write(i);
+ }
+ in.close();
+ out.close();
+ assertEquals(expected, new String(out.toByteArray()));
+
+
+
+ }
+
+ protected void checkReadViaArray(InputStream in, String expected) throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ byte[] buf = new byte[3];
+ int i = 0;
+ while ((i = in.read(buf)) != -1) {
+ out.write(buf, 0, i);
+ }
+
+
+ in.close();
+ out.close();
+ assertEquals(expected, new String(out.toByteArray()));
+
+
+ }
+}
Modified: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/CRLFTerminatedInputStreamTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/CRLFTerminatedInputStreamTest.java?rev=1099013&r1=1099012&r2=1099013&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/CRLFTerminatedInputStreamTest.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/CRLFTerminatedInputStreamTest.java Tue May 3 11:28:01 2011
@@ -20,68 +20,32 @@
package org.apache.james.pop3server;
import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.james.pop3server.core.CRLFTerminatedInputStream;
-import junit.framework.TestCase;
-
-public class CRLFTerminatedInputStreamTest extends TestCase {
+public class CRLFTerminatedInputStreamTest extends AbstractInputStreamTest {
public void testCRLFPresent() throws IOException {
String data = "Subject: test\r\n\r\ndata\r\n";
- check(data, data);
- checkWithArray(data, data);
+ checkRead(new CRLFTerminatedInputStream(new ByteArrayInputStream(data.getBytes())), data);
+ checkReadViaArray(new CRLFTerminatedInputStream(new ByteArrayInputStream(data.getBytes())), data);
}
public void testCRPresent() throws IOException {
String data = "Subject: test\r\n\r\ndata\r";
String expected = data + "\n";
- check(data, expected);
- checkWithArray(data, expected);
+ checkRead(new CRLFTerminatedInputStream(new ByteArrayInputStream(data.getBytes())), expected);
+ checkReadViaArray(new CRLFTerminatedInputStream(new ByteArrayInputStream(data.getBytes())), expected);
}
public void testNonPresent() throws IOException {
String data = "Subject: test\r\n\r\ndata";
String expected = data + "\r\n";
- check(data, expected);
- checkWithArray(data, expected);
-
- }
-
- private void check(String source, String expected) throws IOException {
- CRLFTerminatedInputStream in = new CRLFTerminatedInputStream(new ByteArrayInputStream(source.getBytes()));
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- int i = -1;
- while ((i = in.read()) != -1) {
- out.write(i);
- }
- in.close();
- out.close();
+ checkRead(new CRLFTerminatedInputStream(new ByteArrayInputStream(data.getBytes())), expected);
+ checkReadViaArray(new CRLFTerminatedInputStream(new ByteArrayInputStream(data.getBytes())), expected);
- String output = new String(out.toByteArray());
- assertEquals(expected, output);
}
- private void checkWithArray(String source, String expected) throws IOException {
- CRLFTerminatedInputStream in = new CRLFTerminatedInputStream(new ByteArrayInputStream(source.getBytes()));
-
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- byte[] buf = new byte[1024];
- int i = 0;
- while ((i = in.read(buf)) != -1) {
- out.write(buf, 0, i);
- }
-
- in.close();
- out.close();
-
- String output = new String(out.toByteArray());
- assertEquals(expected, output);
- }
}
Modified: james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java?rev=1099013&r1=1099012&r2=1099013&view=diff
==============================================================================
--- james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java (original)
+++ james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java Tue May 3 11:28:01 2011
@@ -20,79 +20,59 @@
package org.apache.james.pop3server;
import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import org.apache.james.pop3server.core.ExtraDotInputStream;
-import junit.framework.TestCase;
-
-public class ExtraDotInputStreamTest extends TestCase {
+public class ExtraDotInputStreamTest extends AbstractInputStreamTest {
public void testExtraDot() throws IOException {
String data = "This\r\n.\r\nThis.\r\n";
String expectedOutput = "This\r\n..\r\nThis.\r\n";
- ExtraDotInputStream in = new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes()));
- ByteArrayOutputStream out = new ByteArrayOutputStream();
+
+ checkRead(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), expectedOutput);
+ checkReadViaArray(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), expectedOutput);
- int i = -1;
- while ((i = in.read()) != -1) {
- out.write(i);
- }
- in.close();
- out.close();
+ }
- String output = new String(out.toByteArray());
- assertEquals(expectedOutput, output);
+ public void testNoExtraDotOnDoubleDot() throws IOException {
+ String data = "This\r\n..\r\nThis.\r\n";
+
+ checkRead(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
+ checkReadViaArray(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
}
+
+
+ public void testNoExtraDotOnDotWithText() throws IOException {
+ String data = "This\r\n.TestText\r\nThis.\r\n";
+
+ checkRead(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
+ checkReadViaArray(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
+ }
+
public void testNoDotCLRF() throws IOException {
String data = "ABCD\r\n";
- ExtraDotInputStream in = new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes()));
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- int i = -1;
- while ((i = in.read()) != -1) {
- out.write(i);
- }
- in.close();
- out.close();
-
- String output = new String(out.toByteArray());
- assertEquals(data, output);
+ checkRead(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
+ checkReadViaArray(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
}
public void testNoDot() throws IOException {
String data = "ABCD";
- ExtraDotInputStream in = new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes()));
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- int i = -1;
- while ((i = in.read()) != -1) {
- out.write(i);
- }
- in.close();
- out.close();
-
- String output = new String(out.toByteArray());
- assertEquals(data, output);
+ checkRead(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
+ checkReadViaArray(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
}
// Proof of BUG JAMES-1152
public void testNoDotHeaderBody() throws IOException {
String data = "Subject: test\r\n\r\nABCD\r\n";
- ExtraDotInputStream in = new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes()));
- ByteArrayOutputStream out = new ByteArrayOutputStream();
-
- int i = -1;
- while ((i = in.read()) != -1) {
- out.write(i);
- }
- in.close();
- out.close();
+ checkRead(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
+ checkReadViaArray(new ExtraDotInputStream(new ByteArrayInputStream(data.getBytes())), data);
- String output = new String(out.toByteArray());
- assertEquals(data, output);
}
+
+
+
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org