@@ -106,8 +106,11 @@ static int write_tmp_file(int fd, int n, char *word[])
106
106
if (!strcmp (word [0 ] + len - strlen ("acrn-dm" ), "acrn-dm" )) {
107
107
find_acrn_dm ++ ;
108
108
memset (buf , 0 , sizeof (buf ));
109
- snprintf (buf , sizeof (buf ), "%s gentmpfile" ,
110
- acrnctl_bin_path );
109
+ if (snprintf (buf , sizeof (buf ), "%s gentmpfile" ,
110
+ acrnctl_bin_path ) >= sizeof (buf )) {
111
+ printf ("ERROR: acrnctl bin path is truncated\n" );
112
+ return -1 ;
113
+ }
111
114
ret = write (fd , buf , strlen (buf ));
112
115
if (ret < 0 )
113
116
return -1 ;
@@ -117,7 +120,8 @@ static int write_tmp_file(int fd, int n, char *word[])
117
120
118
121
while (i < n ) {
119
122
memset (buf , 0 , sizeof (buf ));
120
- snprintf (buf , sizeof (buf ), " %s" , word [i ]);
123
+ if (snprintf (buf , sizeof (buf ), " %s" , word [i ]) >= sizeof (buf ))
124
+ printf ("WARN: buf is truncated\n" );
121
125
i ++ ;
122
126
ret = write (fd , buf , strlen (buf ));
123
127
if (ret < 0 )
@@ -191,7 +195,12 @@ static int acrnctl_do_add(int argc, char *argv[])
191
195
192
196
/* open tmp file for write */
193
197
memset (fname , 0 , sizeof (fname ));
194
- snprintf (fname , sizeof (fname ), "%s%s" , argv [1 ], TMP_FILE_SUFFIX );
198
+ if (snprintf (fname , sizeof (fname ), "%s%s" , argv [1 ], TMP_FILE_SUFFIX )
199
+ >= sizeof (fname )) {
200
+ printf ("ERROR: file name is truncated\n" );
201
+ ret = -1 ;
202
+ goto file_exceed ;
203
+ }
195
204
fd_tmp = open (fname , O_RDWR | O_CREAT | O_TRUNC , 0666 );
196
205
if (fd_tmp < 0 ) {
197
206
perror (fname );
@@ -229,29 +238,50 @@ static int acrnctl_do_add(int argc, char *argv[])
229
238
goto no_acrn_dm ;
230
239
}
231
240
232
- snprintf (cmd , sizeof (cmd ), "mv %s %s.back" , argv [1 ], argv [1 ]);
241
+ if (snprintf (cmd , sizeof (cmd ), "mv %s %s.back" , argv [1 ], argv [1 ])
242
+ >= sizeof (cmd )) {
243
+ printf ("ERROR: cmd is truncated\n" );
244
+ ret = -1 ;
245
+ goto get_vmname ;
246
+ }
233
247
system (cmd );
234
248
235
- snprintf (cmd , sizeof (cmd ), "mv %s %s" , fname , argv [1 ]);
249
+ if (snprintf (cmd , sizeof (cmd ), "mv %s %s" , fname , argv [1 ]) >= sizeof (cmd )) {
250
+ printf ("ERROR: cmd is truncated\n" );
251
+ ret = -1 ;
252
+ goto get_vmname ;
253
+ }
236
254
system (cmd );
237
255
238
256
memset (vmname , 0 , sizeof (vmname ));
239
- snprintf (cmd , sizeof (cmd ), "bash %s%s >./%s.result" , argv [1 ],
240
- args , argv [1 ]);
257
+ if (snprintf (cmd , sizeof (cmd ), "bash %s%s >./%s.result" , argv [1 ],
258
+ args , argv [1 ]) >= sizeof (cmd )) {
259
+ printf ("ERROR: cmd is truncated\n" );
260
+ ret = -1 ;
261
+ goto get_vmname ;
262
+ }
241
263
ret = shell_cmd (cmd , cmd_out , sizeof (cmd_out ));
242
264
if (ret < 0 )
243
265
goto get_vmname ;
244
266
245
- snprintf (cmd , sizeof (cmd ), "grep -a \"acrnctl: \" ./%s.result" ,
246
- argv [1 ]);
267
+ if (snprintf (cmd , sizeof (cmd ), "grep -a \"acrnctl: \" ./%s.result" ,
268
+ argv [1 ]) >= sizeof (cmd )) {
269
+ printf ("ERROR: cmd is truncated\n" );
270
+ ret = -1 ;
271
+ goto get_vmname ;
272
+ }
247
273
ret = shell_cmd (cmd , cmd_out , sizeof (cmd_out ));
248
274
if (ret < 0 )
249
275
goto get_vmname ;
250
276
251
277
ret = sscanf (cmd_out , "acrnctl: %s" , vmname );
252
278
if (ret != 1 ) {
253
279
ret = -1 ;
254
- snprintf (cmd , sizeof (cmd ), "cat ./%s.result" , argv [1 ]);
280
+
281
+ if (snprintf (cmd , sizeof (cmd ), "cat ./%s.result" , argv [1 ]) >= sizeof (cmd )) {
282
+ printf ("ERROR: cmd is truncated\n" );
283
+ goto get_vmname ;
284
+ }
255
285
shell_cmd (cmd , cmd_out , sizeof (cmd_out ));
256
286
257
287
/* Properly null-terminate cmd_out */
@@ -270,7 +300,12 @@ static int acrnctl_do_add(int argc, char *argv[])
270
300
goto get_vmname ;
271
301
}
272
302
273
- snprintf (cmd , sizeof (cmd ), "mkdir -p %s/add" , ACRNCTL_OPT_ROOT );
303
+ if (snprintf (cmd , sizeof (cmd ), "mkdir -p %s/add" , ACRNCTL_OPT_ROOT )
304
+ >= sizeof (cmd )) {
305
+ printf ("ERROR: cmd is truncated\n" );
306
+ ret = -1 ;
307
+ goto get_vmname ;
308
+ }
274
309
system (cmd );
275
310
276
311
s = vmmngr_find (vmname );
@@ -281,29 +316,47 @@ static int acrnctl_do_add(int argc, char *argv[])
281
316
goto vm_exist ;
282
317
}
283
318
284
- snprintf (cmd , sizeof (cmd ), "cp %s.back %s/add/%s.sh" , argv [1 ],
285
- ACRNCTL_OPT_ROOT , vmname );
319
+ if (snprintf (cmd , sizeof (cmd ), "cp %s.back %s/add/%s.sh" , argv [1 ],
320
+ ACRNCTL_OPT_ROOT , vmname ) >= sizeof (cmd )) {
321
+ printf ("ERROR: cmd is truncated\n" );
322
+ ret = -1 ;
323
+ goto vm_exist ;
324
+ }
286
325
system (cmd );
287
326
288
- snprintf (cmd , sizeof (cmd ), "echo %s >%s/add/%s.args" , args ,
289
- ACRNCTL_OPT_ROOT , vmname );
327
+ if (snprintf (cmd , sizeof (cmd ), "echo %s >%s/add/%s.args" , args ,
328
+ ACRNCTL_OPT_ROOT , vmname ) >= sizeof (cmd )) {
329
+ printf ("ERROR: cmd is truncated\n" );
330
+ ret = -1 ;
331
+ goto vm_exist ;
332
+ }
290
333
system (cmd );
291
334
printf ("%s added\n" , vmname );
292
335
293
336
vm_exist :
294
337
get_vmname :
295
- snprintf (cmd , sizeof (cmd ), "rm -f ./%s.result" , argv [1 ]);
296
- system (cmd );
338
+ if (snprintf (cmd , sizeof (cmd ), "rm -f ./%s.result" , argv [1 ]) >= sizeof (cmd )) {
339
+ printf ("WARN: cmd is truncated\n" );
340
+ } else
341
+ system (cmd );
297
342
298
- snprintf (cmd , sizeof (cmd ), "mv %s %s" , argv [1 ], fname );
299
- system (cmd );
343
+ if (snprintf (cmd , sizeof (cmd ), "mv %s %s" , argv [1 ], fname ) >= sizeof (cmd )) {
344
+ printf ("ERROR: cmd is truncated\n" );
345
+ ret = -1 ;
346
+ } else
347
+ system (cmd );
300
348
301
- snprintf (cmd , sizeof (cmd ), "mv %s.back %s" , argv [1 ], argv [1 ]);
302
- system (cmd );
349
+ if (snprintf (cmd , sizeof (cmd ), "mv %s.back %s" , argv [1 ], argv [1 ]) >= sizeof (cmd )) {
350
+ printf ("ERROR: cmd is truncated\n" );
351
+ ret = -1 ;
352
+ } else
353
+ system (cmd );
303
354
304
355
no_acrn_dm :
305
- snprintf (cmd , sizeof (cmd ), "rm -f %s" , fname );
306
- system (cmd );
356
+ if (snprintf (cmd , sizeof (cmd ), "rm -f %s" , fname ) >= sizeof (cmd )) {
357
+ printf ("WARN: cmd is truncated\n" );
358
+ } else
359
+ system (cmd );
307
360
write_tmpfile :
308
361
close (fd_tmp );
309
362
open_tmp_file :
@@ -355,11 +408,17 @@ static int acrnctl_do_del(int argc, char *argv[])
355
408
state_str [s -> state ]);
356
409
continue ;
357
410
}
358
- snprintf (cmd , sizeof (cmd ), "rm -f %s/add/%s.sh" ,
359
- ACRNCTL_OPT_ROOT , argv [i ]);
411
+ if (snprintf (cmd , sizeof (cmd ), "rm -f %s/add/%s.sh" ,
412
+ ACRNCTL_OPT_ROOT , argv [i ]) >= sizeof (cmd )) {
413
+ printf ("WARN: cmd is truncated\n" );
414
+ return -1 ;
415
+ }
360
416
system (cmd );
361
- snprintf (cmd , sizeof (cmd ), "rm -f %s/add/%s.args" ,
362
- ACRNCTL_OPT_ROOT , argv [i ]);
417
+ if (snprintf (cmd , sizeof (cmd ), "rm -f %s/add/%s.args" ,
418
+ ACRNCTL_OPT_ROOT , argv [i ]) >= sizeof (cmd )) {
419
+ printf ("WARN: cmd is truncated\n" );
420
+ return -1 ;
421
+ }
363
422
system (cmd );
364
423
}
365
424
0 commit comments