Author: kkolinko
Date: Sat Nov  8 02:07:14 2014
New Revision: 1637501

URL: http://svn.apache.org/r1637501
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=57173
Do not raise EOFException if filling the necessary count of bytes into buffer 
requires several iterations.
Do not update count if in.read() returned -1.

Modified:
    
tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/FastDataInputStream.java

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/FastDataInputStream.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/FastDataInputStream.java?rev=1637501&r1=1637500&r2=1637501&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/FastDataInputStream.java
 (original)
+++ 
tomcat/trunk/java/org/apache/tomcat/util/bcel/classfile/FastDataInputStream.java
 Sat Nov  8 02:07:14 2014
@@ -69,9 +69,7 @@ class FastDataInputStream extends Buffer
     @Override
     public boolean readBoolean() throws IOException {
         if (pos >= count) {
-            fillNew();
-            if (pos >= count)
-                throw new EOFException();
+            fillNew(1);
         }
         int ch = this.buf[pos++] & 0xff;
         return (ch != 0);
@@ -81,9 +79,7 @@ class FastDataInputStream extends Buffer
     @Override
     public final byte readByte() throws IOException {
         if (pos >= count) {
-            fillNew();
-            if (pos >= count)
-                throw new EOFException();
+            fillNew(1);
         }
         return this.buf[pos++];
     }
@@ -92,9 +88,7 @@ class FastDataInputStream extends Buffer
     @Override
     public int readUnsignedByte() throws IOException {
         if (pos >= count) {
-            fillNew();
-            if (pos >= count)
-                throw new EOFException();
+            fillNew(1);
         }
         int ch = this.buf[pos++] & 0xff;
         return ch;
@@ -104,8 +98,7 @@ class FastDataInputStream extends Buffer
     @Override
     public final short readShort() throws IOException {
         if(pos + 1 >= count){
-            fillNew();
-            if(pos + 1 >= count) throw new EOFException();
+            fillNew(2);
         }
         int ch1 = this.buf[pos++] & 0xff;
         int ch2 = this.buf[pos++] & 0xff;
@@ -116,8 +109,7 @@ class FastDataInputStream extends Buffer
     @Override
     public int readUnsignedShort() throws IOException{
         if(pos + 1 >= count) {
-            fillNew();
-            if(pos + 1 >= count) throw new EOFException();
+            fillNew(2);
         }
 
         int ch1 = this.buf[pos++] & 0xff;
@@ -129,8 +121,7 @@ class FastDataInputStream extends Buffer
     @Override
     public final char readChar() throws IOException {
         if(pos + 1 >= count) {
-            fillNew();
-            if(pos + 1 >= count) throw new EOFException();
+            fillNew(2);
         }
         int ch1 = this.buf[pos++] & 0xff;
         int ch2 = this.buf[pos++] & 0xff;
@@ -141,8 +132,7 @@ class FastDataInputStream extends Buffer
     @Override
     public final int readInt() throws IOException {
         if(pos + 3 >= count){
-            fillNew();
-            if(pos + 3 >= count) throw new EOFException();
+            fillNew(4);
         }
         int ch1 = this.buf[pos++] & 0xff;
         int ch2 = this.buf[pos++] & 0xff;
@@ -184,15 +174,26 @@ class FastDataInputStream extends Buffer
     }
 
 
-    private void fillNew() throws IOException {
-        int remain = 0;
-        if(pos < count){
-            remain = count - pos;
+    /*
+     * Read until there are at least minimumCount bytes in the buffer, or EOF
+     * is reached.
+     */
+    private void fillNew(int minimumCount) throws IOException {
+        if (pos < count) {
+            int remain = count - pos;
             System.arraycopy(buf, pos, buf, 0, remain);
+            count = remain;
+        } else {
+            count = 0;
         }
         pos = 0;
-        int n = this.in.read(buf, remain, buf.length - remain);
-        count = pos + n + remain;
+        do {
+            int n = in.read(buf, count, buf.length - count);
+            if (n < 0) {
+                throw new EOFException();
+            }
+            count += n;
+        } while (count < minimumCount);
     }
 
 
@@ -231,4 +232,17 @@ class FastDataInputStream extends Buffer
         // Unimplemented
         throw new UnsupportedOperationException();
     }
+
+
+    @Override
+    public synchronized void mark(int readlimit) {
+        // Mark operation is not supported, as fillNew() method does not update
+        // marker position when refilling the buffer.
+    }
+
+
+    @Override
+    public boolean markSupported() {
+        return false;
+    }
 }
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to