Hi,

here's the newest patch.

> Also, instead of using the boolean “caughtException,” we usually just
> put, e.g., the throwing of the RuntimeException on the line after where
> the IIOBE or whatever would be thrown. I don’t think the “finally” block
> is necessary.
>
> Thanks,
>
> Brian


Greetings
Raffaello

----

# HG changeset patch
# User lello
# Date 1596738630 -7200
#      Thu Aug 06 20:30:30 2020 +0200
# Node ID ad676c9dcb57c8cfa141a22cf5ee85e0fe363336
# Parent  b01985b4f88f554f97901e53e1ba314681dd9c19
Patch to fix JDK-8245036
8245036: DataInputStream.readFully(byte[], int, int) does not throw expected IndexOutOfBoundsExceptions
Reviewed-by: TBD
Contributed-by: Raffaello Giulietti <raffaello.giulie...@gmail.com>

diff --git a/src/java.base/share/classes/java/io/DataInputStream.java b/src/java.base/share/classes/java/io/DataInputStream.java
--- a/src/java.base/share/classes/java/io/DataInputStream.java
+++ b/src/java.base/share/classes/java/io/DataInputStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,8 @@

 package java.io;

+import java.util.Objects;
+
 /**
  * A data input stream lets an application read primitive Java data
  * types from an underlying input stream in a machine-independent
@@ -192,8 +194,7 @@
      * @see        java.io.FilterInputStream#in
      */
public final void readFully(byte b[], int off, int len) throws IOException {
-        if (len < 0)
-            throw new IndexOutOfBoundsException();
+        Objects.checkFromIndexSize(off, len, b.length);
         int n = 0;
         while (n < len) {
             int count = in.read(b, off + n, len - n);
diff --git a/test/jdk/java/io/DataInputStream/ReadFully.java b/test/jdk/java/io/DataInputStream/ReadFully.java
--- a/test/jdk/java/io/DataInputStream/ReadFully.java
+++ b/test/jdk/java/io/DataInputStream/ReadFully.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,30 +22,73 @@
  */

 /* @test
- * @bug 4214513
- * @summary Passing a negative length argument for readFully must throw
- *          IndexOutOfBoundsException.
+ * @bug 4214513 8245036
+ * @summary Passing a negative offset or length,
+ *          or passing a combination of offset and length too big
+ *          for readFully must throw IndexOutOfBoundsException.
  */

+import java.io.*;

-import java.io.*;
 public class ReadFully {
-    public static final void main(String[] args) throws Exception {
-        byte[] buffer = new byte[100];
+
+    private static final void testNegativeOffset() throws Exception {
+        File file = new File(System.getProperty("test.src"),
+                "ReadFully.java");
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, -1, buffer.length);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
+        }
+        throw new RuntimeException("Test testNegativeOffset() failed");
+    }
+
+    private static final void testNegativeLength() throws Exception {
         File file = new File(System.getProperty("test.src"),
                 "ReadFully.java");
-        FileInputStream in = new FileInputStream(file);
-        DataInputStream dis = new DataInputStream(in);
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, 0, -1);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
+        }
+        throw new RuntimeException("Test testNegativeLength() failed");
+    }

-        boolean caughtException = false;
-        try {
-            dis.readFully(buffer, 0, -20);
-        } catch (IndexOutOfBoundsException ie) {
-            caughtException = true;
-        } finally {
-            dis.close();
-            if (!caughtException)
-                throw new RuntimeException("Test failed");
+    private static final void testBigOffsetLength1() throws Exception {
+        File file = new File(System.getProperty("test.src"),
+                "ReadFully.java");
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, 0, buffer.length + 1);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
         }
+        throw new RuntimeException("Test testBigOffsetLength1() failed");
     }
+
+    private static final void testBigOffsetLength2() throws Exception {
+        File file = new File(System.getProperty("test.src"),
+                "ReadFully.java");
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, buffer.length, 1);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
+        }
+        throw new RuntimeException("Test testBigOffsetLength2() failed");
+    }
+
+    public static final void main(String[] args) throws Exception {
+        testNegativeOffset();
+        testNegativeLength();
+        testBigOffsetLength1();
+        testBigOffsetLength2();
+    }
+
 }
