@@ -3355,7 +3355,8 @@ static bool schedstat_events_exposed(void)
3355
3355
static int __cmd_record (int argc , const char * * argv )
3356
3356
{
3357
3357
unsigned int rec_argc , i , j ;
3358
- const char * * rec_argv ;
3358
+ char * * rec_argv ;
3359
+ const char * * rec_argv_copy ;
3359
3360
const char * const record_args [] = {
3360
3361
"record" ,
3361
3362
"-a" ,
@@ -3384,21 +3385,26 @@ static int __cmd_record(int argc, const char **argv)
3384
3385
ARRAY_SIZE (schedstat_args ) : 0 ;
3385
3386
3386
3387
struct tep_event * waking_event ;
3388
+ int ret ;
3387
3389
3388
3390
/*
3389
3391
* +2 for either "-e", "sched:sched_wakeup" or
3390
3392
* "-e", "sched:sched_waking"
3391
3393
*/
3392
3394
rec_argc = ARRAY_SIZE (record_args ) + 2 + schedstat_argc + argc - 1 ;
3393
3395
rec_argv = calloc (rec_argc + 1 , sizeof (char * ));
3394
-
3395
3396
if (rec_argv == NULL )
3396
3397
return - ENOMEM ;
3398
+ rec_argv_copy = calloc (rec_argc + 1 , sizeof (char * ));
3399
+ if (rec_argv_copy == NULL ) {
3400
+ free (rec_argv );
3401
+ return - ENOMEM ;
3402
+ }
3397
3403
3398
3404
for (i = 0 ; i < ARRAY_SIZE (record_args ); i ++ )
3399
3405
rec_argv [i ] = strdup (record_args [i ]);
3400
3406
3401
- rec_argv [i ++ ] = "-e" ;
3407
+ rec_argv [i ++ ] = strdup ( "-e" ) ;
3402
3408
waking_event = trace_event__tp_format ("sched" , "sched_waking" );
3403
3409
if (!IS_ERR (waking_event ))
3404
3410
rec_argv [i ++ ] = strdup ("sched:sched_waking" );
@@ -3409,11 +3415,19 @@ static int __cmd_record(int argc, const char **argv)
3409
3415
rec_argv [i ++ ] = strdup (schedstat_args [j ]);
3410
3416
3411
3417
for (j = 1 ; j < (unsigned int )argc ; j ++ , i ++ )
3412
- rec_argv [i ] = argv [j ];
3418
+ rec_argv [i ] = strdup ( argv [j ]) ;
3413
3419
3414
3420
BUG_ON (i != rec_argc );
3415
3421
3416
- return cmd_record (i , rec_argv );
3422
+ memcpy (rec_argv_copy , rec_argv , sizeof (char * ) * rec_argc );
3423
+ ret = cmd_record (rec_argc , rec_argv_copy );
3424
+
3425
+ for (i = 0 ; i < rec_argc ; i ++ )
3426
+ free (rec_argv [i ]);
3427
+ free (rec_argv );
3428
+ free (rec_argv_copy );
3429
+
3430
+ return ret ;
3417
3431
}
3418
3432
3419
3433
int cmd_sched (int argc , const char * * argv )
0 commit comments