diff options
author | Julia Lawall <julia@diku.dk> | 2009-09-22 19:46:29 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-09-23 10:39:45 -0400 |
commit | 72445af880dbcd41cffd0d7b78a8c74da093e9eb (patch) | |
tree | 48bd4c2c98bda4d548b931482e4b000e13b88a4e /drivers/rtc | |
parent | d3c7a3f71a103abb7af5bdaf1adf6f693913a4a9 (diff) |
drivers/rtc: correct error-handling code
This code is not executed before ds1307->rtc has been successfully
initialized to the result of calling rtc_device_register. Thus the test
that ds1307->rtc is not NULL is always true.
A simplified version of the semantic match that finds this problem is as
follows: (http://coccinelle.lip6.fr/)
// <smpl>
@match exists@
expression x, E;
statement S1, S2;
@@
x = rtc_device_register(...)
... when != x = E
(
* if (x == NULL || ...) S1 else S2
|
* if (x == NULL && ...) S1 else S2
)
// </smpl>
Signed-off-by: Julia Lawall <julia@diku.dk>
Acked-by: Wolfram Sang <w.sang@pengutronix.de>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rtc')
-rw-r--r-- | drivers/rtc/rtc-ds1307.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 47a93c022d91..eb99ee4fa0f5 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c | |||
@@ -896,8 +896,7 @@ read_rtc: | |||
896 | return 0; | 896 | return 0; |
897 | 897 | ||
898 | exit_irq: | 898 | exit_irq: |
899 | if (ds1307->rtc) | 899 | rtc_device_unregister(ds1307->rtc); |
900 | rtc_device_unregister(ds1307->rtc); | ||
901 | exit_free: | 900 | exit_free: |
902 | kfree(ds1307); | 901 | kfree(ds1307); |
903 | return err; | 902 | return err; |