# HG changeset patch
# User lello
# Date 1596738630 -7200
#      Thu Aug 06 20:30:30 2020 +0200
# Node ID ad676c9dcb57c8cfa141a22cf5ee85e0fe363336
# Parent  b01985b4f88f554f97901e53e1ba314681dd9c19
Patch to fix JDK-8245036
8245036: DataInputStream.readFully(byte[], int, int) does not throw expected IndexOutOfBoundsExceptions
Reviewed-by: TBD
Contributed-by: Raffaello Giulietti <raffaello.giulie...@gmail.com>

diff --git a/src/java.base/share/classes/java/io/DataInputStream.java b/src/java.base/share/classes/java/io/DataInputStream.java
--- a/src/java.base/share/classes/java/io/DataInputStream.java
+++ b/src/java.base/share/classes/java/io/DataInputStream.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1994, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1994, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -25,6 +25,8 @@
 
 package java.io;
 
+import java.util.Objects;
+
 /**
  * A data input stream lets an application read primitive Java data
  * types from an underlying input stream in a machine-independent
@@ -192,8 +194,7 @@
      * @see        java.io.FilterInputStream#in
      */
     public final void readFully(byte b[], int off, int len) throws IOException {
-        if (len < 0)
-            throw new IndexOutOfBoundsException();
+        Objects.checkFromIndexSize(off, len, b.length);
         int n = 0;
         while (n < len) {
             int count = in.read(b, off + n, len - n);
diff --git a/test/jdk/java/io/DataInputStream/ReadFully.java b/test/jdk/java/io/DataInputStream/ReadFully.java
--- a/test/jdk/java/io/DataInputStream/ReadFully.java
+++ b/test/jdk/java/io/DataInputStream/ReadFully.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -22,30 +22,73 @@
  */
 
 /* @test
- * @bug 4214513
- * @summary Passing a negative length argument for readFully must throw
- *          IndexOutOfBoundsException.
+ * @bug 4214513 8245036
+ * @summary Passing a negative offset or length,
+ *          or passing a combination of offset and length too big
+ *          for readFully must throw IndexOutOfBoundsException.
  */
 
+import java.io.*;
 
-import java.io.*;
 public class ReadFully {
-    public static final void main(String[] args) throws Exception {
-        byte[] buffer = new byte[100];
+
+    private static final void testNegativeOffset() throws Exception {
+        File file = new File(System.getProperty("test.src"),
+                "ReadFully.java");
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, -1, buffer.length);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
+        }
+        throw new RuntimeException("Test testNegativeOffset() failed");
+    }
+
+    private static final void testNegativeLength() throws Exception {
         File file = new File(System.getProperty("test.src"),
                 "ReadFully.java");
-        FileInputStream in = new FileInputStream(file);
-        DataInputStream dis = new DataInputStream(in);
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, 0, -1);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
+        }
+        throw new RuntimeException("Test testNegativeLength() failed");
+    }
 
-        boolean caughtException = false;
-        try {
-            dis.readFully(buffer, 0, -20);
-        } catch (IndexOutOfBoundsException ie) {
-            caughtException = true;
-        } finally {
-            dis.close();
-            if (!caughtException)
-                throw new RuntimeException("Test failed");
+    private static final void testBigOffsetLength1() throws Exception {
+        File file = new File(System.getProperty("test.src"),
+                "ReadFully.java");
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, 0, buffer.length + 1);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
         }
+        throw new RuntimeException("Test testBigOffsetLength1() failed");
     }
+
+    private static final void testBigOffsetLength2() throws Exception {
+        File file = new File(System.getProperty("test.src"),
+                "ReadFully.java");
+        try (FileInputStream in = new FileInputStream(file);
+             DataInputStream dis = new DataInputStream(in);) {
+            byte[] buffer = new byte[100];
+            dis.readFully(buffer, buffer.length, 1);
+        } catch (IndexOutOfBoundsException ignored) {
+            return;
+        }
+        throw new RuntimeException("Test testBigOffsetLength2() failed");
+    }
+
+    public static final void main(String[] args) throws Exception {
+        testNegativeOffset();
+        testNegativeLength();
+        testBigOffsetLength1();
+        testBigOffsetLength2();
+    }
+
 }

Reply via email to