1

ALSA: hdsp: Break infinite MIDI input flush loop

The current MIDI input flush on HDSP and HDSPM drivers relies on the
hardware reporting the right value.  If the hardware doesn't give the
proper value but returns -1, it may be stuck at an infinite loop.

Add a counter and break if the loop is unexpectedly too long.

Link: https://patch.msgid.link/20240808091513.31380-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2024-08-08 11:15:12 +02:00
parent 7b986c7430
commit c01f381545
2 changed files with 8 additions and 4 deletions

View File

@ -1298,8 +1298,10 @@ static int snd_hdsp_midi_output_possible (struct hdsp *hdsp, int id)
static void snd_hdsp_flush_midi_input (struct hdsp *hdsp, int id) static void snd_hdsp_flush_midi_input (struct hdsp *hdsp, int id)
{ {
while (snd_hdsp_midi_input_available (hdsp, id)) int count = 256;
snd_hdsp_midi_read_byte (hdsp, id);
while (snd_hdsp_midi_input_available(hdsp, id) && --count)
snd_hdsp_midi_read_byte(hdsp, id);
} }
static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi) static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi)

View File

@ -1838,8 +1838,10 @@ static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id) static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
{ {
while (snd_hdspm_midi_input_available (hdspm, id)) int count = 256;
snd_hdspm_midi_read_byte (hdspm, id);
while (snd_hdspm_midi_input_available(hdspm, id) && --count)
snd_hdspm_midi_read_byte(hdspm, id);
} }
static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi) static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)