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