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