In read_header_files() path is allocated a few times by get_tracing_file(). It isn't freed in multiple error paths. Free it whenever needed. Fixes a RESOURCE_LEAK error (CWE-772) Signed-off-by: Jerome Marchand <jmarchan@xxxxxxxxxx> --- lib/trace-cmd/trace-output.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/lib/trace-cmd/trace-output.c b/lib/trace-cmd/trace-output.c index eee847e3..59498edc 100644 --- a/lib/trace-cmd/trace-output.c +++ b/lib/trace-cmd/trace-output.c @@ -644,8 +644,10 @@ static int read_header_files(struct tracecmd_output *handle, bool compress) flags |= TRACECMD_SEC_FL_COMPRESS; offset = out_write_section_header(handle, TRACECMD_OPTION_HEADER_INFO, "headers", flags, true); - if (offset == (off_t)-1) + if (offset == (off_t)-1) { + put_tracing_file(path); return -1; + } out_compression_start(handle, compress); ret = stat(path, &st); @@ -671,23 +673,23 @@ static int read_header_files(struct tracecmd_output *handle, bool compress) fd = open(path, O_RDONLY); if (fd < 0) { tracecmd_warning("can't read '%s'", path); - goto out_close; + goto out_free; } /* unfortunately, you can not stat debugfs files for size */ size = get_size_fd(fd); if (do_write_check(handle, "header_page", 12)) - goto out_close; + goto out_free; endian8 = convert_endian_8(handle, size); if (do_write_check(handle, &endian8, 8)) - goto out_close; + goto out_free; check_size = copy_file_fd(handle, fd, 0); close(fd); if (size != check_size) { tracecmd_warning("wrong size for '%s' size=%lld read=%lld", path, size, check_size); errno = EINVAL; - goto out_close; + goto out_free; } put_tracing_file(path); @@ -698,21 +700,21 @@ static int read_header_files(struct tracecmd_output *handle, bool compress) fd = open(path, O_RDONLY); if (fd < 0) { tracecmd_warning("can't read '%s'", path); - goto out_close; + goto out_free; } size = get_size_fd(fd); if (do_write_check(handle, "header_event", 13)) - goto out_close; + goto out_free; endian8 = convert_endian_8(handle, size); if (do_write_check(handle, &endian8, 8)) - goto out_close; + goto out_free; check_size = copy_file_fd(handle, fd, 0); close(fd); if (size != check_size) { tracecmd_warning("wrong size for '%s'", path); - goto out_close; + goto out_free; } put_tracing_file(path); if (out_compression_end(handle, compress)) @@ -724,6 +726,8 @@ static int read_header_files(struct tracecmd_output *handle, bool compress) return 0; + out_free: + put_tracing_file(path); out_close: out_compression_reset(handle, compress); if (fd >= 0) -- 2.44.0