diff options
author | Takashi Iwai <tiwai@suse.de> | 2018-01-04 16:39:27 +0100 |
---|---|---|
committer | Sasha Levin <alexander.levin@microsoft.com> | 2018-02-28 19:32:22 -0500 |
commit | 3f30e73b418526585d99309fd02b5b56307cb83d (patch) | |
tree | 4b6d43f9a71aa9c3f27c488c854ac40022462d10 /sound | |
parent | c20d4fa859ff7bce464c0b126c64886424986a0a (diff) |
ALSA: pcm: Add missing error checks in OSS emulation plugin builder
[ Upstream commit 6708913750344a900f2e73bfe4a4d6dbbce4fe8d ]
In the OSS emulation plugin builder where the frame size is parsed in
the plugin chain, some places miss the possible errors returned from
the plugin src_ or dst_frames callback.
This patch papers over such places.
Cc: <stable@vger.kernel.org>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Diffstat (limited to 'sound')
-rw-r--r-- | sound/core/oss/pcm_plugin.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/sound/core/oss/pcm_plugin.c b/sound/core/oss/pcm_plugin.c index 727ac44d39f4..a84a1d3d23e5 100644 --- a/sound/core/oss/pcm_plugin.c +++ b/sound/core/oss/pcm_plugin.c @@ -591,18 +591,26 @@ snd_pcm_sframes_t snd_pcm_plug_write_transfer(struct snd_pcm_substream *plug, st snd_pcm_sframes_t frames = size; plugin = snd_pcm_plug_first(plug); - while (plugin && frames > 0) { + while (plugin) { + if (frames <= 0) + return frames; if ((next = plugin->next) != NULL) { snd_pcm_sframes_t frames1 = frames; - if (plugin->dst_frames) + if (plugin->dst_frames) { frames1 = plugin->dst_frames(plugin, frames); + if (frames1 <= 0) + return frames1; + } if ((err = next->client_channels(next, frames1, &dst_channels)) < 0) { return err; } if (err != frames1) { frames = err; - if (plugin->src_frames) + if (plugin->src_frames) { frames = plugin->src_frames(plugin, frames1); + if (frames <= 0) + return frames; + } } } else dst_channels = NULL; |