提交 7ae3c9e2 编写于 作者: S serb

7058697: Unexpected exceptions in MID parser code

Reviewed-by: prr, pchelko
上级 bb062d73
/* /*
* 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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* or visit www.oracle.com if you need additional information or have any * or visit www.oracle.com if you need additional information or have any
* questions. * questions.
*/ */
package com.sun.media.sound; package com.sun.media.sound;
import java.io.File; import java.io.File;
...@@ -39,14 +40,14 @@ import javax.sound.midi.Receiver; ...@@ -39,14 +40,14 @@ import javax.sound.midi.Receiver;
import javax.sound.midi.Sequence; import javax.sound.midi.Sequence;
import javax.sound.midi.Track; import javax.sound.midi.Track;
import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.UnsupportedAudioFileException; import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.AudioFileFormat.Type;
import javax.sound.sampled.spi.AudioFileReader; import javax.sound.sampled.spi.AudioFileReader;
/** /**
* MIDI File Audio Renderer/Reader * MIDI File Audio Renderer/Reader.
* *
* @author Karl Helgason * @author Karl Helgason
*/ */
...@@ -109,6 +110,9 @@ public final class SoftMidiAudioFileReader extends AudioFileReader { ...@@ -109,6 +110,9 @@ public final class SoftMidiAudioFileReader extends AudioFileReader {
if (divtype == Sequence.PPQ) { if (divtype == Sequence.PPQ) {
if (((MetaMessage) msg).getType() == 0x51) { if (((MetaMessage) msg).getType() == 0x51) {
byte[] data = ((MetaMessage) msg).getData(); byte[] data = ((MetaMessage) msg).getData();
if (data.length < 3) {
throw new UnsupportedAudioFileException();
}
mpq = ((data[0] & 0xff) << 16) mpq = ((data[0] & 0xff) << 16)
| ((data[1] & 0xff) << 8) | (data[2] & 0xff); | ((data[1] & 0xff) << 8) | (data[2] & 0xff);
} }
......
/* /*
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -25,27 +25,25 @@ ...@@ -25,27 +25,25 @@
package com.sun.media.sound; package com.sun.media.sound;
import java.io.BufferedInputStream;
import java.io.DataInputStream; import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.EOFException; import java.io.InputStream;
import java.io.BufferedInputStream;
import java.net.URL; import java.net.URL;
import javax.sound.midi.MidiFileFormat;
import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MetaMessage; import javax.sound.midi.MetaMessage;
import javax.sound.midi.MidiEvent; import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiFileFormat;
import javax.sound.midi.MidiMessage; import javax.sound.midi.MidiMessage;
import javax.sound.midi.Sequence; import javax.sound.midi.Sequence;
import javax.sound.midi.SysexMessage; import javax.sound.midi.SysexMessage;
import javax.sound.midi.Track; import javax.sound.midi.Track;
import javax.sound.midi.spi.MidiFileReader; import javax.sound.midi.spi.MidiFileReader;
/** /**
* MIDI file reader. * MIDI file reader.
* *
...@@ -53,19 +51,23 @@ import javax.sound.midi.spi.MidiFileReader; ...@@ -53,19 +51,23 @@ import javax.sound.midi.spi.MidiFileReader;
* @author Jan Borgersen * @author Jan Borgersen
* @author Florian Bomers * @author Florian Bomers
*/ */
public final class StandardMidiFileReader extends MidiFileReader { public final class StandardMidiFileReader extends MidiFileReader {
private static final int MThd_MAGIC = 0x4d546864; // 'MThd' private static final int MThd_MAGIC = 0x4d546864; // 'MThd'
private static final int bisBufferSize = 1024; // buffer size in buffered input streams private static final int bisBufferSize = 1024; // buffer size in buffered input streams
public MidiFileFormat getMidiFileFormat(InputStream stream) throws InvalidMidiDataException, IOException { public MidiFileFormat getMidiFileFormat(InputStream stream)
throws InvalidMidiDataException, IOException {
return getMidiFileFormatFromStream(stream, MidiFileFormat.UNKNOWN_LENGTH, null); return getMidiFileFormatFromStream(stream, MidiFileFormat.UNKNOWN_LENGTH, null);
} }
// $$fb 2002-04-17: part of fix for 4635286: MidiSystem.getMidiFileFormat() returns format having invalid length // $$fb 2002-04-17: part of fix for 4635286: MidiSystem.getMidiFileFormat()
private MidiFileFormat getMidiFileFormatFromStream(InputStream stream, int fileLength, SMFParser smfParser) throws InvalidMidiDataException, IOException { // returns format having invalid length
private MidiFileFormat getMidiFileFormatFromStream(InputStream stream,
int fileLength,
SMFParser smfParser)
throws InvalidMidiDataException, IOException{
int maxReadLength = 16; int maxReadLength = 16;
int duration = MidiFileFormat.UNKNOWN_LENGTH; int duration = MidiFileFormat.UNKNOWN_LENGTH;
DataInputStream dis; DataInputStream dis;
...@@ -230,7 +232,7 @@ public final class StandardMidiFileReader extends MidiFileReader { ...@@ -230,7 +232,7 @@ public final class StandardMidiFileReader extends MidiFileReader {
//============================================================================================================= //=============================================================================================================
/** /**
* State variables during parsing of a MIDI file * State variables during parsing of a MIDI file.
*/ */
final class SMFParser { final class SMFParser {
private static final int MTrk_MAGIC = 0x4d54726b; // 'MTrk' private static final int MTrk_MAGIC = 0x4d54726b; // 'MTrk'
...@@ -297,7 +299,11 @@ final class SMFParser { ...@@ -297,7 +299,11 @@ final class SMFParser {
} }
} }
// now read track in a byte array // now read track in a byte array
trackData = new byte[trackLength]; try {
trackData = new byte[trackLength];
} catch (final OutOfMemoryError oom) {
throw new IOException("Track length too big", oom);
}
try { try {
// $$fb 2003-08-20: fix for 4910986: MIDI file parser breaks up on http connection // $$fb 2003-08-20: fix for 4910986: MIDI file parser breaks up on http connection
stream.readFully(trackData); stream.readFully(trackData);
...@@ -386,8 +392,13 @@ final class SMFParser { ...@@ -386,8 +392,13 @@ final class SMFParser {
// meta // meta
int metaType = readUnsigned(); int metaType = readUnsigned();
int metaLength = (int) readVarInt(); int metaLength = (int) readVarInt();
final byte[] metaData;
try {
metaData = new byte[metaLength];
} catch (final OutOfMemoryError oom) {
throw new IOException("Meta length too big", oom);
}
byte[] metaData = new byte[metaLength];
read(metaData); read(metaData);
MetaMessage metaMessage = new MetaMessage(); MetaMessage metaMessage = new MetaMessage();
...@@ -413,5 +424,4 @@ final class SMFParser { ...@@ -413,5 +424,4 @@ final class SMFParser {
throw new EOFException("invalid MIDI file"); throw new EOFException("invalid MIDI file");
} }
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册