Functions get_cgroup2_id() and get_cgroup2_path() may call close() with a negative argument. Avoid that making the calls conditional on the file descriptors.
get_cgroup2_path() may also return NULL leaking a file descriptor. Ensure this does not happen using a single return point. Fixes: d5e6ee0dac64 ("ss: introduce cgroup2 cache and helper functions") Fixes: 8f1cd119b377 ("lib: fix checking of returned file handle size for cgroup") Signed-off-by: Andrea Claudi <acla...@redhat.com> --- lib/fs.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/fs.c b/lib/fs.c index 2ae506ec..ee0b130b 100644 --- a/lib/fs.c +++ b/lib/fs.c @@ -157,7 +157,8 @@ __u64 get_cgroup2_id(const char *path) memcpy(cg_id.bytes, fhp->f_handle, sizeof(__u64)); out: - close(mnt_fd); + if (mnt_fd >= 0) + close(mnt_fd); free(mnt); return cg_id.id; @@ -179,16 +180,16 @@ char *get_cgroup2_path(__u64 id, bool full) char *path = NULL; char fd_path[64]; int link_len; - char *mnt; + char *mnt = NULL; if (!id) { fprintf(stderr, "Invalid cgroup2 ID\n"); - return NULL; + goto out; } mnt = find_cgroup2_mount(false); if (!mnt) - return NULL; + goto out; mnt_fd = open(mnt, O_RDONLY); if (mnt_fd < 0) { @@ -225,8 +226,10 @@ char *get_cgroup2_path(__u64 id, bool full) "Failed to allocate memory for cgroup2 path\n"); out: - close(fd); - close(mnt_fd); + if (fd >= 0) + close(fd); + if (mnt_fd >= 0) + close(mnt_fd); free(mnt); return path; -- 2.29.2