17f904d7eSThomas Gleixner// SPDX-License-Identifier: GPL-2.0-only 2998f5523SNicolas Palix/// Use kstrdup rather than duplicating its implementation 3998f5523SNicolas Palix/// 4998f5523SNicolas Palix// Confidence: High 57f904d7eSThomas Gleixner// Copyright: (C) 2010-2012 Nicolas Palix. 67f904d7eSThomas Gleixner// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. 77f904d7eSThomas Gleixner// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. 8*f01701ceSJulia Lawall// URL: https://coccinelle.gitlabpages.inria.fr/website 9998f5523SNicolas Palix// Comments: 1093f14468SNicolas Palix// Options: --no-includes --include-headers 11998f5523SNicolas Palix 12998f5523SNicolas Palixvirtual patch 1329a36d4dSJulia Lawallvirtual context 1429a36d4dSJulia Lawallvirtual org 1529a36d4dSJulia Lawallvirtual report 16998f5523SNicolas Palix 1729a36d4dSJulia Lawall@depends on patch@ 18998f5523SNicolas Palixexpression from,to; 19998f5523SNicolas Palixexpression flag,E1,E2; 20998f5523SNicolas Palixstatement S; 21998f5523SNicolas Palix@@ 22998f5523SNicolas Palix 23998f5523SNicolas Palix- to = kmalloc(strlen(from) + 1,flag); 24998f5523SNicolas Palix+ to = kstrdup(from, flag); 25998f5523SNicolas Palix ... when != \(from = E1 \| to = E1 \) 26998f5523SNicolas Palix if (to==NULL || ...) S 27998f5523SNicolas Palix ... when != \(from = E2 \| to = E2 \) 28998f5523SNicolas Palix- strcpy(to, from); 29998f5523SNicolas Palix 3029a36d4dSJulia Lawall@depends on patch@ 31998f5523SNicolas Palixexpression x,from,to; 32998f5523SNicolas Palixexpression flag,E1,E2,E3; 33998f5523SNicolas Palixstatement S; 34998f5523SNicolas Palix@@ 35998f5523SNicolas Palix 36998f5523SNicolas Palix- x = strlen(from) + 1; 37998f5523SNicolas Palix ... when != \( x = E1 \| from = E1 \) 38998f5523SNicolas Palix- to = \(kmalloc\|kzalloc\)(x,flag); 39998f5523SNicolas Palix+ to = kstrdup(from, flag); 40998f5523SNicolas Palix ... when != \(x = E2 \| from = E2 \| to = E2 \) 41998f5523SNicolas Palix if (to==NULL || ...) S 42998f5523SNicolas Palix ... when != \(x = E3 \| from = E3 \| to = E3 \) 43998f5523SNicolas Palix- memcpy(to, from, x); 4429a36d4dSJulia Lawall 4529a36d4dSJulia Lawall// --------------------------------------------------------------------- 4629a36d4dSJulia Lawall 4729a36d4dSJulia Lawall@r1 depends on !patch exists@ 4829a36d4dSJulia Lawallexpression from,to; 4929a36d4dSJulia Lawallexpression flag,E1,E2; 5029a36d4dSJulia Lawallstatement S; 5129a36d4dSJulia Lawallposition p1,p2; 5229a36d4dSJulia Lawall@@ 5329a36d4dSJulia Lawall 5429a36d4dSJulia Lawall* to = kmalloc@p1(strlen(from) + 1,flag); 5529a36d4dSJulia Lawall ... when != \(from = E1 \| to = E1 \) 5629a36d4dSJulia Lawall if (to==NULL || ...) S 5729a36d4dSJulia Lawall ... when != \(from = E2 \| to = E2 \) 5829a36d4dSJulia Lawall* strcpy@p2(to, from); 5929a36d4dSJulia Lawall 6029a36d4dSJulia Lawall@r2 depends on !patch exists@ 6129a36d4dSJulia Lawallexpression x,from,to; 6229a36d4dSJulia Lawallexpression flag,E1,E2,E3; 6329a36d4dSJulia Lawallstatement S; 6429a36d4dSJulia Lawallposition p1,p2; 6529a36d4dSJulia Lawall@@ 6629a36d4dSJulia Lawall 6729a36d4dSJulia Lawall* x = strlen(from) + 1; 6829a36d4dSJulia Lawall ... when != \( x = E1 \| from = E1 \) 692fbecb7dSDenis Efremov* to = \(kmalloc@p1\|kzalloc@p1\)(x,flag); 7029a36d4dSJulia Lawall ... when != \(x = E2 \| from = E2 \| to = E2 \) 7129a36d4dSJulia Lawall if (to==NULL || ...) S 7229a36d4dSJulia Lawall ... when != \(x = E3 \| from = E3 \| to = E3 \) 7329a36d4dSJulia Lawall* memcpy@p2(to, from, x); 7429a36d4dSJulia Lawall 7529a36d4dSJulia Lawall@script:python depends on org@ 7629a36d4dSJulia Lawallp1 << r1.p1; 7729a36d4dSJulia Lawallp2 << r1.p2; 7829a36d4dSJulia Lawall@@ 7929a36d4dSJulia Lawall 80a3b0b6f9SRikard Falkeborncocci.print_main("WARNING opportunity for kstrdup",p1) 8129a36d4dSJulia Lawallcocci.print_secs("strcpy",p2) 8229a36d4dSJulia Lawall 8329a36d4dSJulia Lawall@script:python depends on org@ 8429a36d4dSJulia Lawallp1 << r2.p1; 8529a36d4dSJulia Lawallp2 << r2.p2; 8629a36d4dSJulia Lawall@@ 8729a36d4dSJulia Lawall 88a3b0b6f9SRikard Falkeborncocci.print_main("WARNING opportunity for kstrdup",p1) 8929a36d4dSJulia Lawallcocci.print_secs("memcpy",p2) 9029a36d4dSJulia Lawall 9129a36d4dSJulia Lawall@script:python depends on report@ 9229a36d4dSJulia Lawallp1 << r1.p1; 9329a36d4dSJulia Lawallp2 << r1.p2; 9429a36d4dSJulia Lawall@@ 9529a36d4dSJulia Lawall 96a3b0b6f9SRikard Falkebornmsg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line) 9729a36d4dSJulia Lawallcoccilib.report.print_report(p1[0], msg) 9829a36d4dSJulia Lawall 9929a36d4dSJulia Lawall@script:python depends on report@ 10029a36d4dSJulia Lawallp1 << r2.p1; 10129a36d4dSJulia Lawallp2 << r2.p2; 10229a36d4dSJulia Lawall@@ 10329a36d4dSJulia Lawall 104a3b0b6f9SRikard Falkebornmsg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line) 10529a36d4dSJulia Lawallcoccilib.report.print_report(p1[0], msg) 106