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

Reply via email to