1+ var cp = require ( "child_process" )
2+
3+ module . exports = function ( name ) {
4+ cp . exec ( "rm -rf " + name ) ; // NOT OK
5+
6+ cp . execFile ( name , [ name ] ) ; // OK
7+ cp . execFile ( name , name ) ; // OK
8+ } ;
9+
10+ module . exports . foo = function ( name ) {
11+ cp . exec ( "rm -rf " + name ) ; // NOT OK
12+ }
13+
14+ module . exports . foo . bar = function ( name ) {
15+ cp . exec ( "rm -rf " + name ) ; // NOT OK
16+ }
17+
18+ function cla ( ) { }
19+ cla . prototype . method = function ( name ) {
20+ cp . exec ( "rm -rf " + name ) ; // NOT OK
21+ }
22+ module . exports = new cla ( ) ;
23+
24+
25+ function cla2 ( ) { }
26+ cla2 . prototype . method = function ( name ) {
27+ cp . exec ( "rm -rf " + name ) ; // NOT OK
28+ }
29+ module . exports . bla = new cla2 ( ) ;
30+
31+ module . exports . lib2 = require ( "./lib2.js" )
32+
33+ class Cla3 {
34+ constructor ( name ) {
35+ cp . exec ( "rm -rf " + name ) ; // NOT OK
36+ }
37+ static foo ( name ) {
38+ cp . exec ( "rm -rf " + name ) ; // NOT OK
39+ }
40+ bar ( name ) {
41+ cp . exec ( "rm -rf " + name ) ; // NOT OK
42+
43+ cp . exec ( "rm -rf " + notASource ) ; // OK
44+ }
45+ }
46+
47+ module . exports . cla3 = Cla3 ;
48+
49+ module . exports . mz = function ( name ) {
50+ require ( "mz/child_process" ) . exec ( "rm -rf " + name ) ; // NOT OK.
51+ }
52+
53+ module . exports . flow = function ( name ) {
54+ var cmd1 = "rm -rf " + name ;
55+ cp . exec ( cmd1 ) ; // NOT OK.
56+
57+ var cmd2 = "rm -rf " + name ;
58+ function myExec ( cmd ) {
59+ cp . exec ( cmd ) ; // NOT OK.
60+ }
61+ myExec ( cmd2 ) ;
62+ }
63+
64+ module . exports . stringConcat = function ( name ) {
65+ cp . exec ( "rm -rf " + name ) ; // NOT OK.
66+
67+ cp . exec ( name ) ; // OK.
68+
69+ cp . exec ( "for foo in (" + name + ") do bla end" ) ; // OK.
70+
71+ cp . exec ( "cat /foO/BAR/" + name ) // NOT OK.
72+
73+ cp . exec ( "cat \"" + name + "\"" ) // NOT OK.
74+
75+ cp . exec ( "cat '" + name + "'" ) // NOT OK.
76+
77+ cp . exec ( "cat '/foo/bar" + name + "'" ) // NOT OK.
78+
79+ cp . exec ( name + " some file" ) // OK.
80+ }
81+
82+ module . exports . arrays = function ( name ) {
83+ cp . exec ( "rm -rf " + name ) ; // NOT OK.
84+
85+ var args1 = [ "node" ] ;
86+ args1 . push ( name ) ;
87+ cp . exec ( args1 . join ( " " ) ) ; // NOT OK.
88+
89+ cp . exec ( [ "rm -rf" , name ] . join ( " " ) ) ; // NOT OK.
90+
91+ cp . exec ( [ "rm -rf" , "\"" + name + "\"" ] . join ( " " ) ) ; // NOT OK.
92+
93+ cp . execFile ( "rm" , [ "-rf" , name ] ) ; // OK
94+ }
95+
96+ var util = require ( "util" ) ;
97+ module . exports . format = function ( name ) {
98+ cp . exec ( util . format ( "rm -rf %s" , name ) ) ; // NOT OK
99+
100+ cp . exec ( util . format ( "rm -rf '%s'" , name ) ) ; // NOT OK
101+
102+ cp . exec ( util . format ( "rm -rf '/foo/bar/%s'" , name ) ) ; // NOT OK
103+
104+ cp . exec ( util . format ( "%s foo/bar" , name ) ) ; // OK
105+
106+ cp . exec ( util . format ( "for foo in (%s) do bar end" , name ) ) ; // OK
107+
108+ cp . exec ( require ( "printf" ) ( 'rm -rf %s' , name ) ) ; // NOT OK
109+ }
110+
111+ module . exports . valid = function ( name ) {
112+ cp . exec ( "rm -rf " + name ) ; // NOT OK
113+
114+ if ( ! isValidName ( name ) ) {
115+ return ;
116+ }
117+ cp . exec ( "rm -rf " + name ) ; // OK
118+ }
119+
120+ module . exports . safe = function ( name ) {
121+ cp . exec ( "rm -rf " + name ) ; // NOT OK
122+
123+ if ( ! isSafeName ( name ) ) {
124+ return ;
125+ }
126+ cp . exec ( "rm -rf " + name ) ; // OK
127+ }
128+
129+ class Cla4 {
130+ wha ( name ) {
131+ cp . exec ( "rm -rf " + name ) ; // NOT OK
132+ }
133+
134+ static bla ( name ) {
135+ cp . exec ( "rm -rf " + name ) ; // OK - not exported
136+ }
137+ constructor ( name ) {
138+ cp . exec ( "rm -rf " + name ) ; // OK - not exported
139+ }
140+ }
141+ module . exports . cla4 = new Cla4 ( ) ;
142+
143+ function Cla5 ( name ) {
144+ cp . exec ( "rm -rf " + name ) ; // OK - not exported
145+ }
146+ module . exports . cla5 = new Cla5 ( ) ;
147+
148+ module . exports . indirect = function ( name ) {
149+ let cmd = "rm -rf " + name ;
150+ let sh = "sh" ;
151+ let args = [ "-c" , cmd ] ;
152+ cp . spawn ( sh , args , cb ) ; // NOT OK
153+ }
154+
155+ module . exports . indirect2 = function ( name ) {
156+ let cmd = name ;
157+ let sh = "sh" ;
158+ let args = [ "-c" , cmd ] ;
159+ cp . spawn ( sh , args , cb ) ; // OK
160+
161+ let cmd2 = "rm -rf " + name ;
162+ var args2 = [ cmd2 ] ;
163+ cp . spawn (
164+ 'cmd.exe' ,
165+ [ '/C' , editor ] . concat ( args2 ) ,
166+ { stdio : 'inherit' }
167+ ) ;
168+ }
169+
170+ module . exports . cmd = function ( command , name ) {
171+ cp . exec ( "fo | " + command ) ; // OK
172+
173+ cp . exec ( "fo | " + name ) ; // NOT OK
174+
175+ }
176+
177+ module . exports . sanitizer = function ( name ) {
178+ var sanitized = "'" + name . replace ( / ' / g, "'\\''" ) + "'"
179+ cp . exec ( "rm -rf " + sanitized ) ; // OK
180+
181+ var broken = "'" + name . replace ( / ' / g, "'\''" ) + "'"
182+ cp . exec ( "rm -rf " + broken ) ; // NOT OK
183+ }
184+
185+ var path = require ( "path" ) ;
186+ module . exports . guard = function ( name ) {
187+ cp . exec ( "rm -rf " + name ) ; // NOT OK
188+
189+ if ( ! path . exist ( name ) ) {
190+ cp . exec ( "rm -rf " + name ) ; // NOT OK
191+ return ;
192+ }
193+ cp . exec ( "rm -rf " + name ) ; // OK
194+ }
195+
196+ module . exports . blacklistOfChars = function ( name ) {
197+ cp . exec ( "rm -rf " + name ) ; // NOT OK
198+
199+ if ( / [ ^ A - Z a - z 0 - 9 _ \/ : = - ] / . test ( name ) ) {
200+ cp . exec ( "rm -rf " + name ) ; // NOT OK
201+ } else {
202+ cp . exec ( "rm -rf " + name ) ; // OK
203+ }
204+ }
205+
206+ module . exports . whitelistOfChars = function ( name ) {
207+ cp . exec ( "rm -rf " + name ) ; // NOT OK
208+
209+ if ( / ^ [ A - Z a - z 0 - 9 _ \/ : = - ] $ / . test ( name ) ) {
210+ cp . exec ( "rm -rf " + name ) ; // OK
211+ } else {
212+ cp . exec ( "rm -rf " + name ) ; // NOT OK
213+ }
214+ }
215+
216+ module . exports . blackList2 = function ( name ) {
217+ cp . exec ( "rm -rf " + name ) ; // NOT OK
218+
219+ if ( ! / ^ ( [ a - z A - Z 0 - 9 ] + ) ) ? $ / . test ( name ) ) {
220+ cp . exec ( "rm -rf " + name ) ; // NOT OK
221+ process . exit ( - 1 ) ;
222+ }
223+
224+ cp . exec ( "rm -rf " + name ) ; // OK - but FP due to tracking flow through `process.exit()`.
225+ }
226+
227+ module . exports . accessSync = function ( name ) {
228+ cp . exec ( "rm -rf " + name ) ; // NOT OK
229+
230+ try {
231+ path . accessSync ( name ) ;
232+ } catch ( e ) {
233+ return ;
234+ }
235+
236+ cp . exec ( "rm -rf " + name ) ; // OK - but FP due to `path.accessSync` not being recognized as a sanitizer.
237+ }
238+
239+ var cleanInput = function ( s ) {
240+ if ( / [ ^ A - Z a - z 0 - 9 _ \/ : = - ] / . test ( s ) ) {
241+ s = "'" + s . replace ( / ' / g, "'\\''" ) + "'" ;
242+ s = s . replace ( / ^ (?: ' ' ) + / g, '' ) // unduplicate single-quote at the beginning
243+ . replace ( / \\ ' ' ' / g, "\\'" ) ; // remove non-escaped single-quote if there are enclosed between 2 escaped
244+ }
245+ return s ;
246+ }
247+
248+ module . exports . goodSanitizer = function ( name ) {
249+ cp . exec ( "rm -rf " + name ) ; // NOT OK
250+
251+ var cleaned = cleanInput ( name ) ;
252+
253+ cp . exec ( "rm -rf " + cleaned ) ; // OK
254+ }
255+
256+ var fs = require ( "fs" ) ;
257+ module . exports . guard2 = function ( name ) {
258+ cp . exec ( "rm -rf " + name ) ; // NOT OK
259+
260+ if ( ! fs . existsSync ( "prefix/" + name ) ) {
261+ cp . exec ( "rm -rf prefix/" + name ) ; // NOT OK
262+ return ;
263+ }
264+ cp . exec ( "rm -rf prefix/" + name ) ; // OK
265+ }
266+
267+ module . exports . sanitizerProperty = function ( obj ) {
268+ cp . exec ( "rm -rf " + obj . version ) ; // NOT OK
269+
270+ obj . version = "" ;
271+
272+ cp . exec ( "rm -rf " + obj . version ) ; // OK - but FP
273+ }
0 commit comments