[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <f02b1bb76fbcd8691e2d511ca5f0487ab717dbda.1614016514.git.aclaudi@redhat.com>
Date: Mon, 22 Feb 2021 19:14:32 +0100
From: Andrea Claudi <aclaudi@...hat.com>
To: netdev@...r.kernel.org
Cc: stephen@...workplumber.org, dsahern@...il.com
Subject: [PATCH iproute2 v2 2/2] lib/fs: Fix single return points for get_cgroup2_*
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 <aclaudi@...hat.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
Powered by blists - more mailing lists