Skip to content

Commit 9a577ac

Browse files
Fix broken fuzzing harness
Refactor event signal generation to limit bus signal events generated by fuzzing harnesses. The main point is that the issues listed by OSS-Fuzz does not seem to be true positives https://issues.oss-fuzz.com/issues?q=project%3Dtinyusb%20status%3Dnew For example, the existing set up could generate USBD_EVENT_FUNC_CALL which is explicitly not a DCD event. This fixes the harnesses so they don't run into several of the oss-fuzz open issues.
1 parent c64452c commit 9a577ac

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

test/fuzz/dcd_fuzz.cc

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,22 @@ void dcd_int_handler(uint8_t rhport) {
6161

6262
// Choose if we want to generate a signal based on the fuzzed data.
6363
if (_fuzz_data_provider->ConsumeBool()) {
64-
dcd_event_bus_signal(
65-
rhport,
66-
// Choose a random event based on the fuzz data.
67-
(dcd_eventid_t)_fuzz_data_provider->ConsumeIntegralInRange<uint8_t>(
68-
DCD_EVENT_INVALID + 1, DCD_EVENT_COUNT - 1),
69-
// Identify trigger as either an interrupt or a syncrhonous call
70-
// depending on fuzz data.
71-
_fuzz_data_provider->ConsumeBool());
64+
// Only generate bus signal events that don't carry additional union data.
65+
// DCD_EVENT_XFER_COMPLETE, DCD_EVENT_SOF, and DCD_EVENT_BUS_RESET need
66+
// properly initialized union fields; USBD_EVENT_FUNC_CALL is internal only.
67+
// Valid bus-signal-only events: UNPLUGGED(2), SUSPEND(4), RESUME(5).
68+
static const dcd_eventid_t bus_signal_events[] = {
69+
DCD_EVENT_UNPLUGGED, DCD_EVENT_SUSPEND, DCD_EVENT_RESUME};
70+
uint8_t idx = _fuzz_data_provider->ConsumeIntegralInRange<uint8_t>(0, 2);
71+
dcd_event_bus_signal(rhport, bus_signal_events[idx],
72+
_fuzz_data_provider->ConsumeBool());
73+
}
74+
75+
// Optionally generate a BUS_RESET event with a valid speed value.
76+
if (_fuzz_data_provider->ConsumeBool()) {
77+
tusb_speed_t speed = (tusb_speed_t)_fuzz_data_provider->ConsumeIntegralInRange<uint8_t>(
78+
TUSB_SPEED_FULL, TUSB_SPEED_HIGH);
79+
dcd_event_bus_reset(rhport, speed, _fuzz_data_provider->ConsumeBool());
7280
}
7381

7482
if (_fuzz_data_provider->ConsumeBool()) {

0 commit comments

Comments
 (0)