diff --git a/jdk/src/share/native/com/sun/media/sound/MidiOutDevice.c b/jdk/src/share/native/com/sun/media/sound/MidiOutDevice.c index 3738eba9381..29ef140b89d 100644 --- a/jdk/src/share/native/com/sun/media/sound/MidiOutDevice.c +++ b/jdk/src/share/native/com/sun/media/sound/MidiOutDevice.c @@ -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 @@ -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"); @@ -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); diff --git a/jdk/test/javax/sound/midi/SysexMessage/SendRawSysexMessage.java b/jdk/test/javax/sound/midi/SysexMessage/SendRawSysexMessage.java index 591def651fb..2a33d28b3f5 100644 --- a/jdk/test/javax/sound/midi/SysexMessage/SendRawSysexMessage.java +++ b/jdk/test/javax/sound/midi/SysexMessage/SendRawSysexMessage.java @@ -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 @@ -34,8 +34,9 @@ /** * @test - * @bug 8237495 - * @summary fail with a dereferenced memory error when asked to send a raw 0xF7 + * @bug 8237495 8301310 + * @summary fail with memory errors when asked to send a sysex message starting + * with 0xF7 */ public final class SendRawSysexMessage { @@ -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, 0x07, + (byte) SPECIAL_SYSTEM_EXCLUSIVE}, 4), -1); System.err.println("done, should quit"); System.err.println(); }