Skip to content

Commit a081da6

Browse files
Julia LawallJeff Garzik
authored andcommitted
drivers/ata/sata_dwc_460ex.c: add missing kfree
Currently, error handling code in this function calls the function sata_dwc_port_stop, but this function has essentially no effect if hsdevp has not been stored in ap, which is the case throughout this function. The only effect is to print a debugging message including ap->print_id. The code is rewritten to not call sata_dwc_port_stop, but instead to jump to a local label that prints the original error message and the print_id information. In the case where hsdevp has been already allocated (but not yet stored in ap), this value is freed as well. A simplified version of the semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // <smpl> @exists@ local idexpression x; statement S,S1; expression E; identifier fl; expression *ptr != NULL; @@ x = \(kmalloc\|kzalloc\|kcalloc\)(...); ... if (x == NULL) S <... when != x when != if (...) { <+...kfree(x)...+> } when any when != true x == NULL x->fl ...> ( if (x == NULL) S1 | if (...) { ... when != x when forall ( return \(0\|<+...x...+>\|ptr\); | * return ...; ) } ) // </smpl> Signed-off-by: Julia Lawall <[email protected]> Signed-off-by: Jeff Garzik <[email protected]>
1 parent e39c75c commit a081da6

File tree

1 file changed

+6
-8
lines changed

1 file changed

+6
-8
lines changed

drivers/ata/sata_dwc_460ex.c

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,7 +1329,7 @@ static int sata_dwc_port_start(struct ata_port *ap)
13291329
dev_err(ap->dev, "%s: dma_alloc_coherent failed\n",
13301330
__func__);
13311331
err = -ENOMEM;
1332-
goto CLEANUP;
1332+
goto CLEANUP_ALLOC;
13331333
}
13341334
}
13351335

@@ -1349,15 +1349,13 @@ static int sata_dwc_port_start(struct ata_port *ap)
13491349
/* Clear any error bits before libata starts issuing commands */
13501350
clear_serror();
13511351
ap->private_data = hsdevp;
1352+
dev_dbg(ap->dev, "%s: done\n", __func__);
1353+
return 0;
13521354

1355+
CLEANUP_ALLOC:
1356+
kfree(hsdevp);
13531357
CLEANUP:
1354-
if (err) {
1355-
sata_dwc_port_stop(ap);
1356-
dev_dbg(ap->dev, "%s: fail\n", __func__);
1357-
} else {
1358-
dev_dbg(ap->dev, "%s: done\n", __func__);
1359-
}
1360-
1358+
dev_dbg(ap->dev, "%s: fail. ap->id = %d\n", __func__, ap->print_id);
13611359
return err;
13621360
}
13631361

0 commit comments

Comments
 (0)