This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch: java.io Reader subclass bug fixes


I'm checking this in.

This fixes all java.io Reader subclasses to correctly throw
IOException if an operation is performed after the stream is closed.

I decided to go with the "fast" implementation of FilterReader.  This
version doesn't clear `in'.

2001-02-13  Tom Tromey  <tromey@redhat.com>

	* java/io/PipedReader.java (ready): Throw IOException if pipe
	closed.
	* java/io/FilterReader.java (close): Don't clear `in'.
	* java/io/CharArrayReader.java (mark): Throw IOException if stream
	closed.
	(read, ready, reset, skip): Added exception message.
	* java/io/BufferedReader.java (mark, reset, ready, read, skip):
	Perform checkStatus check inside synchronized block.

Tom

Index: java/io/BufferedReader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/BufferedReader.java,v
retrieving revision 1.5
diff -u -r1.5 BufferedReader.java
--- BufferedReader.java	2000/11/28 04:50:51	1.5
+++ BufferedReader.java	2001/02/13 18:51:49
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999, 2000  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2000, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -128,9 +128,9 @@
     */
   public void mark(int readLimit) throws IOException
   {
-    checkStatus();
     synchronized (lock)
       {
+	checkStatus();
 	// In this method we need to be aware of the special case where
 	// pos + 1 == limit.  This indicates that a '\r' was the last char
 	// in the buffer during a readLine.  We'll want to maintain that
@@ -185,9 +185,9 @@
     */
   public void reset() throws IOException
   {
-    checkStatus();
     synchronized (lock)
       {
+	checkStatus();
 	if (markPos < 0)
 	  throw new IOException("mark never set or invalidated");
 
@@ -215,9 +215,9 @@
     */
   public boolean ready() throws IOException
   {
-    checkStatus();
     synchronized (lock)
       {
+	checkStatus();
 	return pos < limit || in.ready();
       }
   }
@@ -242,9 +242,9 @@
     */
   public int read(char[] buf, int offset, int count) throws IOException
   {
-    checkStatus();
     synchronized (lock)
       {
+	checkStatus();
 	// Once again, we need to handle the special case of a readLine
 	// that has a '\r' at the end of the buffer.  In this case, we'll
 	// need to skip a '\n' if it is the next char to be read.
@@ -329,9 +329,9 @@
   
   public int read() throws IOException
   {
-    checkStatus();
     synchronized (lock)
       {
+	checkStatus();
 	if (pos >= limit && fill () <= 0)
 	  return -1;
 	return buffer[pos++];
@@ -444,11 +444,11 @@
     */
   public long skip(long count) throws IOException
   {
-    checkStatus();
-    if (count <= 0)
-      return 0;
     synchronized (lock)
       {
+	checkStatus();
+	if (count <= 0)
+	  return 0;
 	// Yet again, we need to handle the special case of a readLine
 	// that has a '\r' at the end of the buffer.  In this case, we need
 	// to ignore a '\n' if it is the next char to be read.
Index: java/io/CharArrayReader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/CharArrayReader.java,v
retrieving revision 1.3
diff -u -r1.3 CharArrayReader.java
--- CharArrayReader.java	2000/03/07 19:55:26	1.3
+++ CharArrayReader.java	2001/02/13 18:51:49
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -63,10 +63,12 @@
     }
   }
 
-  public void mark(int readAheadLimit)
+  public void mark(int readAheadLimit) throws IOException
   {
     synchronized (lock)
     {
+      if (buf == null)
+	throw new IOException("Stream closed");
       // readAheadLimit is ignored per Java Class Lib. book, p. 318.
       markedPos = pos;
     }
@@ -82,7 +84,7 @@
     synchronized (lock)
     {
       if (buf == null)
-        throw new IOException();
+	throw new IOException("Stream closed");
 
       if (pos < 0)
         throw new ArrayIndexOutOfBoundsException(pos);
@@ -98,7 +100,7 @@
     synchronized (lock)
     {
       if (buf == null)
-        throw new IOException();
+	throw new IOException("Stream closed");
 
       /* Don't need to check pos value, arraycopy will check it. */
       if (off < 0 || len < 0 || off + len > b.length)
@@ -117,7 +119,7 @@
   public boolean ready() throws IOException
   {
     if (buf == null)
-      throw new IOException();
+      throw new IOException("Stream closed");
 
     return true;
   }
@@ -127,7 +129,7 @@
     synchronized (lock)
     {
       if (buf == null)
-        throw new IOException();
+	throw new IOException("Stream closed");
 
       pos = markedPos;
     }
@@ -138,7 +140,7 @@
     synchronized (lock)
     {
       if (buf == null)
-        throw new IOException();
+	throw new IOException("Stream closed");
 
       // Even though the var numChars is a long, in reality it can never
       // be larger than an int since the result of subtracting 2 positive
Index: java/io/FilterReader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/FilterReader.java,v
retrieving revision 1.3
diff -u -r1.3 FilterReader.java
--- FilterReader.java	2000/03/07 19:55:26	1.3
+++ FilterReader.java	2001/02/13 18:51:49
@@ -1,4 +1,4 @@
-/* Copyright (C) 1998, 1999  Free Software Foundation
+/* Copyright (C) 1998, 1999, 2001  Free Software Foundation
 
    This file is part of libgcj.
 
@@ -31,8 +31,11 @@
 
   public void close() throws IOException
   {
+    // We used to set `in = null' here.  We don't, though, because
+    // that is the simplest way to ensure that read-after-close will
+    // throw the appropriate exception -- we rely on the filtered
+    // stream to do it.
     in.close();
-    in = null;
   }
 
   public synchronized void mark(int readlimit) throws IOException
Index: java/io/PipedReader.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/PipedReader.java,v
retrieving revision 1.8
diff -u -r1.8 PipedReader.java
--- PipedReader.java	2001/01/06 23:28:40	1.8
+++ PipedReader.java	2001/02/13 18:51:50
@@ -312,10 +312,15 @@
   public boolean ready() throws IOException
   {
     // The JDK 1.3 implementation does not appear to check for the closed or 
-    // unconnected stream conditions here.
+    // unconnected stream conditions here.  However, checking for a
+    // closed stream is explicitly required by the JDK 1.2 and 1.3
+    // documentation (for Reader.close()), so we do it.
     
     synchronized (lock)
     {
+      if (closed)
+	throw new IOException("Pipe closed");
+
       if (in < 0)
 	return false;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]