mirror of https://gitee.com/openkylin/linux.git
media: dw2102: Fix memleak on sequence of probes
Each call to dw2102_probe() allocates memory by kmemdup for structures p1100, s660, p7500 and s421, but there is no their deallocation. dvb_usb_device_init() copies the corresponding structure into dvb_usb_device->props, so there is no use of original structure after dvb_usb_device_init(). The patch moves structures from global scope to local and adds their deallocation. Found by Linux Driver Verification project (linuxtesting.org). Signed-off-by: Anton Vasilyev <vasilyev@ispras.ru> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:
parent
1b7369acc4
commit
299c7007e9
|
@ -2101,14 +2101,12 @@ static struct dvb_usb_device_properties s6x0_properties = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dvb_usb_device_properties *p1100;
|
|
||||||
static const struct dvb_usb_device_description d1100 = {
|
static const struct dvb_usb_device_description d1100 = {
|
||||||
"Prof 1100 USB ",
|
"Prof 1100 USB ",
|
||||||
{&dw2102_table[PROF_1100], NULL},
|
{&dw2102_table[PROF_1100], NULL},
|
||||||
{NULL},
|
{NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dvb_usb_device_properties *s660;
|
|
||||||
static const struct dvb_usb_device_description d660 = {
|
static const struct dvb_usb_device_description d660 = {
|
||||||
"TeVii S660 USB",
|
"TeVii S660 USB",
|
||||||
{&dw2102_table[TEVII_S660], NULL},
|
{&dw2102_table[TEVII_S660], NULL},
|
||||||
|
@ -2127,14 +2125,12 @@ static const struct dvb_usb_device_description d480_2 = {
|
||||||
{NULL},
|
{NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dvb_usb_device_properties *p7500;
|
|
||||||
static const struct dvb_usb_device_description d7500 = {
|
static const struct dvb_usb_device_description d7500 = {
|
||||||
"Prof 7500 USB DVB-S2",
|
"Prof 7500 USB DVB-S2",
|
||||||
{&dw2102_table[PROF_7500], NULL},
|
{&dw2102_table[PROF_7500], NULL},
|
||||||
{NULL},
|
{NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct dvb_usb_device_properties *s421;
|
|
||||||
static const struct dvb_usb_device_description d421 = {
|
static const struct dvb_usb_device_description d421 = {
|
||||||
"TeVii S421 PCI",
|
"TeVii S421 PCI",
|
||||||
{&dw2102_table[TEVII_S421], NULL},
|
{&dw2102_table[TEVII_S421], NULL},
|
||||||
|
@ -2334,6 +2330,11 @@ static int dw2102_probe(struct usb_interface *intf,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
int retval = -ENOMEM;
|
int retval = -ENOMEM;
|
||||||
|
struct dvb_usb_device_properties *p1100;
|
||||||
|
struct dvb_usb_device_properties *s660;
|
||||||
|
struct dvb_usb_device_properties *p7500;
|
||||||
|
struct dvb_usb_device_properties *s421;
|
||||||
|
|
||||||
p1100 = kmemdup(&s6x0_properties,
|
p1100 = kmemdup(&s6x0_properties,
|
||||||
sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
|
sizeof(struct dvb_usb_device_properties), GFP_KERNEL);
|
||||||
if (!p1100)
|
if (!p1100)
|
||||||
|
@ -2402,8 +2403,16 @@ static int dw2102_probe(struct usb_interface *intf,
|
||||||
0 == dvb_usb_device_init(intf, &t220_properties,
|
0 == dvb_usb_device_init(intf, &t220_properties,
|
||||||
THIS_MODULE, NULL, adapter_nr) ||
|
THIS_MODULE, NULL, adapter_nr) ||
|
||||||
0 == dvb_usb_device_init(intf, &tt_s2_4600_properties,
|
0 == dvb_usb_device_init(intf, &tt_s2_4600_properties,
|
||||||
THIS_MODULE, NULL, adapter_nr))
|
THIS_MODULE, NULL, adapter_nr)) {
|
||||||
|
|
||||||
|
/* clean up copied properties */
|
||||||
|
kfree(s421);
|
||||||
|
kfree(p7500);
|
||||||
|
kfree(s660);
|
||||||
|
kfree(p1100);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
retval = -ENODEV;
|
retval = -ENODEV;
|
||||||
kfree(s421);
|
kfree(s421);
|
||||||
|
|
Loading…
Reference in New Issue