Skip to content

Commit

Permalink
Fix crashes when sending a SysexMessage starting with 0xF7
Browse files Browse the repository at this point in the history
  • Loading branch information
AlecJY committed Oct 11, 2023
1 parent 7976151 commit 785c0c6
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 5 deletions.
8 changes: 5 additions & 3 deletions src/java.desktop/share/native/libjsound/MidiOutDevice.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 1999, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1999, 2023, 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
Expand Down Expand Up @@ -121,6 +121,7 @@ Java_com_sun_media_sound_MidiOutDevice_nSendLongMessage(JNIEnv* e, jobject thisO
jbyteArray jData, jint size, jlong timeStamp) {
#if USE_PLATFORM_MIDI_OUT == TRUE
UBYTE* data;
UBYTE* msg;
#endif

TRACE0("Java_com_sun_media_sound_MidiOutDevice_nSendLongMessage.\n");
Expand All @@ -133,11 +134,12 @@ Java_com_sun_media_sound_MidiOutDevice_nSendLongMessage(JNIEnv* e, jobject thisO
}
/* "continuation" sysex messages start with F7 (instead of F0), but
are sent without the F7. */
msg = data;
if (data[0] == 0xF7 && size > 1) {
data++;
msg++;
size--;
}
MIDI_OUT_SendLongMessage((MidiDeviceHandle*) (UINT_PTR) deviceHandle, data,
MIDI_OUT_SendLongMessage((MidiDeviceHandle*) (UINT_PTR) deviceHandle, msg,
(UINT32) size, (UINT32)timeStamp);
// release the byte array
(*e)->ReleaseByteArrayElements(e, jData, (jbyte*) data, JNI_ABORT);
Expand Down
15 changes: 13 additions & 2 deletions test/jdk/javax/sound/midi/SysexMessage/SendRawSysexMessage.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020, 2023, 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
Expand Down Expand Up @@ -35,7 +35,8 @@
/**
* @test
* @bug 8237495
* @summary fail with a dereferenced memory error when asked to send a raw 0xF7
* @summary fail with memory errors when asked to send a sysex message starting
* with 0xF7
*/
public final class SendRawSysexMessage {

Expand Down Expand Up @@ -113,6 +114,16 @@ private static void test(MidiDevice.Info info) throws Exception {
(byte) SPECIAL_SYSTEM_EXCLUSIVE}), -1);
System.err.println("note off");
r.send(new ShortMessage(ShortMessage.NOTE_OFF, 5, 5), -1);
System.err.println("sysex part 1 of 3");
r.send(new SysexMessage(new byte[]{
(byte) SYSTEM_EXCLUSIVE, 0x7D, 0x01, 0x02}, 4), -1);
System.err.println("sysex part 2 of 3");
r.send(new SysexMessage(new byte[]{
(byte) SPECIAL_SYSTEM_EXCLUSIVE, 0x03, 0x04}, 3), -1);
System.err.println("sysex part 3 of 3");
r.send(new SysexMessage(new byte[]{
(byte) SPECIAL_SYSTEM_EXCLUSIVE, 0x05, 0x06,
(byte) SPECIAL_SYSTEM_EXCLUSIVE}, 4), -1);
System.err.println("done, should quit");
System.err.println();
}
Expand Down

0 comments on commit 785c0c6

Please sign in to comment.