[PATCH] fix leaks in request_firmware_nowait
Wasn't checking return error and forgot to free in some case. Signed-off-by: Matthieu CASTET <castet.matthieu@free.fr> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
ff6ed4063d
commit
113fab1386
|
@ -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);
|
||||||
|
if (ret < 0)
|
||||||
|
fw_work->cont(NULL, fw_work->context);
|
||||||
|
else {
|
||||||
fw_work->cont(fw, fw_work->context);
|
fw_work->cont(fw, fw_work->context);
|
||||||
release_firmware(fw);
|
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(
|
||||||
|
|
||||||
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;
|
||||||
|
|
Loading…
Reference in a new issue