db-derby-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From kahat...@apache.org
Subject svn commit: r673026 - in /db/derby/code/trunk/java: engine/org/apache/derby/iapi/services/io/ArrayInputStream.java testing/org/apache/derbyTesting/unitTests/junit/ArrayInputStreamTest.java testing/org/apache/derbyTesting/unitTests/junit/_Suite.java
Date Tue, 01 Jul 2008 08:54:02 GMT
Author: kahatlen
Date: Tue Jul  1 01:54:02 2008
New Revision: 673026

URL: http://svn.apache.org/viewvc?rev=673026&view=rev
Log:
DERBY-3739: Skip and read methods in ArrayInputStream may overflow

Fixed problems with negative byte count and overflow in skip() and
skipBytes(), and added a unit test.

Added:
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/ArrayInputStreamTest.java
  (with props)
Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/ArrayInputStream.java
    db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/ArrayInputStream.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/ArrayInputStream.java?rev=673026&r1=673025&r2=673026&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/ArrayInputStream.java
(original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/services/io/ArrayInputStream.java
Tue Jul  1 01:54:02 2008
@@ -120,19 +120,24 @@
 		return len;
 	}
 
+    /**
+     * Skip as many bytes as possible, but no more than {@code count}.
+     *
+     * @param count the number of bytes to skip
+     * @return the number of bytes that were skipped
+     */
 	public long skip(long count)  throws IOException {
 
-		if ((position + count) > end) {
-
-			count = end - position;
-
-			if (count == 0)
-				return 0; // end of file
-		}
-
-		position += count;
+        // return 0 on non-positive count, per javadoc for
+        // InputStream.skip(long)
+        if (count <= 0) {
+            return 0;
+        }
 
-		return count;
+        // don't skip more bytes than we have available
+        long toSkip = Math.min(count, available());
+        position += toSkip;
+        return toSkip;
 
 	}
 
@@ -218,12 +223,14 @@
 		position += len;
 	}
 
+    /**
+     * Skip as many bytes as possible, but no more than {@code n}.
+     *
+     * @param n the number of bytes to skip
+     * @return the number of bytes that were skipped
+     */
     public final int skipBytes(int n) throws IOException {
-		if ((position + n) > end) {
-            n = end - position;
-		}
-		position += n;
-		return n;
+        return (int) skip(n);
     }
 
     public final boolean readBoolean() throws IOException {

Added: db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/ArrayInputStreamTest.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/ArrayInputStreamTest.java?rev=673026&view=auto
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/ArrayInputStreamTest.java
(added)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/ArrayInputStreamTest.java
Tue Jul  1 01:54:02 2008
@@ -0,0 +1,85 @@
+/*
+
+   Derby - Class org.apache.derbyTesting.unitTests.junit.ArrayInputStreamTest
+
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to you under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+
+ */
+
+package org.apache.derbyTesting.unitTests.junit;
+
+import java.io.IOException;
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.derby.iapi.services.io.ArrayInputStream;
+import org.apache.derbyTesting.junit.BaseTestCase;
+
+/**
+ * Unit tests for {@code org.apache.derby.iapi.services.io.ArrayInputStream}.
+ */
+public class ArrayInputStreamTest extends BaseTestCase {
+
+    public static Test suite() {
+        return new TestSuite(ArrayInputStreamTest.class);
+    }
+
+    public ArrayInputStreamTest(String name) {
+        super(name);
+    }
+
+    /**
+     * Test that we don't get an overflow when the argument to skip() is
+     * Long.MAX_VALUE (DERBY-3739).
+     */
+    public void testSkipLongMaxValue() throws IOException {
+        ArrayInputStream ais = new ArrayInputStream(new byte[1000]);
+        assertEquals(1000, ais.skip(Long.MAX_VALUE));
+        assertEquals(1000, ais.getPosition());
+        ais.setPosition(1);
+        assertEquals(999, ais.skip(Long.MAX_VALUE));
+        assertEquals(1000, ais.getPosition());
+    }
+
+    /**
+     * Test that we don't get an overflow when the argument to skipBytes() is
+     * Integer.MAX_VALUE (DERBY-3739).
+     */
+    public void testSkipBytesIntMaxValue() throws IOException {
+        ArrayInputStream ais = new ArrayInputStream(new byte[1000]);
+        assertEquals(1000, ais.skipBytes(Integer.MAX_VALUE));
+        assertEquals(1000, ais.getPosition());
+        ais.setPosition(1);
+        assertEquals(999, ais.skipBytes(Integer.MAX_VALUE));
+        assertEquals(1000, ais.getPosition());
+    }
+
+    /**
+     * Test that skip() returns 0 when the argument is negative (DERBY-3739).
+     */
+    public void testSkipNegative() throws IOException {
+        ArrayInputStream ais = new ArrayInputStream(new byte[1000]);
+        assertEquals(0, ais.skip(-1));
+    }
+
+    /**
+     * Test that skipBytes() returns 0 when the argument is negative
+     * (DERBY-3739).
+     */
+    public void testSkipBytesNegative() throws IOException {
+        ArrayInputStream ais = new ArrayInputStream(new byte[1000]);
+        assertEquals(0, ais.skipBytes(-1));
+    }
+}

Propchange: db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/ArrayInputStreamTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java?rev=673026&r1=673025&r2=673026&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/unitTests/junit/_Suite.java Tue
Jul  1 01:54:02 2008
@@ -46,6 +46,7 @@
 
         TestSuite suite = new TestSuite("JUnit unit tests");
 
+        suite.addTest(ArrayInputStreamTest.suite());
         suite.addTest(FormatableBitSetTest.suite());
         suite.addTest(SystemPrivilegesPermissionTest.suite());
         suite.addTest(UTF8UtilTest.suite());



Mime
View raw message