提交 33bc2428 编写于 作者: S serb

8004261: Improve input validation

Reviewed-by: art, mschoene, amenkov
上级 246c9a48
...@@ -56,7 +56,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice ...@@ -56,7 +56,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
// from simultaneous creation and destruction // from simultaneous creation and destruction
// reduces possibility of deadlock, compared to // reduces possibility of deadlock, compared to
// synchronizing to the class instance // synchronizing to the class instance
private Object traRecLock = new Object(); private final Object traRecLock = new Object();
// DEVICE ATTRIBUTES // DEVICE ATTRIBUTES
...@@ -474,7 +474,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice ...@@ -474,7 +474,7 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
This is necessary for Receivers retrieved via MidiSystem.getReceiver() This is necessary for Receivers retrieved via MidiSystem.getReceiver()
(which opens the device implicitely). (which opens the device implicitely).
*/ */
protected abstract class AbstractReceiver implements MidiDeviceReceiver { abstract class AbstractReceiver implements MidiDeviceReceiver {
private boolean open = true; private boolean open = true;
...@@ -483,24 +483,24 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice ...@@ -483,24 +483,24 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
Receiver. Therefore, subclasses should not override this method. Receiver. Therefore, subclasses should not override this method.
Instead, they should implement implSend(). Instead, they should implement implSend().
*/ */
public synchronized void send(MidiMessage message, long timeStamp) { @Override
if (open) { public final synchronized void send(final MidiMessage message,
implSend(message, timeStamp); final long timeStamp) {
} else { if (!open) {
throw new IllegalStateException("Receiver is not open"); throw new IllegalStateException("Receiver is not open");
} }
implSend(message, timeStamp);
} }
abstract void implSend(MidiMessage message, long timeStamp);
protected abstract void implSend(MidiMessage message, long timeStamp);
/** Close the Receiver. /** Close the Receiver.
* Here, the call to the magic method closeInternal() takes place. * Here, the call to the magic method closeInternal() takes place.
* Therefore, subclasses that override this method must call * Therefore, subclasses that override this method must call
* 'super.close()'. * 'super.close()'.
*/ */
public void close() { @Override
public final void close() {
open = false; open = false;
synchronized (AbstractMidiDevice.this.traRecLock) { synchronized (AbstractMidiDevice.this.traRecLock) {
AbstractMidiDevice.this.getReceiverList().remove(this); AbstractMidiDevice.this.getReceiverList().remove(this);
...@@ -508,11 +508,12 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice ...@@ -508,11 +508,12 @@ abstract class AbstractMidiDevice implements MidiDevice, ReferenceCountingDevice
AbstractMidiDevice.this.closeInternal(this); AbstractMidiDevice.this.closeInternal(this);
} }
public MidiDevice getMidiDevice() { @Override
public final MidiDevice getMidiDevice() {
return AbstractMidiDevice.this; return AbstractMidiDevice.this;
} }
protected boolean isOpen() { final boolean isOpen() {
return open; return open;
} }
......
...@@ -32,7 +32,7 @@ import javax.sound.midi.*; ...@@ -32,7 +32,7 @@ import javax.sound.midi.*;
* *
* @author Florian Bomers * @author Florian Bomers
*/ */
class FastShortMessage extends ShortMessage { final class FastShortMessage extends ShortMessage {
private int packedMsg; private int packedMsg;
public FastShortMessage(int packedMsg) throws InvalidMidiDataException { public FastShortMessage(int packedMsg) throws InvalidMidiDataException {
......
...@@ -32,7 +32,7 @@ import javax.sound.midi.*; ...@@ -32,7 +32,7 @@ import javax.sound.midi.*;
* *
* @author Florian Bomers * @author Florian Bomers
*/ */
class FastSysexMessage extends SysexMessage { final class FastSysexMessage extends SysexMessage {
FastSysexMessage(byte[] data) throws InvalidMidiDataException { FastSysexMessage(byte[] data) throws InvalidMidiDataException {
super(data); super(data);
......
...@@ -103,9 +103,9 @@ class MidiOutDevice extends AbstractMidiDevice { ...@@ -103,9 +103,9 @@ class MidiOutDevice extends AbstractMidiDevice {
class MidiOutReceiver extends AbstractReceiver { class MidiOutReceiver extends AbstractReceiver {
protected void implSend(MidiMessage message, long timeStamp) { void implSend(final MidiMessage message, final long timeStamp) {
int length = message.getLength(); final int length = message.getLength();
int status = message.getStatus(); final int status = message.getStatus();
if (length <= 3 && status != 0xF0 && status != 0xF7) { if (length <= 3 && status != 0xF0 && status != 0xF7) {
int packedMsg; int packedMsg;
if (message instanceof ShortMessage) { if (message instanceof ShortMessage) {
...@@ -140,11 +140,15 @@ class MidiOutDevice extends AbstractMidiDevice { ...@@ -140,11 +140,15 @@ class MidiOutDevice extends AbstractMidiDevice {
} }
nSendShortMessage(id, packedMsg, timeStamp); nSendShortMessage(id, packedMsg, timeStamp);
} else { } else {
final byte[] data;
if (message instanceof FastSysexMessage) { if (message instanceof FastSysexMessage) {
nSendLongMessage(id, ((FastSysexMessage) message).getReadOnlyMessage(), data = ((FastSysexMessage) message).getReadOnlyMessage();
length, timeStamp);
} else { } else {
nSendLongMessage(id, message.getMessage(), length, timeStamp); data = message.getMessage();
}
final int dataLength = Math.min(length, data.length);
if (dataLength > 0) {
nSendLongMessage(id, data, dataLength, timeStamp);
} }
} }
} }
......
...@@ -1026,7 +1026,7 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon ...@@ -1026,7 +1026,7 @@ class RealTimeSequencer extends AbstractMidiDevice implements Sequencer, AutoCon
class SequencerReceiver extends AbstractReceiver { class SequencerReceiver extends AbstractReceiver {
protected void implSend(MidiMessage message, long timeStamp) { void implSend(MidiMessage message, long timeStamp) {
if (recording) { if (recording) {
long tickPos = 0; long tickPos = 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册