mirror of https://gitee.com/openkylin/linux.git
drivers/net/can/mscan/mpc5xxx_can.c: Add of_node_put to avoid memory leak
Add a call to of_node_put in the error handling code following a call to of_find_matching_node. This patch also moves the existing call to of_node_put after the call to iounmap in the error handling code, to make it possible to jump to of_node_put without doing iounmap. These appear to be disjoint operations, so the ordering doesn't matter. This patch furthermore changes the -ENODEV result in the error handling code for of_find_matching_node to a return of 0, as found in the error handling code for of_iomap, because the return type of the function is unsigned. The semantic match that finds this problem is as follows: (http://coccinelle.lip6.fr/) // <smpl> @r exists@ local idexpression x; expression E,E1,E2; statement S; @@ *x = (of_find_node_by_path |of_find_node_by_name |of_find_node_by_phandle |of_get_parent |of_get_next_parent |of_get_next_child |of_find_compatible_node |of_match_node |of_find_node_by_type |of_find_node_with_property |of_find_matching_node |of_parse_phandle )(...); ... if (x == NULL) S <... when != x = E *if (...) { ... when != of_node_put(x) when != if (...) { ... of_node_put(x); ... } ( return <+...x...+>; | * return ...; ) } ...> ( E2 = x; | of_node_put(x); ) // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Reviewed-by: Wolfram Sang <w.sang@pengutronix.de> Acked-by: Wolfgang Grandegger <wg@grandegger.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
1a9f28c8f9
commit
aed5029ead
|
@ -143,12 +143,12 @@ static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev,
|
||||||
np_clock = of_find_matching_node(NULL, mpc512x_clock_ids);
|
np_clock = of_find_matching_node(NULL, mpc512x_clock_ids);
|
||||||
if (!np_clock) {
|
if (!np_clock) {
|
||||||
dev_err(&ofdev->dev, "couldn't find clock node\n");
|
dev_err(&ofdev->dev, "couldn't find clock node\n");
|
||||||
return -ENODEV;
|
return 0;
|
||||||
}
|
}
|
||||||
clockctl = of_iomap(np_clock, 0);
|
clockctl = of_iomap(np_clock, 0);
|
||||||
if (!clockctl) {
|
if (!clockctl) {
|
||||||
dev_err(&ofdev->dev, "couldn't map clock registers\n");
|
dev_err(&ofdev->dev, "couldn't map clock registers\n");
|
||||||
return 0;
|
goto exit_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine the MSCAN device index from the physical address */
|
/* Determine the MSCAN device index from the physical address */
|
||||||
|
@ -233,9 +233,9 @@ static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev,
|
||||||
clocksrc == 1 ? "ref_clk" : "sys_clk", clockdiv);
|
clocksrc == 1 ? "ref_clk" : "sys_clk", clockdiv);
|
||||||
|
|
||||||
exit_unmap:
|
exit_unmap:
|
||||||
of_node_put(np_clock);
|
|
||||||
iounmap(clockctl);
|
iounmap(clockctl);
|
||||||
|
exit_put:
|
||||||
|
of_node_put(np_clock);
|
||||||
return freq;
|
return freq;
|
||||||
}
|
}
|
||||||
#else /* !CONFIG_PPC_MPC512x */
|
#else /* !CONFIG_PPC_MPC512x */
|
||||||
|
|
Loading…
Reference in New Issue