SA1111: Eliminate use after free
__sa1111_remove always frees its argument, so the subsequent reference to sachip->saved_state represents a use after free. __sa1111_remove does not appear to use the saved_state field, so the patch simply frees it first. A simplified version of the semantic patch that finds this problem is as follows: (http://coccinelle.lip6.fr/) // <smpl> @@ expression E,E2; @@ __sa1111_remove(E) ... ( E = E2 | * E ) // </smpl> Signed-off-by: Julia Lawall <julia@diku.dk> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
74bc80931c
commit
f2d2420bbf
@ -1028,13 +1028,12 @@ static int sa1111_remove(struct platform_device *pdev)
|
|||||||
struct sa1111 *sachip = platform_get_drvdata(pdev);
|
struct sa1111 *sachip = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
if (sachip) {
|
if (sachip) {
|
||||||
__sa1111_remove(sachip);
|
|
||||||
platform_set_drvdata(pdev, NULL);
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
kfree(sachip->saved_state);
|
kfree(sachip->saved_state);
|
||||||
sachip->saved_state = NULL;
|
sachip->saved_state = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
__sa1111_remove(sachip);
|
||||||
|
platform_set_drvdata(pdev, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user