drm/edid: Fix potential memory leak in edid_load()
Do not leak memory by updating pointer with potentially NULL realloc return value. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Reviewed-by: Carsten Emde <C.Emde@osadl.org> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
959f724728
commit
f7b83b908f
|
@ -119,7 +119,7 @@ static int edid_load(struct drm_connector *connector, char *name,
|
||||||
{
|
{
|
||||||
const struct firmware *fw;
|
const struct firmware *fw;
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
u8 *fwdata = NULL, *edid;
|
u8 *fwdata = NULL, *edid, *new_edid;
|
||||||
int fwsize, expected;
|
int fwsize, expected;
|
||||||
int builtin = 0, err = 0;
|
int builtin = 0, err = 0;
|
||||||
int i, valid_extensions = 0;
|
int i, valid_extensions = 0;
|
||||||
|
@ -195,12 +195,14 @@ static int edid_load(struct drm_connector *connector, char *name,
|
||||||
"\"%s\" for connector \"%s\"\n", valid_extensions,
|
"\"%s\" for connector \"%s\"\n", valid_extensions,
|
||||||
edid[0x7e], name, connector_name);
|
edid[0x7e], name, connector_name);
|
||||||
edid[0x7e] = valid_extensions;
|
edid[0x7e] = valid_extensions;
|
||||||
edid = krealloc(edid, (valid_extensions + 1) * EDID_LENGTH,
|
new_edid = krealloc(edid, (valid_extensions + 1) * EDID_LENGTH,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (edid == NULL) {
|
if (new_edid == NULL) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
kfree(edid);
|
||||||
goto relfw_out;
|
goto relfw_out;
|
||||||
}
|
}
|
||||||
|
edid = new_edid;
|
||||||
}
|
}
|
||||||
|
|
||||||
connector->display_info.raw_edid = edid;
|
connector->display_info.raw_edid = edid;
|
||||||
|
|
Loading…
Reference in a new issue