You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/07/24 06:54:19 UTC

svn commit: r424902 - in /incubator/harmony/enhanced/classlib/trunk/modules/luni/src: main/java/java/io/BufferedReader.java test/java/tests/api/java/io/BufferedReaderTest.java

Author: pyang
Date: Sun Jul 23 21:54:19 2006
New Revision: 424902

URL: http://svn.apache.org/viewvc?rev=424902&view=rev
Log:
Fix for HARMONY-831 ([classlib][io] compatibility: method BufferedReader().read(new char[] {}, 7, 0) return 0 while RI throws IndexOutOfBoundsException)

Modified:
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/BufferedReader.java
    incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/BufferedReaderTest.java

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/BufferedReader.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/BufferedReader.java?rev=424902&r1=424901&r2=424902&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/BufferedReader.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/BufferedReader.java Sun Jul 23 21:54:19 2006
@@ -238,55 +238,50 @@
 			if (isOpen()) {
 				// check for null
 				int bufLen = buffer.length;
+                if(offset < 0 || length < 0 || (long)offset + (long)length > bufLen){
+                    throw new ArrayIndexOutOfBoundsException();
+                }
 				if (length == 0)
-					return 0;
-				// avoid int overflow
-				if (0 <= offset && offset <= bufLen && 0 < length
-						&& length <= bufLen - offset) {
-					int required;
-					if (pos < count) {
-						/* There are bytes available in the buffer. */
-						int copylength = count - pos >= length ? length : count
-								- pos;
-						System.arraycopy(buf, pos, buffer, offset, copylength);
-						pos += copylength;
-						if (copylength == length || !in.ready())
-							return copylength;
-						offset += copylength;
-						required = length - copylength;
-					} else
-						required = length;
+                    return 0;
+                int required;
+                if (pos < count) {
+                    /* There are bytes available in the buffer. */
+                    int copylength = count - pos >= length ? length : count
+                            - pos;
+                    System.arraycopy(buf, pos, buffer, offset, copylength);
+                    pos += copylength;
+                    if (copylength == length || !in.ready())
+                        return copylength;
+                    offset += copylength;
+                    required = length - copylength;
+                } else
+                    required = length;
 
-					while (true) {
-						int read;
-						/*
-						 * If we're not marked and the required size is greater
-						 * than the buffer, simply read the bytes directly
-						 * bypassing the buffer.
-						 */
-						if (markpos == -1 && required >= buf.length) {
-							read = in.read(buffer, offset, required);
-							if (read == -1)
-								return required == length ? -1 : length
-										- required;
-						} else {
-							if (fillbuf() == -1)
-								return required == length ? -1 : length
-										- required;
-							read = count - pos >= required ? required : count
-									- pos;
-							System.arraycopy(buf, pos, buffer, offset, read);
-							pos += read;
-						}
-						required -= read;
-						if (required == 0)
-							return length;
-						if (!in.ready())
-							return length - required;
-						offset += read;
-					}
-				}
-				throw new ArrayIndexOutOfBoundsException();
+                while (true) {
+                    int read;
+                    /*
+                     * If we're not marked and the required size is greater than
+                     * the buffer, simply read the bytes directly bypassing the
+                     * buffer.
+                     */
+                    if (markpos == -1 && required >= buf.length) {
+                        read = in.read(buffer, offset, required);
+                        if (read == -1)
+                            return required == length ? -1 : length - required;
+                    } else {
+                        if (fillbuf() == -1)
+                            return required == length ? -1 : length - required;
+                        read = count - pos >= required ? required : count - pos;
+                        System.arraycopy(buf, pos, buffer, offset, read);
+                        pos += read;
+                    }
+                    required -= read;
+                    if (required == 0)
+                        return length;
+                    if (!in.ready())
+                        return length - required;
+                    offset += read;
+                }
 			}
 			throw new IOException(org.apache.harmony.luni.util.Msg.getString("K005b")); //$NON-NLS-1$
 		}

Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/BufferedReaderTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/BufferedReaderTest.java?rev=424902&r1=424901&r2=424902&view=diff
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/BufferedReaderTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/BufferedReaderTest.java Sun Jul 23 21:54:19 2006
@@ -1,4 +1,4 @@
-/* Copyright 1998, 2005 The Apache Software Foundation or its licensors, as applicable
+/* Copyright 1998, 2006 The Apache Software Foundation or its licensors, as applicable
  * 
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.PipedReader;
 import java.io.Reader;
 
 import tests.support.Support_StringReader;
@@ -166,7 +167,7 @@
 	/**
 	 * @tests java.io.BufferedReader#read(char[], int, int)
 	 */
-	public void test_read$CII() {
+	public void test_read$CII() throws Exception{
 		char[] ca = new char[2];
 		BufferedReader toRet = new BufferedReader(new InputStreamReader(
 				new ByteArrayInputStream(new byte[0])));
@@ -258,6 +259,13 @@
 		} catch (IOException e) {
 			fail("Unexpected: " + e);
 		}
+        
+        //regression for HARMONY-831
+        try{
+            new BufferedReader(new PipedReader(), 9).read(new char[] {}, 7, 0);
+            fail("should throw IndexOutOfBoundsException");
+        }catch(IndexOutOfBoundsException e){
+        }
 	}
 
 	/**