18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/// Use kstrdup rather than duplicating its implementation 38c2ecf20Sopenharmony_ci/// 48c2ecf20Sopenharmony_ci// Confidence: High 58c2ecf20Sopenharmony_ci// Copyright: (C) 2010-2012 Nicolas Palix. 68c2ecf20Sopenharmony_ci// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. 78c2ecf20Sopenharmony_ci// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. 88c2ecf20Sopenharmony_ci// URL: http://coccinelle.lip6.fr/ 98c2ecf20Sopenharmony_ci// Comments: 108c2ecf20Sopenharmony_ci// Options: --no-includes --include-headers 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_civirtual patch 138c2ecf20Sopenharmony_civirtual context 148c2ecf20Sopenharmony_civirtual org 158c2ecf20Sopenharmony_civirtual report 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci@depends on patch@ 188c2ecf20Sopenharmony_ciexpression from,to; 198c2ecf20Sopenharmony_ciexpression flag,E1,E2; 208c2ecf20Sopenharmony_cistatement S; 218c2ecf20Sopenharmony_ci@@ 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci- to = kmalloc(strlen(from) + 1,flag); 248c2ecf20Sopenharmony_ci+ to = kstrdup(from, flag); 258c2ecf20Sopenharmony_ci ... when != \(from = E1 \| to = E1 \) 268c2ecf20Sopenharmony_ci if (to==NULL || ...) S 278c2ecf20Sopenharmony_ci ... when != \(from = E2 \| to = E2 \) 288c2ecf20Sopenharmony_ci- strcpy(to, from); 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci@depends on patch@ 318c2ecf20Sopenharmony_ciexpression x,from,to; 328c2ecf20Sopenharmony_ciexpression flag,E1,E2,E3; 338c2ecf20Sopenharmony_cistatement S; 348c2ecf20Sopenharmony_ci@@ 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci- x = strlen(from) + 1; 378c2ecf20Sopenharmony_ci ... when != \( x = E1 \| from = E1 \) 388c2ecf20Sopenharmony_ci- to = \(kmalloc\|kzalloc\)(x,flag); 398c2ecf20Sopenharmony_ci+ to = kstrdup(from, flag); 408c2ecf20Sopenharmony_ci ... when != \(x = E2 \| from = E2 \| to = E2 \) 418c2ecf20Sopenharmony_ci if (to==NULL || ...) S 428c2ecf20Sopenharmony_ci ... when != \(x = E3 \| from = E3 \| to = E3 \) 438c2ecf20Sopenharmony_ci- memcpy(to, from, x); 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci// --------------------------------------------------------------------- 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci@r1 depends on !patch exists@ 488c2ecf20Sopenharmony_ciexpression from,to; 498c2ecf20Sopenharmony_ciexpression flag,E1,E2; 508c2ecf20Sopenharmony_cistatement S; 518c2ecf20Sopenharmony_ciposition p1,p2; 528c2ecf20Sopenharmony_ci@@ 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci* to = kmalloc@p1(strlen(from) + 1,flag); 558c2ecf20Sopenharmony_ci ... when != \(from = E1 \| to = E1 \) 568c2ecf20Sopenharmony_ci if (to==NULL || ...) S 578c2ecf20Sopenharmony_ci ... when != \(from = E2 \| to = E2 \) 588c2ecf20Sopenharmony_ci* strcpy@p2(to, from); 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci@r2 depends on !patch exists@ 618c2ecf20Sopenharmony_ciexpression x,from,to; 628c2ecf20Sopenharmony_ciexpression flag,E1,E2,E3; 638c2ecf20Sopenharmony_cistatement S; 648c2ecf20Sopenharmony_ciposition p1,p2; 658c2ecf20Sopenharmony_ci@@ 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci* x = strlen(from) + 1; 688c2ecf20Sopenharmony_ci ... when != \( x = E1 \| from = E1 \) 698c2ecf20Sopenharmony_ci* to = \(kmalloc@p1\|kzalloc@p1\)(x,flag); 708c2ecf20Sopenharmony_ci ... when != \(x = E2 \| from = E2 \| to = E2 \) 718c2ecf20Sopenharmony_ci if (to==NULL || ...) S 728c2ecf20Sopenharmony_ci ... when != \(x = E3 \| from = E3 \| to = E3 \) 738c2ecf20Sopenharmony_ci* memcpy@p2(to, from, x); 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci@script:python depends on org@ 768c2ecf20Sopenharmony_cip1 << r1.p1; 778c2ecf20Sopenharmony_cip2 << r1.p2; 788c2ecf20Sopenharmony_ci@@ 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cicocci.print_main("WARNING opportunity for kstrdup",p1) 818c2ecf20Sopenharmony_cicocci.print_secs("strcpy",p2) 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci@script:python depends on org@ 848c2ecf20Sopenharmony_cip1 << r2.p1; 858c2ecf20Sopenharmony_cip2 << r2.p2; 868c2ecf20Sopenharmony_ci@@ 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_cicocci.print_main("WARNING opportunity for kstrdup",p1) 898c2ecf20Sopenharmony_cicocci.print_secs("memcpy",p2) 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci@script:python depends on report@ 928c2ecf20Sopenharmony_cip1 << r1.p1; 938c2ecf20Sopenharmony_cip2 << r1.p2; 948c2ecf20Sopenharmony_ci@@ 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_cimsg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line) 978c2ecf20Sopenharmony_cicoccilib.report.print_report(p1[0], msg) 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ci@script:python depends on report@ 1008c2ecf20Sopenharmony_cip1 << r2.p1; 1018c2ecf20Sopenharmony_cip2 << r2.p2; 1028c2ecf20Sopenharmony_ci@@ 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cimsg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line) 1058c2ecf20Sopenharmony_cicoccilib.report.print_report(p1[0], msg) 106