Commit 4f8b1914 authored by Dimitris Papastamos's avatar Dimitris Papastamos Committed by Mark Brown

ASoC: wm0010: Fix resource leak

If kzalloc() fails for `img' then we are going to leak the memory
for `out'.  We are freeing the memory of all the tx/rx transfers
but the tx/rx buf pointers will be NULL if we drop out earlier.
Signed-off-by: default avatarDimitris Papastamos <dp@opensource.wolfsonmicro.com>
Signed-off-by: default avatarMark Brown <broonie@linaro.org>
parent 5ae90d8e
...@@ -410,6 +410,16 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec) ...@@ -410,6 +410,16 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
rec->command, rec->length); rec->command, rec->length);
len = rec->length + 8; len = rec->length + 8;
xfer = kzalloc(sizeof(*xfer), GFP_KERNEL);
if (!xfer) {
dev_err(codec->dev, "Failed to allocate xfer\n");
ret = -ENOMEM;
goto abort;
}
xfer->codec = codec;
list_add_tail(&xfer->list, &xfer_list);
out = kzalloc(len, GFP_KERNEL); out = kzalloc(len, GFP_KERNEL);
if (!out) { if (!out) {
dev_err(codec->dev, dev_err(codec->dev,
...@@ -417,6 +427,7 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec) ...@@ -417,6 +427,7 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
ret = -ENOMEM; ret = -ENOMEM;
goto abort1; goto abort1;
} }
xfer->t.rx_buf = out;
img = kzalloc(len, GFP_KERNEL); img = kzalloc(len, GFP_KERNEL);
if (!img) { if (!img) {
...@@ -425,24 +436,13 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec) ...@@ -425,24 +436,13 @@ static int wm0010_firmware_load(const char *name, struct snd_soc_codec *codec)
ret = -ENOMEM; ret = -ENOMEM;
goto abort1; goto abort1;
} }
xfer->t.tx_buf = img;
byte_swap_64((u64 *)&rec->command, img, len); byte_swap_64((u64 *)&rec->command, img, len);
xfer = kzalloc(sizeof(*xfer), GFP_KERNEL);
if (!xfer) {
dev_err(codec->dev, "Failed to allocate xfer\n");
ret = -ENOMEM;
goto abort1;
}
xfer->codec = codec;
list_add_tail(&xfer->list, &xfer_list);
spi_message_init(&xfer->m); spi_message_init(&xfer->m);
xfer->m.complete = wm0010_boot_xfer_complete; xfer->m.complete = wm0010_boot_xfer_complete;
xfer->m.context = xfer; xfer->m.context = xfer;
xfer->t.tx_buf = img;
xfer->t.rx_buf = out;
xfer->t.len = len; xfer->t.len = len;
xfer->t.bits_per_word = 8; xfer->t.bits_per_word = 8;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment