@@ -150,6 +150,7 @@ struct tracecmd_input {
struct host_trace_info host;
double ts2secs;
+ unsigned int cpustats_size;
char * cpustats;
char * uname;
char * version;
@@ -2909,7 +2910,6 @@ static int handle_options(struct tracecmd_input *handle)
unsigned short option;
unsigned int size;
char *cpustats = NULL;
- unsigned int cpustats_size = 0;
struct input_buffer_instance *buffer;
struct hook_list *hook;
char *buf;
@@ -2987,12 +2987,16 @@ static int handle_options(struct tracecmd_input *handle)
break;
case TRACECMD_OPTION_CPUSTAT:
buf[size-1] = '\n';
- cpustats = realloc(cpustats, cpustats_size + size + 1);
- if (!cpustats)
- return -ENOMEM;
- memcpy(cpustats + cpustats_size, buf, size);
- cpustats_size += size;
- cpustats[cpustats_size] = 0;
+ cpustats = realloc(handle->cpustats,
+ handle->cpustats_size + size + 1);
+ if (!cpustats) {
+ ret = -ENOMEM;
+ return ret;
+ }
+ memcpy(cpustats + handle->cpustats_size, buf, size);
+ handle->cpustats_size += size;
+ cpustats[handle->cpustats_size] = 0;
+ handle->cpustats = cpustats;
break;
case TRACECMD_OPTION_BUFFER:
/* A buffer instance is saved at the end of the file */
Trace file version 7 can have more than one options section. Assuming that all CPUSTAT options are in a single options section could be wrong, that's why using local variable to track the CPUSTAT size is not correct. Use input handler context instead. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/trace-input.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-)