1// SPDX-License-Identifier: GPL-2.0 2/// Find missing put_device for every of_find_device_by_node. 3/// 4// Confidence: Moderate 5// Copyright: (C) 2018-2019 Wen Yang, ZTE. 6// Comments: 7// Options: --no-includes --include-headers 8 9virtual report 10virtual org 11 12@search exists@ 13local idexpression id; 14expression x,e,e1; 15position p1,p2; 16type T,T1,T2,T3; 17@@ 18 19id = of_find_device_by_node@p1(x) 20... when != e = id 21if (id == NULL || ...) { ... return ...; } 22... when != put_device(&id->dev) 23 when != platform_device_put(id) 24 when != if (id) { ... put_device(&id->dev) ... } 25 when != e1 = (T)id 26 when != e1 = (T)(&id->dev) 27 when != e1 = get_device(&id->dev) 28 when != e1 = (T1)platform_get_drvdata(id) 29( 30 return 31( id 32| (T2)dev_get_drvdata(&id->dev) 33| (T3)platform_get_drvdata(id) 34| &id->dev 35); 36| return@p2 ...; 37) 38 39@script:python depends on report@ 40p1 << search.p1; 41p2 << search.p2; 42@@ 43 44coccilib.report.print_report(p2[0], 45 "ERROR: missing put_device; call of_find_device_by_node on line " 46 + p1[0].line 47 + ", but without a corresponding object release within this function.") 48 49@script:python depends on org@ 50p1 << search.p1; 51p2 << search.p2; 52@@ 53 54cocci.print_main("of_find_device_by_node", p1) 55cocci.print_secs("needed put_device", p2) 56