162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/// Use kmemdup 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@r1@
1862306a36Sopenharmony_ciexpression from,to;
1962306a36Sopenharmony_ciexpression flag;
2062306a36Sopenharmony_ciposition p;
2162306a36Sopenharmony_ci@@
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci   to = \(kmalloc@p\|kzalloc@p\)(strlen(from) + 1,flag);
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci@r2@
2662306a36Sopenharmony_ciexpression x,from,to;
2762306a36Sopenharmony_ciexpression flag,E1;
2862306a36Sopenharmony_ciposition p;
2962306a36Sopenharmony_ci@@
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci    x = strlen(from) + 1;
3262306a36Sopenharmony_ci    ... when != \( x = E1 \| from = E1 \)
3362306a36Sopenharmony_ci    to = \(kmalloc@p\|kzalloc@p\)(x,flag);
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci@depends on patch@
3662306a36Sopenharmony_ciexpression from,to,size,flag;
3762306a36Sopenharmony_ciposition p != {r1.p,r2.p};
3862306a36Sopenharmony_cistatement S;
3962306a36Sopenharmony_ci@@
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci-  to = \(kmalloc@p\|kzalloc@p\)(size,flag);
4262306a36Sopenharmony_ci+  to = kmemdup(from,size,flag);
4362306a36Sopenharmony_ci   if (to==NULL || ...) S
4462306a36Sopenharmony_ci-  memcpy(to, from, size);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci@r depends on !patch@
4762306a36Sopenharmony_ciexpression from,to,size,flag;
4862306a36Sopenharmony_ciposition p != {r1.p,r2.p};
4962306a36Sopenharmony_cistatement S;
5062306a36Sopenharmony_ci@@
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci*  to = \(kmalloc@p\|kzalloc@p\)(size,flag);
5362306a36Sopenharmony_ci   if (to==NULL || ...) S
5462306a36Sopenharmony_ci*  memcpy(to, from, size);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci@script:python depends on org@
5762306a36Sopenharmony_cip << r.p;
5862306a36Sopenharmony_ci@@
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cicoccilib.org.print_todo(p[0], "WARNING opportunity for kmemdup")
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci@script:python depends on report@
6362306a36Sopenharmony_cip << r.p;
6462306a36Sopenharmony_ci@@
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cicoccilib.report.print_report(p[0], "WARNING opportunity for kmemdup")
67