@@ -3045,6 +3045,7 @@ static int handle_options(struct tracecmd_input *handle)
unsigned short id, flags;
char *cpustats = NULL;
struct hook_list *hook;
+ bool compress = false;
char *buf;
int cpus;
int ret;
@@ -3056,23 +3057,33 @@ static int handle_options(struct tracecmd_input *handle)
return -1;
if (id != TRACECMD_OPTION_DONE)
return -1;
+ if (flags & TRACECMD_SEC_FL_COMPRESS)
+ compress = true;
}
+ if (compress && in_uncompress_block(handle))
+ return -1;
+
for (;;) {
- if (read2(handle, &option))
- return -1;
+ ret = read2(handle, &option);
+ if (ret)
+ goto out;
if (!HAS_SECTIONS(handle) && option == TRACECMD_OPTION_DONE)
break;
/* next 4 bytes is the size of the option */
- if (read4(handle, &size))
- return -1;
+ ret = read4(handle, &size);
+ if (ret)
+ goto out;
buf = malloc(size);
- if (!buf)
- return -ENOMEM;
- if (do_read_check(handle, buf, size))
- return -1;
+ if (!buf) {
+ ret = -ENOMEM;
+ goto out;
+ }
+ ret = do_read_check(handle, buf, size);
+ if (ret)
+ goto out;
switch (option) {
case TRACECMD_OPTION_DATE:
@@ -3126,15 +3137,17 @@ static int handle_options(struct tracecmd_input *handle)
buf + 8, 4);
ret = tsync_cpu_offsets_load(handle, buf + 12, size - 12);
if (ret < 0)
- return ret;
+ goto out;
tracecmd_enable_tsync(handle, true);
break;
case TRACECMD_OPTION_CPUSTAT:
buf[size-1] = '\n';
cpustats = realloc(handle->cpustats,
handle->cpustats_size + size + 1);
- if (!cpustats)
- return -ENOMEM;
+ if (!cpustats) {
+ ret = -ENOMEM;
+ goto out;
+ }
memcpy(cpustats + handle->cpustats_size, buf, size);
handle->cpustats_size += size;
cpustats[handle->cpustats_size] = 0;
@@ -3144,7 +3157,7 @@ static int handle_options(struct tracecmd_input *handle)
case TRACECMD_OPTION_BUFFER_TEXT:
ret = handle_buffer_option(handle, option, buf, size);
if (ret < 0)
- return ret;
+ goto out;
break;
case TRACECMD_OPTION_TRACECLOCK:
if (!handle->ts2secs)
@@ -3203,6 +3216,8 @@ static int handle_options(struct tracecmd_input *handle)
tep_read_number(handle->pevent, buf, 8), 0);
break;
case TRACECMD_OPTION_DONE:
+ if (compress)
+ in_uncompress_reset(handle);
ret = handle_option_done(handle, buf, size);
free(buf);
return ret;
@@ -3216,7 +3231,12 @@ static int handle_options(struct tracecmd_input *handle)
}
- return 0;
+ ret = 0;
+
+out:
+ if (compress)
+ in_uncompress_reset(handle);
+ return ret;
}
static int read_options_type(struct tracecmd_input *handle)
In trace file version 7, options section can be compressed. Extended the options handling decompression if needed . Signed-off-by: Tzvetomir Stoyanov (VMware) <tz.stoyanov@gmail.com> --- lib/trace-cmd/trace-input.c | 46 ++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 13 deletions(-)