--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java Mon Aug 18 14:03:21 2014 +0100
+++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/RIFFReader.java Tue Aug 19 10:32:16 2014 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2007, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, 2014, 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
@@ -39,21 +39,20 @@
private long filepointer = 0;
private final String fourcc;
private String riff_type = null;
- private long ckSize = 0;
+ private long ckSize = Integer.MAX_VALUE;
private InputStream stream;
- private long avail;
+ private long avail = Integer.MAX_VALUE;
private RIFFReader lastiterator = null;
public RIFFReader(InputStream stream) throws IOException {
- if (stream instanceof RIFFReader)
- root = ((RIFFReader)stream).root;
- else
+ if (stream instanceof RIFFReader) {
+ root = ((RIFFReader) stream).root;
+ } else {
root = this;
+ }
this.stream = stream;
- avail = Integer.MAX_VALUE;
- ckSize = Integer.MAX_VALUE;
// Check for RIFF null paddings,
int b;
@@ -76,10 +75,12 @@
readFully(fourcc, 1, 3);
this.fourcc = new String(fourcc, "ascii");
ckSize = readUnsignedInt();
-
- avail = this.ckSize;
+ avail = ckSize;
if (getFormat().equals("RIFF") || getFormat().equals("LIST")) {
+ if (avail > Integer.MAX_VALUE) {
+ throw new RIFFInvalidDataException("Chunk size too big");
+ }
byte[] format = new byte[4];
readFully(format);
this.riff_type = new String(format, "ascii");
@@ -118,19 +119,23 @@
}
public int read() throws IOException {
- if (avail == 0)
+ if (avail == 0) {
return -1;
+ }
int b = stream.read();
- if (b == -1)
+ if (b == -1) {
+ avail = 0;
return -1;
+ }
avail--;
filepointer++;
return b;
}
public int read(byte[] b, int offset, int len) throws IOException {
- if (avail == 0)
+ if (avail == 0) {
return -1;
+ }
if (len > avail) {
int rlen = stream.read(b, offset, (int)avail);
if (rlen != -1)
@@ -139,19 +144,21 @@
return rlen;
} else {
int ret = stream.read(b, offset, len);
- if (ret == -1)
+ if (ret == -1) {
+ avail = 0;
return -1;
+ }
avail -= ret;
filepointer += ret;
return ret;
}
}
- public final void readFully(byte b[]) throws IOException {
+ public void readFully(byte b[]) throws IOException {
readFully(b, 0, b.length);
}
- public final void readFully(byte b[], int off, int len) throws IOException {
+ public void readFully(byte b[], int off, int len) throws IOException {
if (len < 0)
throw new IndexOutOfBoundsException();
while (len > 0) {
@@ -165,7 +172,7 @@
}
}
- public final long skipBytes(long n) throws IOException {
+ public long skipBytes(long n) throws IOException {
if (n < 0)
return 0;
long skipped = 0;
@@ -191,8 +198,10 @@
return len;
} else {
long ret = stream.skip(n);
- if (ret == -1)
+ if (ret == -1) {
+ avail = 0;
return -1;
+ }
avail -= ret;
filepointer += ret;
return ret;
@@ -210,8 +219,13 @@
}
// Read ASCII chars from stream
- public String readString(int len) throws IOException {
- byte[] buff = new byte[len];
+ public String readString(final int len) throws IOException {
+ final byte[] buff;
+ try {
+ buff = new byte[len];
+ } catch (final OutOfMemoryError oom) {
+ throw new IOException("Length too big", oom);
+ }
readFully(buff);
for (int i = 0; i < buff.length; i++) {
if (buff[i] == 0) {