From: Takashi Iwai Date: Thu, 2 Mar 2006 17:01:58 +0000 (+0000) Subject: Fix segfault with PCM rate plugin X-Git-Tag: v1.0.11rc4~21 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=d730ff3556bc5a3717ef4d6aad2388322ded8fc9;p=alsa-lib.git Fix segfault with PCM rate plugin Fix segfault with PCM rate plugin (bug#1878) --- diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c index f675a583..bc78835d 100644 --- a/src/pcm/pcm_rate.c +++ b/src/pcm/pcm_rate.c @@ -1297,13 +1297,24 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm) if (pcm->stream == SND_PCM_STREAM_PLAYBACK) { /* commit the remaining fraction (if any) */ - snd_pcm_uframes_t size, slave_size; + snd_pcm_uframes_t size, ofs; size = rate->appl_ptr - rate->last_commit_ptr; - if (size > 0) { - slave_size = snd_pcm_rate_slave_frames(pcm, size); - if (slave_size > 0) - snd_pcm_rate_commit_area(pcm, rate, rate->last_commit_ptr % pcm->buffer_size, - size, slave_size); + ofs = rate->last_commit_ptr % pcm->buffer_size; + while (size > 0) { + snd_pcm_uframes_t psize, spsize; + if (size > pcm->period_size) { + psize = pcm->period_size; + spsize = rate->gen.slave->period_size; + } else { + psize = size; + spsize = snd_pcm_rate_slave_frames(pcm, size); + if (! spsize) + break; + } + snd_pcm_rate_commit_area(pcm, rate, ofs, + psize, spsize); + ofs = (ofs + psize) % pcm->buffer_size; + size -= psize; } } return snd_pcm_drain(rate->gen.slave);