Skip to content

Commit 2d28301

Browse files
committed
Validate length of sysex for YM2612 direct write
1 parent 45448e8 commit 2d28301

File tree

3 files changed

+31
-4
lines changed

3 files changed

+31
-4
lines changed

src/midi.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -538,6 +538,15 @@ static void incrementSysExCursor(const u8** data, u16* length, u8 value)
538538
(*length) -= value;
539539
}
540540

541+
static void directWriteYm2612(u8 part, const u8* data, u16 length)
542+
{
543+
if (length != 4) {
544+
return;
545+
}
546+
synth_directWriteYm2612(
547+
part, data[0] << 4 | data[1], data[2] << 4 | data[3]);
548+
}
549+
541550
static void handleCustomSysEx(const u8* data, u16 length)
542551
{
543552
u8 command = *data;
@@ -577,12 +586,10 @@ static void handleCustomSysEx(const u8* data, u16 length)
577586
loadPsgEnvelope(data, length);
578587
break;
579588
case SYSEX_COMMAND_WRITE_YM2612_REG_PART_0:
580-
synth_directWriteYm2612(
581-
0, data[0] << 4 | data[1], data[2] << 4 | data[3]);
589+
directWriteYm2612(0, data, length);
582590
break;
583591
case SYSEX_COMMAND_WRITE_YM2612_REG_PART_1:
584-
synth_directWriteYm2612(
585-
1, data[0] << 4 | data[1], data[2] << 4 | data[3]);
592+
directWriteYm2612(1, data, length);
586593
break;
587594
}
588595
}

tests/unit/main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,8 @@ int main(void)
169169
midi_test(test_midi_sysex_sets_original_total_level_values),
170170
midi_test(test_midi_sysex_writes_directly_to_ym2612_regs_part_0),
171171
midi_test(test_midi_sysex_writes_directly_to_ym2612_regs_part_1),
172+
midi_test(
173+
test_midi_sysex_ignores_incorrect_length_ym2612_direct_writes),
172174
midi_test(
173175
test_midi_sets_all_channel_mappings_when_setting_polyphonic_mode),
174176
midi_test(test_midi_shows_fm_parameter_ui),

tests/unit/test_midi_sysex.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,22 @@ static void test_midi_sysex_writes_directly_to_ym2612_regs_part_1(
279279
expect_value(__wrap_synth_directWriteYm2612, reg, 0xB1);
280280
expect_value(__wrap_synth_directWriteYm2612, data, 0x12);
281281
__real_midi_sysex(sequence, sizeof(sequence));
282+
}
283+
284+
static void test_midi_sysex_ignores_incorrect_length_ym2612_direct_writes(
285+
UNUSED void** state)
286+
{
287+
const u8 badSeq1[] = { SYSEX_MANU_EXTENDED, SYSEX_MANU_REGION,
288+
SYSEX_MANU_ID, SYSEX_COMMAND_WRITE_YM2612_REG_PART_0, 0x0B, 0x01, 0x01,
289+
0x02, 0x02 };
290+
__real_midi_sysex(badSeq1, sizeof(badSeq1));
291+
292+
const u8 badSeq2[]
293+
= { SYSEX_MANU_EXTENDED, SYSEX_MANU_REGION, SYSEX_MANU_ID,
294+
SYSEX_COMMAND_WRITE_YM2612_REG_PART_0, 0x0B, 0x01, 0x01 };
295+
__real_midi_sysex(badSeq2, sizeof(badSeq2));
296+
297+
const u8 badSeq3[] = { SYSEX_MANU_EXTENDED, SYSEX_MANU_REGION,
298+
SYSEX_MANU_ID, SYSEX_COMMAND_WRITE_YM2612_REG_PART_0 };
299+
__real_midi_sysex(badSeq3, sizeof(badSeq3));
282300
}

0 commit comments

Comments
 (0)