1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun/// Use kstrdup rather than duplicating its implementation 3*4882a593Smuzhiyun/// 4*4882a593Smuzhiyun// Confidence: High 5*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Nicolas Palix. 6*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. 7*4882a593Smuzhiyun// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. 8*4882a593Smuzhiyun// URL: http://coccinelle.lip6.fr/ 9*4882a593Smuzhiyun// Comments: 10*4882a593Smuzhiyun// Options: --no-includes --include-headers 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunvirtual patch 13*4882a593Smuzhiyunvirtual context 14*4882a593Smuzhiyunvirtual org 15*4882a593Smuzhiyunvirtual report 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun@depends on patch@ 18*4882a593Smuzhiyunexpression from,to; 19*4882a593Smuzhiyunexpression flag,E1,E2; 20*4882a593Smuzhiyunstatement S; 21*4882a593Smuzhiyun@@ 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun- to = kmalloc(strlen(from) + 1,flag); 24*4882a593Smuzhiyun+ to = kstrdup(from, flag); 25*4882a593Smuzhiyun ... when != \(from = E1 \| to = E1 \) 26*4882a593Smuzhiyun if (to==NULL || ...) S 27*4882a593Smuzhiyun ... when != \(from = E2 \| to = E2 \) 28*4882a593Smuzhiyun- strcpy(to, from); 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun@depends on patch@ 31*4882a593Smuzhiyunexpression x,from,to; 32*4882a593Smuzhiyunexpression flag,E1,E2,E3; 33*4882a593Smuzhiyunstatement S; 34*4882a593Smuzhiyun@@ 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun- x = strlen(from) + 1; 37*4882a593Smuzhiyun ... when != \( x = E1 \| from = E1 \) 38*4882a593Smuzhiyun- to = \(kmalloc\|kzalloc\)(x,flag); 39*4882a593Smuzhiyun+ to = kstrdup(from, flag); 40*4882a593Smuzhiyun ... when != \(x = E2 \| from = E2 \| to = E2 \) 41*4882a593Smuzhiyun if (to==NULL || ...) S 42*4882a593Smuzhiyun ... when != \(x = E3 \| from = E3 \| to = E3 \) 43*4882a593Smuzhiyun- memcpy(to, from, x); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun// --------------------------------------------------------------------- 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun@r1 depends on !patch exists@ 48*4882a593Smuzhiyunexpression from,to; 49*4882a593Smuzhiyunexpression flag,E1,E2; 50*4882a593Smuzhiyunstatement S; 51*4882a593Smuzhiyunposition p1,p2; 52*4882a593Smuzhiyun@@ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun* to = kmalloc@p1(strlen(from) + 1,flag); 55*4882a593Smuzhiyun ... when != \(from = E1 \| to = E1 \) 56*4882a593Smuzhiyun if (to==NULL || ...) S 57*4882a593Smuzhiyun ... when != \(from = E2 \| to = E2 \) 58*4882a593Smuzhiyun* strcpy@p2(to, from); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun@r2 depends on !patch exists@ 61*4882a593Smuzhiyunexpression x,from,to; 62*4882a593Smuzhiyunexpression flag,E1,E2,E3; 63*4882a593Smuzhiyunstatement S; 64*4882a593Smuzhiyunposition p1,p2; 65*4882a593Smuzhiyun@@ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun* x = strlen(from) + 1; 68*4882a593Smuzhiyun ... when != \( x = E1 \| from = E1 \) 69*4882a593Smuzhiyun* to = \(kmalloc@p1\|kzalloc@p1\)(x,flag); 70*4882a593Smuzhiyun ... when != \(x = E2 \| from = E2 \| to = E2 \) 71*4882a593Smuzhiyun if (to==NULL || ...) S 72*4882a593Smuzhiyun ... when != \(x = E3 \| from = E3 \| to = E3 \) 73*4882a593Smuzhiyun* memcpy@p2(to, from, x); 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun@script:python depends on org@ 76*4882a593Smuzhiyunp1 << r1.p1; 77*4882a593Smuzhiyunp2 << r1.p2; 78*4882a593Smuzhiyun@@ 79*4882a593Smuzhiyun 80*4882a593Smuzhiyuncocci.print_main("WARNING opportunity for kstrdup",p1) 81*4882a593Smuzhiyuncocci.print_secs("strcpy",p2) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun@script:python depends on org@ 84*4882a593Smuzhiyunp1 << r2.p1; 85*4882a593Smuzhiyunp2 << r2.p2; 86*4882a593Smuzhiyun@@ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyuncocci.print_main("WARNING opportunity for kstrdup",p1) 89*4882a593Smuzhiyuncocci.print_secs("memcpy",p2) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun@script:python depends on report@ 92*4882a593Smuzhiyunp1 << r1.p1; 93*4882a593Smuzhiyunp2 << r1.p2; 94*4882a593Smuzhiyun@@ 95*4882a593Smuzhiyun 96*4882a593Smuzhiyunmsg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line) 97*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg) 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun@script:python depends on report@ 100*4882a593Smuzhiyunp1 << r2.p1; 101*4882a593Smuzhiyunp2 << r2.p2; 102*4882a593Smuzhiyun@@ 103*4882a593Smuzhiyun 104*4882a593Smuzhiyunmsg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line) 105*4882a593Smuzhiyuncoccilib.report.print_report(p1[0], msg) 106