# HG changeset patch # User lello # Date 1596742420 -7200 # Thu Aug 06 21:33:40 2020 +0200 # Node ID ac2819c6e8d3528bd138e4be5f5014febc254ff3 # 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 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,69 @@ */ /* @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); + throw new RuntimeException("Test testNegativeOffset() failed"); + } catch (IndexOutOfBoundsException ignore) { + } + } + + 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); + throw new RuntimeException("Test testNegativeLength() failed"); + } catch (IndexOutOfBoundsException ignore) { + } + } - 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); + throw new RuntimeException("Test testBigOffsetLength1() failed"); + } catch (IndexOutOfBoundsException ignore) { } } + + 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); + throw new RuntimeException("Test testBigOffsetLength2() failed"); + } catch (IndexOutOfBoundsException ignore) { + } + } + + public static final void main(String[] args) throws Exception { + testNegativeOffset(); + testNegativeLength(); + testBigOffsetLength1(); + testBigOffsetLength2(); + } + }