@@ -138,6 +138,7 @@ struct tracecmd_input {
struct host_trace_info host;
double ts2secs;
+ unsigned int cpustats_size;
char * cpustats;
char * uname;
char * version;
@@ -2658,7 +2659,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;
@@ -2738,12 +2738,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 */
@@ -2813,8 +2817,6 @@ static int handle_options(struct tracecmd_input *handle)
}
- handle->cpustats = cpustats;
-
return 0;
}
Using a local variable to read all CPUSTAT options assumes that all of them are in a single option section. While this is true for the current trace file version format, this assumption limits the design of a more flexible format with multiple options sections. Use input handler context instead of the local variable. Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/trace-input.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)