1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0 2*4882a593Smuzhiyun/// Make sure calls to d_find_alias() have a corresponding call to dput(). 3*4882a593Smuzhiyun// 4*4882a593Smuzhiyun// Keywords: d_find_alias, dput 5*4882a593Smuzhiyun// 6*4882a593Smuzhiyun// Confidence: Moderate 7*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/ 8*4882a593Smuzhiyun// Options: --include-headers 9*4882a593Smuzhiyun 10*4882a593Smuzhiyunvirtual context 11*4882a593Smuzhiyunvirtual org 12*4882a593Smuzhiyunvirtual patch 13*4882a593Smuzhiyunvirtual report 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun@r exists@ 16*4882a593Smuzhiyunlocal idexpression struct dentry *dent; 17*4882a593Smuzhiyunexpression E, E1; 18*4882a593Smuzhiyunstatement S1, S2; 19*4882a593Smuzhiyunposition p1, p2; 20*4882a593Smuzhiyun@@ 21*4882a593Smuzhiyun( 22*4882a593Smuzhiyun if (!(dent@p1 = d_find_alias(...))) S1 23*4882a593Smuzhiyun| 24*4882a593Smuzhiyun dent@p1 = d_find_alias(...) 25*4882a593Smuzhiyun) 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun<...when != dput(dent) 28*4882a593Smuzhiyun when != if (...) { <+... dput(dent) ...+> } 29*4882a593Smuzhiyun when != true !dent || ... 30*4882a593Smuzhiyun when != dent = E 31*4882a593Smuzhiyun when != E = dent 32*4882a593Smuzhiyunif (!dent || ...) S2 33*4882a593Smuzhiyun...> 34*4882a593Smuzhiyun( 35*4882a593Smuzhiyun return <+...dent...+>; 36*4882a593Smuzhiyun| 37*4882a593Smuzhiyun return @p2 ...; 38*4882a593Smuzhiyun| 39*4882a593Smuzhiyun dent@p2 = E1; 40*4882a593Smuzhiyun| 41*4882a593Smuzhiyun E1 = dent; 42*4882a593Smuzhiyun) 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun@depends on context@ 45*4882a593Smuzhiyunlocal idexpression struct dentry *r.dent; 46*4882a593Smuzhiyunposition r.p1,r.p2; 47*4882a593Smuzhiyun@@ 48*4882a593Smuzhiyun* dent@p1 = ... 49*4882a593Smuzhiyun ... 50*4882a593Smuzhiyun( 51*4882a593Smuzhiyun* return@p2 ...; 52*4882a593Smuzhiyun| 53*4882a593Smuzhiyun* dent@p2 54*4882a593Smuzhiyun) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun@script:python depends on org@ 58*4882a593Smuzhiyunp1 << r.p1; 59*4882a593Smuzhiyunp2 << r.p2; 60*4882a593Smuzhiyun@@ 61*4882a593Smuzhiyuncocci.print_main("Missing call to dput()",p1) 62*4882a593Smuzhiyuncocci.print_secs("",p2) 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun@depends on patch@ 65*4882a593Smuzhiyunlocal idexpression struct dentry *r.dent; 66*4882a593Smuzhiyunposition r.p2; 67*4882a593Smuzhiyun@@ 68*4882a593Smuzhiyun( 69*4882a593Smuzhiyun+ dput(dent); 70*4882a593Smuzhiyun return @p2 ...; 71*4882a593Smuzhiyun| 72*4882a593Smuzhiyun+ dput(dent); 73*4882a593Smuzhiyun dent@p2 = ...; 74*4882a593Smuzhiyun) 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun@script:python depends on report@ 77*4882a593Smuzhiyunp1 << r.p1; 78*4882a593Smuzhiyunp2 << r.p2; 79*4882a593Smuzhiyun@@ 80*4882a593Smuzhiyunmsg = "Missing call to dput() at line %s." 81*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg % (p2[0].line)) 82