54 lines
2.0 KiB
Diff
54 lines
2.0 KiB
Diff
From: Stefan Hajnoczi <stefanha@gmail.com>
|
|
Date: Sat, 10 Dec 2011 02:12:27 +0100
|
|
Subject: [012/106] staging: line6: fix memory leak in .hw_params()
|
|
|
|
commit 60c01a977814788178362ff0e1a22dfbf106eede upstream.
|
|
|
|
The .hw_params() pcm callback can be invoked multiple times in a row.
|
|
Ensure that the URB data buffer is only allocated once.
|
|
|
|
Signed-off-by: Stefan Hajnoczi <stefanha@gmail.com>
|
|
Signed-off-by: Markus Grabner <grabner@icg.tugraz.at>
|
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
|
---
|
|
drivers/staging/line6/capture.c | 7 +++++--
|
|
drivers/staging/line6/playback.c | 7 +++++--
|
|
2 files changed, 10 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/staging/line6/capture.c b/drivers/staging/line6/capture.c
|
|
index ba441ed..8f59ff3 100644
|
|
--- a/drivers/staging/line6/capture.c
|
|
+++ b/drivers/staging/line6/capture.c
|
|
@@ -316,8 +316,11 @@ static int snd_line6_capture_hw_params(struct snd_pcm_substream *substream,
|
|
}
|
|
/* -- [FD] end */
|
|
|
|
- line6pcm->buffer_in = kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
|
|
- line6pcm->max_packet_size, GFP_KERNEL);
|
|
+ /* We may be invoked multiple times in a row so allocate once only */
|
|
+ if (!line6pcm->buffer_in)
|
|
+ line6pcm->buffer_in =
|
|
+ kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
|
|
+ line6pcm->max_packet_size, GFP_KERNEL);
|
|
|
|
if (!line6pcm->buffer_in) {
|
|
dev_err(line6pcm->line6->ifcdev,
|
|
diff --git a/drivers/staging/line6/playback.c b/drivers/staging/line6/playback.c
|
|
index e495b32..ed1b9bd 100644
|
|
--- a/drivers/staging/line6/playback.c
|
|
+++ b/drivers/staging/line6/playback.c
|
|
@@ -462,8 +462,11 @@ static int snd_line6_playback_hw_params(struct snd_pcm_substream *substream,
|
|
}
|
|
/* -- [FD] end */
|
|
|
|
- line6pcm->buffer_out = kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
|
|
- line6pcm->max_packet_size, GFP_KERNEL);
|
|
+ /* We may be invoked multiple times in a row so allocate once only */
|
|
+ if (!line6pcm->buffer_out)
|
|
+ line6pcm->buffer_out =
|
|
+ kmalloc(LINE6_ISO_BUFFERS * LINE6_ISO_PACKETS *
|
|
+ line6pcm->max_packet_size, GFP_KERNEL);
|
|
|
|
if (!line6pcm->buffer_out) {
|
|
dev_err(line6pcm->line6->ifcdev,
|