[SCSI] pm8001: introduce missing kfree
Error handling code following a kmalloc should free the allocated data. The semantic match that finds the problem is as follows: (http://www.emn.fr/x-info/coccinelle/) // <smpl> @r exists@ local idexpression x; expression E; identifier f,f1; position p1,p2; @@ x@p1 = \(kmalloc\|kzalloc\|kcalloc\)(...); <... when != x when != if (...) { <+...x...+> } when != (x) == NULL when != (x) != NULL when != (x) == 0 when != (x) != 0 ( x->f1 = E | (x->f1 == NULL || ...) | f(...,x->f1,...) ) ...> ( return <+...x...+>; | return@p2 ...; ) @script:python@ p1 << r.p1; p2 << r.p2; @@ print "* file: %s kmalloc %s return %s" % (p1[0].file,p1[0].line,p2[0].line) // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Acked-by: jack wang <jack_wang@usish.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
parent
e8ed741fcd
commit
823d219f23
|
@ -4199,8 +4199,10 @@ static int pm8001_chip_get_nvmd_req(struct pm8001_hba_info *pm8001_ha,
|
|||
circularQ = &pm8001_ha->inbnd_q_tbl[0];
|
||||
memset(&nvmd_req, 0, sizeof(nvmd_req));
|
||||
rc = pm8001_tag_alloc(pm8001_ha, &tag);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
kfree(fw_control_context);
|
||||
return rc;
|
||||
}
|
||||
ccb = &pm8001_ha->ccb_info[tag];
|
||||
ccb->ccb_tag = tag;
|
||||
ccb->fw_control_context = fw_control_context;
|
||||
|
@ -4276,8 +4278,10 @@ static int pm8001_chip_set_nvmd_req(struct pm8001_hba_info *pm8001_ha,
|
|||
ioctl_payload->length);
|
||||
memset(&nvmd_req, 0, sizeof(nvmd_req));
|
||||
rc = pm8001_tag_alloc(pm8001_ha, &tag);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
kfree(fw_control_context);
|
||||
return rc;
|
||||
}
|
||||
ccb = &pm8001_ha->ccb_info[tag];
|
||||
ccb->fw_control_context = fw_control_context;
|
||||
ccb->ccb_tag = tag;
|
||||
|
@ -4387,6 +4391,7 @@ pm8001_chip_fw_flash_update_req(struct pm8001_hba_info *pm8001_ha,
|
|||
fw_control->len, 0) != 0) {
|
||||
PM8001_FAIL_DBG(pm8001_ha,
|
||||
pm8001_printk("Mem alloc failure\n"));
|
||||
kfree(fw_control_context);
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
@ -4401,8 +4406,10 @@ pm8001_chip_fw_flash_update_req(struct pm8001_hba_info *pm8001_ha,
|
|||
fw_control_context->virtAddr = buffer;
|
||||
fw_control_context->len = fw_control->len;
|
||||
rc = pm8001_tag_alloc(pm8001_ha, &tag);
|
||||
if (rc)
|
||||
if (rc) {
|
||||
kfree(fw_control_context);
|
||||
return rc;
|
||||
}
|
||||
ccb = &pm8001_ha->ccb_info[tag];
|
||||
ccb->fw_control_context = fw_control_context;
|
||||
ccb->ccb_tag = tag;
|
||||
|
|
Loading…
Reference in a new issue