Browse Source

staging: line6: fix memory leak in .hw_params()

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>
Stefan Hajnoczi 13 years ago
parent
commit
60c01a9778
2 changed files with 10 additions and 4 deletions
  1. 5 2
      drivers/staging/line6/capture.c
  2. 5 2
      drivers/staging/line6/playback.c

+ 5 - 2
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,

+ 5 - 2
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,