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