1 // SPDX-License-Identifier: GPL-2.0-only << 2 /// Use kstrdup rather than duplicating its im 1 /// Use kstrdup rather than duplicating its implementation 3 /// 2 /// 4 // Confidence: High 3 // Confidence: High 5 // Copyright: (C) 2010-2012 Nicolas Palix. !! 4 // Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 6 // Copyright: (C) 2010-2012 Julia Lawall, INRI !! 5 // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 7 // Copyright: (C) 2010-2012 Gilles Muller, INR !! 6 // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 8 // URL: https://coccinelle.gitlabpages.inria.f !! 7 // URL: http://coccinelle.lip6.fr/ 9 // Comments: 8 // Comments: 10 // Options: --no-includes --include-headers 9 // Options: --no-includes --include-headers 11 10 12 virtual patch 11 virtual patch 13 virtual context 12 virtual context 14 virtual org 13 virtual org 15 virtual report 14 virtual report 16 15 17 @depends on patch@ 16 @depends on patch@ 18 expression from,to; 17 expression from,to; 19 expression flag,E1,E2; 18 expression flag,E1,E2; 20 statement S; 19 statement S; 21 @@ 20 @@ 22 21 23 - to = kmalloc(strlen(from) + 1,flag); 22 - to = kmalloc(strlen(from) + 1,flag); 24 + to = kstrdup(from, flag); 23 + to = kstrdup(from, flag); 25 ... when != \(from = E1 \| to = E1 \) 24 ... when != \(from = E1 \| to = E1 \) 26 if (to==NULL || ...) S 25 if (to==NULL || ...) S 27 ... when != \(from = E2 \| to = E2 \) 26 ... when != \(from = E2 \| to = E2 \) 28 - strcpy(to, from); 27 - strcpy(to, from); 29 28 30 @depends on patch@ 29 @depends on patch@ 31 expression x,from,to; 30 expression x,from,to; 32 expression flag,E1,E2,E3; 31 expression flag,E1,E2,E3; 33 statement S; 32 statement S; 34 @@ 33 @@ 35 34 36 - x = strlen(from) + 1; 35 - x = strlen(from) + 1; 37 ... when != \( x = E1 \| from = E1 \) 36 ... when != \( x = E1 \| from = E1 \) 38 - to = \(kmalloc\|kzalloc\)(x,flag); 37 - to = \(kmalloc\|kzalloc\)(x,flag); 39 + to = kstrdup(from, flag); 38 + to = kstrdup(from, flag); 40 ... when != \(x = E2 \| from = E2 \| to = 39 ... when != \(x = E2 \| from = E2 \| to = E2 \) 41 if (to==NULL || ...) S 40 if (to==NULL || ...) S 42 ... when != \(x = E3 \| from = E3 \| to = 41 ... when != \(x = E3 \| from = E3 \| to = E3 \) 43 - memcpy(to, from, x); 42 - memcpy(to, from, x); 44 43 45 // ------------------------------------------- 44 // --------------------------------------------------------------------- 46 45 47 @r1 depends on !patch exists@ 46 @r1 depends on !patch exists@ 48 expression from,to; 47 expression from,to; 49 expression flag,E1,E2; 48 expression flag,E1,E2; 50 statement S; 49 statement S; 51 position p1,p2; 50 position p1,p2; 52 @@ 51 @@ 53 52 54 * to = kmalloc@p1(strlen(from) + 1,flag); 53 * to = kmalloc@p1(strlen(from) + 1,flag); 55 ... when != \(from = E1 \| to = E1 \) 54 ... when != \(from = E1 \| to = E1 \) 56 if (to==NULL || ...) S 55 if (to==NULL || ...) S 57 ... when != \(from = E2 \| to = E2 \) 56 ... when != \(from = E2 \| to = E2 \) 58 * strcpy@p2(to, from); 57 * strcpy@p2(to, from); 59 58 60 @r2 depends on !patch exists@ 59 @r2 depends on !patch exists@ 61 expression x,from,to; 60 expression x,from,to; 62 expression flag,E1,E2,E3; 61 expression flag,E1,E2,E3; 63 statement S; 62 statement S; 64 position p1,p2; 63 position p1,p2; 65 @@ 64 @@ 66 65 67 * x = strlen(from) + 1; 66 * x = strlen(from) + 1; 68 ... when != \( x = E1 \| from = E1 \) 67 ... when != \( x = E1 \| from = E1 \) 69 * to = \(kmalloc@p1\|kzalloc@p1\)(x,flag); !! 68 * to = \(kmalloc@p1\|kzalloc@p2\)(x,flag); 70 ... when != \(x = E2 \| from = E2 \| to = 69 ... when != \(x = E2 \| from = E2 \| to = E2 \) 71 if (to==NULL || ...) S 70 if (to==NULL || ...) S 72 ... when != \(x = E3 \| from = E3 \| to = 71 ... when != \(x = E3 \| from = E3 \| to = E3 \) 73 * memcpy@p2(to, from, x); 72 * memcpy@p2(to, from, x); 74 73 75 @script:python depends on org@ 74 @script:python depends on org@ 76 p1 << r1.p1; 75 p1 << r1.p1; 77 p2 << r1.p2; 76 p2 << r1.p2; 78 @@ 77 @@ 79 78 80 cocci.print_main("WARNING opportunity for kstr !! 79 cocci.print_main("WARNING opportunity for kstrdep",p1) 81 cocci.print_secs("strcpy",p2) 80 cocci.print_secs("strcpy",p2) 82 81 83 @script:python depends on org@ 82 @script:python depends on org@ 84 p1 << r2.p1; 83 p1 << r2.p1; 85 p2 << r2.p2; 84 p2 << r2.p2; 86 @@ 85 @@ 87 86 88 cocci.print_main("WARNING opportunity for kstr !! 87 cocci.print_main("WARNING opportunity for kstrdep",p1) 89 cocci.print_secs("memcpy",p2) 88 cocci.print_secs("memcpy",p2) 90 89 91 @script:python depends on report@ 90 @script:python depends on report@ 92 p1 << r1.p1; 91 p1 << r1.p1; 93 p2 << r1.p2; 92 p2 << r1.p2; 94 @@ 93 @@ 95 94 96 msg = "WARNING opportunity for kstrdup (strcpy !! 95 msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line) 97 coccilib.report.print_report(p1[0], msg) 96 coccilib.report.print_report(p1[0], msg) 98 97 99 @script:python depends on report@ 98 @script:python depends on report@ 100 p1 << r2.p1; 99 p1 << r2.p1; 101 p2 << r2.p2; 100 p2 << r2.p2; 102 @@ 101 @@ 103 102 104 msg = "WARNING opportunity for kstrdup (memcpy !! 103 msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line) 105 coccilib.report.print_report(p1[0], msg) 104 coccilib.report.print_report(p1[0], msg)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.