Return-Path: Delivered-To: apmail-db-derby-commits-archive@www.apache.org Received: (qmail 50831 invoked from network); 1 Jul 2008 08:54:24 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 1 Jul 2008 08:54:24 -0000 Received: (qmail 16897 invoked by uid 500); 1 Jul 2008 08:54:25 -0000 Delivered-To: apmail-db-derby-commits-archive@db.apache.org Received: (qmail 16883 invoked by uid 500); 1 Jul 2008 08:54:25 -0000 Mailing-List: contact derby-commits-help@db.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "Derby Development" List-Id: Delivered-To: mailing list derby-commits@db.apache.org Received: (qmail 16874 invoked by uid 99); 1 Jul 2008 08:54:25 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Jul 2008 01:54:25 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 01 Jul 2008 08:53:42 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 5B07923889C1; Tue, 1 Jul 2008 01:54:03 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit 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 -0000 To: derby-commits@db.apache.org From: kahatlen@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080701085403.5B07923889C1@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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());