aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Palix <npalix@diku.dk>2009-01-06 17:41:35 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-06 18:59:18 -0500
commit44ea9c809db6cd373448e77c4be424b534f2051f (patch)
treec6da991aec04d7c78edfff70df0b7fd4d6c88c6e
parent89fac11cb3e7c5860c425dba14845c09ccede39d (diff)
drivers/macintosh: Add missing of_node_put in therm_adt746x.c
of_node_put is needed before discarding a value received from of_find_node_by_name, eg in error handling code or when the device node is no longer used. The semantic match that catches the bug is as follows: (http://www.emn.fr/x-info/coccinelle/) // <smpl> @r exists@ local idexpression struct device_node *n; position p1, p2; struct device_node *n1; statement S; identifier f; expression E; expression *ptr != NULL; @@ n@p1 = of_find_node_by_name(...) ... if (!n) S ... when != of_node_put(n) when != n1 = f(n,...) when != E = n when any when strict ( return \(0\|<+...n...+>\|ptr\); | return@p2 ...; | of_node_put(n); | n1 = f(n,...) | E = n ) @script:python@ p1 << r.p1; p2 << r.p2; @@ print "* file: %s of_find_node_by_name %s return %s" % (p1[0].file,p1[0].line,p2[0].line) // </smpl> Signed-off-by: Nicolas Palix <npalix@diku.dk> Signed-off-by: Julia Lawall <julia@diku.dk> Acked-by: Stephen Rothwell <sfr@canb.auug.org.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/macintosh/therm_adt746x.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/macintosh/therm_adt746x.c b/drivers/macintosh/therm_adt746x.c
index 22bf981d393b..82607add69a9 100644
--- a/drivers/macintosh/therm_adt746x.c
+++ b/drivers/macintosh/therm_adt746x.c
@@ -554,7 +554,7 @@ thermostat_init(void)
554 const u32 *prop; 554 const u32 *prop;
555 int i = 0, offset = 0; 555 int i = 0, offset = 0;
556 int err; 556 int err;
557 557
558 np = of_find_node_by_name(NULL, "fan"); 558 np = of_find_node_by_name(NULL, "fan");
559 if (!np) 559 if (!np)
560 return -ENODEV; 560 return -ENODEV;
@@ -613,13 +613,13 @@ thermostat_init(void)
613 } 613 }
614 614
615 of_dev = of_platform_device_create(np, "temperatures", NULL); 615 of_dev = of_platform_device_create(np, "temperatures", NULL);
616 616 of_node_put(np);
617
617 if (of_dev == NULL) { 618 if (of_dev == NULL) {
618 printk(KERN_ERR "Can't register temperatures device !\n"); 619 printk(KERN_ERR "Can't register temperatures device !\n");
619 of_node_put(np);
620 return -ENODEV; 620 return -ENODEV;
621 } 621 }
622 622
623 err = device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature); 623 err = device_create_file(&of_dev->dev, &dev_attr_sensor1_temperature);
624 err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature); 624 err |= device_create_file(&of_dev->dev, &dev_attr_sensor2_temperature);
625 err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_limit); 625 err |= device_create_file(&of_dev->dev, &dev_attr_sensor1_limit);