ALSA: pcm: oss: Place the plugin buffer overflow checks correctly
commit4285de0725
upstream. The checks of the plugin buffer overflow in the previous fix by commitf2ecf903ef
("ALSA: pcm: oss: Avoid plugin buffer overflow") are put in the wrong places mistakenly, which leads to the expected (repeated) sound when the rate plugin is involved. Fix in the right places. Also, at those right places, the zero check is needed for the termination node, so added there as well, and let's get it done, finally. Fixes:f2ecf903ef
("ALSA: pcm: oss: Avoid plugin buffer overflow") Cc: <stable@vger.kernel.org> Link: https://lore.kernel.org/r/20200424193350.19678-1-tiwai@suse.de Signed-off-by: Takashi Iwai <tiwai@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c867614f19
commit
ea63e38b29
|
@ -211,21 +211,23 @@ static snd_pcm_sframes_t plug_client_size(struct snd_pcm_substream *plug,
|
||||||
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||||
plugin = snd_pcm_plug_last(plug);
|
plugin = snd_pcm_plug_last(plug);
|
||||||
while (plugin && drv_frames > 0) {
|
while (plugin && drv_frames > 0) {
|
||||||
if (check_size && drv_frames > plugin->buf_frames)
|
|
||||||
drv_frames = plugin->buf_frames;
|
|
||||||
plugin_prev = plugin->prev;
|
plugin_prev = plugin->prev;
|
||||||
if (plugin->src_frames)
|
if (plugin->src_frames)
|
||||||
drv_frames = plugin->src_frames(plugin, drv_frames);
|
drv_frames = plugin->src_frames(plugin, drv_frames);
|
||||||
|
if (check_size && plugin->buf_frames &&
|
||||||
|
drv_frames > plugin->buf_frames)
|
||||||
|
drv_frames = plugin->buf_frames;
|
||||||
plugin = plugin_prev;
|
plugin = plugin_prev;
|
||||||
}
|
}
|
||||||
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||||
plugin = snd_pcm_plug_first(plug);
|
plugin = snd_pcm_plug_first(plug);
|
||||||
while (plugin && drv_frames > 0) {
|
while (plugin && drv_frames > 0) {
|
||||||
plugin_next = plugin->next;
|
plugin_next = plugin->next;
|
||||||
|
if (check_size && plugin->buf_frames &&
|
||||||
|
drv_frames > plugin->buf_frames)
|
||||||
|
drv_frames = plugin->buf_frames;
|
||||||
if (plugin->dst_frames)
|
if (plugin->dst_frames)
|
||||||
drv_frames = plugin->dst_frames(plugin, drv_frames);
|
drv_frames = plugin->dst_frames(plugin, drv_frames);
|
||||||
if (check_size && drv_frames > plugin->buf_frames)
|
|
||||||
drv_frames = plugin->buf_frames;
|
|
||||||
plugin = plugin_next;
|
plugin = plugin_next;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
@ -251,26 +253,28 @@ static snd_pcm_sframes_t plug_slave_size(struct snd_pcm_substream *plug,
|
||||||
plugin = snd_pcm_plug_first(plug);
|
plugin = snd_pcm_plug_first(plug);
|
||||||
while (plugin && frames > 0) {
|
while (plugin && frames > 0) {
|
||||||
plugin_next = plugin->next;
|
plugin_next = plugin->next;
|
||||||
|
if (check_size && plugin->buf_frames &&
|
||||||
|
frames > plugin->buf_frames)
|
||||||
|
frames = plugin->buf_frames;
|
||||||
if (plugin->dst_frames) {
|
if (plugin->dst_frames) {
|
||||||
frames = plugin->dst_frames(plugin, frames);
|
frames = plugin->dst_frames(plugin, frames);
|
||||||
if (frames < 0)
|
if (frames < 0)
|
||||||
return frames;
|
return frames;
|
||||||
}
|
}
|
||||||
if (check_size && frames > plugin->buf_frames)
|
|
||||||
frames = plugin->buf_frames;
|
|
||||||
plugin = plugin_next;
|
plugin = plugin_next;
|
||||||
}
|
}
|
||||||
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
|
||||||
plugin = snd_pcm_plug_last(plug);
|
plugin = snd_pcm_plug_last(plug);
|
||||||
while (plugin) {
|
while (plugin) {
|
||||||
if (check_size && frames > plugin->buf_frames)
|
|
||||||
frames = plugin->buf_frames;
|
|
||||||
plugin_prev = plugin->prev;
|
plugin_prev = plugin->prev;
|
||||||
if (plugin->src_frames) {
|
if (plugin->src_frames) {
|
||||||
frames = plugin->src_frames(plugin, frames);
|
frames = plugin->src_frames(plugin, frames);
|
||||||
if (frames < 0)
|
if (frames < 0)
|
||||||
return frames;
|
return frames;
|
||||||
}
|
}
|
||||||
|
if (check_size && plugin->buf_frames &&
|
||||||
|
frames > plugin->buf_frames)
|
||||||
|
frames = plugin->buf_frames;
|
||||||
plugin = plugin_prev;
|
plugin = plugin_prev;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
|
Loading…
Reference in New Issue