Skip to content

Commit

Permalink
ALSA: line6: Fix racy initialization of LINE6 MIDI
Browse files Browse the repository at this point in the history
The initialization of MIDI devices that are found on some LINE6
drivers are currently done in a racy way; namely, the MIDI buffer
instance is allocated and initialized in each private_init callback
while the communication with the interface is already started via
line6_init_cap_control() call before that point.  This may lead to
Oops in line6_data_received() when a spurious event is received, as
reported by syzkaller.

This patch moves the MIDI initialization to line6_init_cap_control()
as well instead of the too-lately-called private_init for avoiding the
race.  Also this reduces slightly more lines, so it's a win-win
change.

Reported-by: [email protected]
Link: https://lore.kernel.org/r/[email protected]
Link: https://lore.kernel.org/r/20210517132725.GA50495@hyeyoo
Cc: Hyeonggon Yoo <[email protected]>
Cc: <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Takashi Iwai <[email protected]>
  • Loading branch information
tiwai committed May 19, 2021
1 parent 4c6fe8c commit 05ca447
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 11 deletions.
4 changes: 4 additions & 0 deletions sound/usb/line6/driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,10 @@ static int line6_init_cap_control(struct usb_line6 *line6)
line6->buffer_message = kmalloc(LINE6_MIDI_MESSAGE_MAXLEN, GFP_KERNEL);
if (!line6->buffer_message)
return -ENOMEM;

ret = line6_init_midi(line6);
if (ret < 0)
return ret;
} else {
ret = line6_hwdep_init(line6);
if (ret < 0)
Expand Down
5 changes: 0 additions & 5 deletions sound/usb/line6/pod.c
Original file line number Diff line number Diff line change
Expand Up @@ -376,11 +376,6 @@ static int pod_init(struct usb_line6 *line6,
if (err < 0)
return err;

/* initialize MIDI subsystem: */
err = line6_init_midi(line6);
if (err < 0)
return err;

/* initialize PCM subsystem: */
err = line6_init_pcm(line6, &pod_pcm_properties);
if (err < 0)
Expand Down
6 changes: 0 additions & 6 deletions sound/usb/line6/variax.c
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ static int variax_init(struct usb_line6 *line6,
const struct usb_device_id *id)
{
struct usb_line6_variax *variax = line6_to_variax(line6);
int err;

line6->process_message = line6_variax_process_message;
line6->disconnect = line6_variax_disconnect;
Expand All @@ -172,11 +171,6 @@ static int variax_init(struct usb_line6 *line6,
if (variax->buffer_activate == NULL)
return -ENOMEM;

/* initialize MIDI subsystem: */
err = line6_init_midi(&variax->line6);
if (err < 0)
return err;

/* initiate startup procedure: */
schedule_delayed_work(&line6->startup_work,
msecs_to_jiffies(VARIAX_STARTUP_DELAY1));
Expand Down

0 comments on commit 05ca447

Please sign in to comment.