Reminder RFR: 8245036: DataInputStream.readFully(byte[], int, int) does not throw expected IndexOutOfBoundsExceptions
Raffaello Giulietti
raffaello.giulietti at gmail.com
Wed Aug 5 10:44:39 UTC 2020
Hi,
a gentle reminder to review this almost trivial patch.
Greetings
Raffaello
On 2020-07-29 19:44, Raffaello Giulietti wrote:
> Hi Tagir,
>
> here's yesterday's patch with added unit tests.
>
>
> Greetings
> Raffaello
>
>
>
> On 2020-07-29 05:26, Tagir Valeev wrote:
>> Hello!
>>
>> Having a unit-test would be nice!
>>
>> With best regards,
>> Tagir Valeev.
>>
>> On Tue, Jul 28, 2020 at 9:04 PM Raffaello Giulietti
>> <raffaello.giulietti at gmail.com> wrote:
>>>
>>> Hello,
>>>
>>> here's a very simple patch to address issue 8245036.
>>> HTH
>>>
>>>
>>> Greetings
>>> Raffaello
>
>
>
>
> ----
>
> # HG changeset patch
> # User lello
> # Date 1596043874 -7200
> # Wed Jul 29 19:31:14 2020 +0200
> # Node ID b9d417f53ddaae3801585b285f6eb8ba1606af8b
> # Parent 89fe9e02a522b57c356f0dd5279085a075c2945b
> Patch to fix JDK-8245036
> 8245036: DataInputStream.readFully(byte[], int, int) does not throw
> expected IndexOutOfBoundsExceptions
> Reviewed-by: TBD
> Contributed-by: Raffaello Giulietti <raffaello.giulietti at 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,15 +22,36 @@
> */
>
> /* @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 {
> +
> + private static final void testNegativeOffset() throws Exception {
> + byte[] buffer = new byte[100];
> + File file = new File(System.getProperty("test.src"),
> + "ReadFully.java");
> + FileInputStream in = new FileInputStream(file);
> + DataInputStream dis = new DataInputStream(in);
> +
> + boolean caughtException = false;
> + try {
> + dis.readFully(buffer, -1, buffer.length);
> + } catch (IndexOutOfBoundsException ie) {
> + caughtException = true;
> + } finally {
> + dis.close();
> + if (!caughtException)
> + throw new RuntimeException("Test testNegativeOffset()
> failed");
> + }
> + }
> +
> + private static final void testNegativeLength() throws Exception {
> byte[] buffer = new byte[100];
> File file = new File(System.getProperty("test.src"),
> "ReadFully.java");
> @@ -45,7 +66,53 @@
> } finally {
> dis.close();
> if (!caughtException)
> - throw new RuntimeException("Test failed");
> + throw new RuntimeException("Test testNegativeLength()
> failed");
> + }
> + }
> +
> + private static final void testBigOffsetLength1() throws Exception {
> + byte[] buffer = new byte[100];
> + File file = new File(System.getProperty("test.src"),
> + "ReadFully.java");
> + FileInputStream in = new FileInputStream(file);
> + DataInputStream dis = new DataInputStream(in);
> +
> + boolean caughtException = false;
> + try {
> + dis.readFully(buffer, 0, buffer.length + 1);
> + } catch (IndexOutOfBoundsException ie) {
> + caughtException = true;
> + } finally {
> + dis.close();
> + if (!caughtException)
> + throw new RuntimeException("Test testBigOffsetLength1()
> failed");
> }
> }
> +
> + private static final void testBigOffsetLength2() throws Exception {
> + byte[] buffer = new byte[100];
> + File file = new File(System.getProperty("test.src"),
> + "ReadFully.java");
> + FileInputStream in = new FileInputStream(file);
> + DataInputStream dis = new DataInputStream(in);
> +
> + boolean caughtException = false;
> + try {
> + dis.readFully(buffer, buffer.length, 1);
> + } catch (IndexOutOfBoundsException ie) {
> + caughtException = true;
> + } finally {
> + dis.close();
> + if (!caughtException)
> + throw new RuntimeException("Test testBigOffsetLength2()
> failed");
> + }
> + }
> +
> + public static final void main(String[] args) throws Exception {
> + testNegativeOffset();
> + testNegativeLength();
> + testBigOffsetLength1();
> + testBigOffsetLength2();
> + }
> +
> }
>
More information about the core-libs-dev
mailing list