Commit 113fab13 authored by matthieu castet's avatar matthieu castet Committed by Linus Torvalds

[PATCH] fix leaks in request_firmware_nowait

Wasn't checking return error and forgot to free in some case.
Signed-off-by: default avatarMatthieu CASTET <castet.matthieu@free.fr>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ff6ed406
...@@ -526,18 +526,23 @@ request_firmware_work_func(void *arg) ...@@ -526,18 +526,23 @@ request_firmware_work_func(void *arg)
{ {
struct firmware_work *fw_work = arg; struct firmware_work *fw_work = arg;
const struct firmware *fw; const struct firmware *fw;
int ret;
if (!arg) { if (!arg) {
WARN_ON(1); WARN_ON(1);
return 0; return 0;
} }
daemonize("%s/%s", "firmware", fw_work->name); daemonize("%s/%s", "firmware", fw_work->name);
_request_firmware(&fw, fw_work->name, fw_work->device, ret = _request_firmware(&fw, fw_work->name, fw_work->device,
fw_work->hotplug); fw_work->hotplug);
fw_work->cont(fw, fw_work->context); if (ret < 0)
release_firmware(fw); fw_work->cont(NULL, fw_work->context);
else {
fw_work->cont(fw, fw_work->context);
release_firmware(fw);
}
module_put(fw_work->module); module_put(fw_work->module);
kfree(fw_work); kfree(fw_work);
return 0; return ret;
} }
/** /**
...@@ -586,6 +591,8 @@ request_firmware_nowait( ...@@ -586,6 +591,8 @@ request_firmware_nowait(
if (ret < 0) { if (ret < 0) {
fw_work->cont(NULL, fw_work->context); fw_work->cont(NULL, fw_work->context);
module_put(fw_work->module);
kfree(fw_work);
return ret; return ret;
} }
return 0; return 0;
......
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