162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/// Use kstrdup rather than duplicating its implementation 362306a36Sopenharmony_ci/// 462306a36Sopenharmony_ci// Confidence: High 562306a36Sopenharmony_ci// Copyright: (C) 2010-2012 Nicolas Palix. 662306a36Sopenharmony_ci// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. 762306a36Sopenharmony_ci// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. 862306a36Sopenharmony_ci// URL: https://coccinelle.gitlabpages.inria.fr/website 962306a36Sopenharmony_ci// Comments: 1062306a36Sopenharmony_ci// Options: --no-includes --include-headers 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_civirtual patch 1362306a36Sopenharmony_civirtual context 1462306a36Sopenharmony_civirtual org 1562306a36Sopenharmony_civirtual report 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci@depends on patch@ 1862306a36Sopenharmony_ciexpression from,to; 1962306a36Sopenharmony_ciexpression flag,E1,E2; 2062306a36Sopenharmony_cistatement S; 2162306a36Sopenharmony_ci@@ 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci- to = kmalloc(strlen(from) + 1,flag); 2462306a36Sopenharmony_ci+ to = kstrdup(from, flag); 2562306a36Sopenharmony_ci ... when != \(from = E1 \| to = E1 \) 2662306a36Sopenharmony_ci if (to==NULL || ...) S 2762306a36Sopenharmony_ci ... when != \(from = E2 \| to = E2 \) 2862306a36Sopenharmony_ci- strcpy(to, from); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci@depends on patch@ 3162306a36Sopenharmony_ciexpression x,from,to; 3262306a36Sopenharmony_ciexpression flag,E1,E2,E3; 3362306a36Sopenharmony_cistatement S; 3462306a36Sopenharmony_ci@@ 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci- x = strlen(from) + 1; 3762306a36Sopenharmony_ci ... when != \( x = E1 \| from = E1 \) 3862306a36Sopenharmony_ci- to = \(kmalloc\|kzalloc\)(x,flag); 3962306a36Sopenharmony_ci+ to = kstrdup(from, flag); 4062306a36Sopenharmony_ci ... when != \(x = E2 \| from = E2 \| to = E2 \) 4162306a36Sopenharmony_ci if (to==NULL || ...) S 4262306a36Sopenharmony_ci ... when != \(x = E3 \| from = E3 \| to = E3 \) 4362306a36Sopenharmony_ci- memcpy(to, from, x); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci// --------------------------------------------------------------------- 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci@r1 depends on !patch exists@ 4862306a36Sopenharmony_ciexpression from,to; 4962306a36Sopenharmony_ciexpression flag,E1,E2; 5062306a36Sopenharmony_cistatement S; 5162306a36Sopenharmony_ciposition p1,p2; 5262306a36Sopenharmony_ci@@ 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci* to = kmalloc@p1(strlen(from) + 1,flag); 5562306a36Sopenharmony_ci ... when != \(from = E1 \| to = E1 \) 5662306a36Sopenharmony_ci if (to==NULL || ...) S 5762306a36Sopenharmony_ci ... when != \(from = E2 \| to = E2 \) 5862306a36Sopenharmony_ci* strcpy@p2(to, from); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci@r2 depends on !patch exists@ 6162306a36Sopenharmony_ciexpression x,from,to; 6262306a36Sopenharmony_ciexpression flag,E1,E2,E3; 6362306a36Sopenharmony_cistatement S; 6462306a36Sopenharmony_ciposition p1,p2; 6562306a36Sopenharmony_ci@@ 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci* x = strlen(from) + 1; 6862306a36Sopenharmony_ci ... when != \( x = E1 \| from = E1 \) 6962306a36Sopenharmony_ci* to = \(kmalloc@p1\|kzalloc@p1\)(x,flag); 7062306a36Sopenharmony_ci ... when != \(x = E2 \| from = E2 \| to = E2 \) 7162306a36Sopenharmony_ci if (to==NULL || ...) S 7262306a36Sopenharmony_ci ... when != \(x = E3 \| from = E3 \| to = E3 \) 7362306a36Sopenharmony_ci* memcpy@p2(to, from, x); 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci@script:python depends on org@ 7662306a36Sopenharmony_cip1 << r1.p1; 7762306a36Sopenharmony_cip2 << r1.p2; 7862306a36Sopenharmony_ci@@ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cicocci.print_main("WARNING opportunity for kstrdup",p1) 8162306a36Sopenharmony_cicocci.print_secs("strcpy",p2) 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci@script:python depends on org@ 8462306a36Sopenharmony_cip1 << r2.p1; 8562306a36Sopenharmony_cip2 << r2.p2; 8662306a36Sopenharmony_ci@@ 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cicocci.print_main("WARNING opportunity for kstrdup",p1) 8962306a36Sopenharmony_cicocci.print_secs("memcpy",p2) 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci@script:python depends on report@ 9262306a36Sopenharmony_cip1 << r1.p1; 9362306a36Sopenharmony_cip2 << r1.p2; 9462306a36Sopenharmony_ci@@ 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_cimsg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line) 9762306a36Sopenharmony_cicoccilib.report.print_report(p1[0], msg) 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci@script:python depends on report@ 10062306a36Sopenharmony_cip1 << r2.p1; 10162306a36Sopenharmony_cip2 << r2.p2; 10262306a36Sopenharmony_ci@@ 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cimsg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line) 10562306a36Sopenharmony_cicoccilib.report.print_report(p1[0], msg) 106