You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by th...@apache.org on 2012/04/10 12:01:13 UTC

svn commit: r1311661 - in /jackrabbit/oak/trunk/oak-mk/src: main/java/org/apache/jackrabbit/mk/util/IOUtils.java test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java

Author: thomasm
Date: Tue Apr 10 10:01:12 2012
New Revision: 1311661

URL: http://svn.apache.org/viewvc?rev=1311661&view=rev
Log:
OAK-54 IOUtils.readVarInt and readVarLong can result in an endless loop on EOF

Modified:
    jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java
    jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java

Modified: jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java?rev=1311661&r1=1311660&r2=1311661&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/main/java/org/apache/jackrabbit/mk/util/IOUtils.java Tue Apr 10 10:01:12 2012
@@ -108,7 +108,7 @@ public class IOUtils {
     }
 
     /**
-     * Read a byte array. This will first read the length as 4 bytes, and then 
+     * Read a byte array. This will first read the length as 4 bytes, and then
      * the actual bytes.
      *
      * @param in the data input stream
@@ -154,7 +154,11 @@ public class IOUtils {
         }
         x &= 0x7f;
         for (int s = 7;; s += 7) {
-            int b = (byte) in.read();
+            int b = in.read();
+            if (b < 0) {
+                throw new EOFException();
+            }
+            b = (byte) b;
             x |= (b & 0x7f) << s;
             if (b >= 0) {
                 return x;
@@ -237,7 +241,11 @@ public class IOUtils {
         }
         x &= 0x7f;
         for (int s = 7;; s += 7) {
-            long b = (byte) in.read();
+            long b = in.read();
+            if (b < 0) {
+                throw new EOFException();
+            }
+            b = (byte) b;
             x |= (b & 0x7f) << s;
             if (b >= 0) {
                 return x;

Modified: jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java?rev=1311661&r1=1311660&r2=1311661&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java (original)
+++ jackrabbit/oak/trunk/oak-mk/src/test/java/org/apache/jackrabbit/mk/util/IOUtilsTest.java Tue Apr 10 10:01:12 2012
@@ -197,6 +197,20 @@ public class IOUtilsTest extends TestCas
         assertEquals(-1, in.read());
     }
 
+    public void testVarEOF() throws IOException {
+        try {
+            IOUtils.readVarInt(new ByteArrayInputStream(new byte[0]));
+            fail();
+        } catch (EOFException e) {
+            // expected
+        }
+        try {
+            IOUtils.readVarLong(new ByteArrayInputStream(new byte[0]));
+            fail();
+        } catch (EOFException e) {
+            // expected
+        }
+    }
 
     private void testVarInt(int x, int expectedLen) throws IOException {
         ByteArrayOutputStream out = new ByteArrayOutputStream();