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 != of_dev_put(id) 25 when != if (id) { ... put_device(&id->dev) ... } 26 when != e1 = (T)id 27 when != e1 = &id->dev 28 when != e1 = get_device(&id->dev) 29 when != e1 = (T1)platform_get_drvdata(id) 30( 31 return 32( id 33| (T2)dev_get_drvdata(&id->dev) 34| (T3)platform_get_drvdata(id) 35| &id->dev 36); 37| return@p2 ...; 38) 39 40@script:python depends on report@ 41p1 << search.p1; 42p2 << search.p2; 43@@ 44 45coccilib.report.print_report(p2[0], "ERROR: missing put_device; " 46 + "call of_find_device_by_node on line " 47 + p1[0].line 48 + ", but without a corresponding object release " 49 + "within this function.") 50 51@script:python depends on org@ 52p1 << search.p1; 53p2 << search.p2; 54@@ 55 56cocci.print_main("of_find_device_by_node", p1) 57cocci.print_secs("needed put_device", p2) 58