diff mbox series

cgroup: Fix scanning V1 mount options

Message ID 20231030100008.5280-1-rpalethorpe@suse.com
State Accepted
Headers show
Series cgroup: Fix scanning V1 mount options | expand

Commit Message

Richard Palethorpe Oct. 30, 2023, 10 a.m. UTC
The validation in cgroup_find_ctrl did not take into consideration how
we scan V1 mounts. For V1 we try using each mount option as if it is a
controller name. Some mount options contain characters which would be
invalid in a controller name.

This commit ignores errors when scanning V1 mount options.

Ideally we would have a place where we can read the subsys name
knowing that only subsys names will be read from that location. Such
as with V2. One possibility is /proc/cgroups which contains a numeric
value for the hierarchy. However it would require more investigation.

Fixes: #1093
Fixes: 5292c46e5 "cgroup: Handle trailing new line in cgroup.controllers"
Signed-off-by: Richard Palethorpe <rpalethorpe@suse.com>
---
 lib/tst_cgroup.c | 23 ++++++++++++++---------
 1 file changed, 14 insertions(+), 9 deletions(-)

Comments

Cyril Hrubis Oct. 30, 2023, 10:50 a.m. UTC | #1
Hi!
Looks good to me.

Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
Richard Palethorpe Oct. 30, 2023, 11:14 a.m. UTC | #2
Hello,

Pushed, Thanks!

Cyril Hrubis <chrubis@suse.cz> writes:

> Hi!
> Looks good to me.
>
> Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
>
> -- 
> Cyril Hrubis
> chrubis@suse.cz
diff mbox series

Patch

diff --git a/lib/tst_cgroup.c b/lib/tst_cgroup.c
index f904ae168..a8a598e0e 100644
--- a/lib/tst_cgroup.c
+++ b/lib/tst_cgroup.c
@@ -429,7 +429,8 @@  void tst_cg_print_config(void)
 }
 
 __attribute__ ((nonnull, warn_unused_result))
-static struct cgroup_ctrl *cgroup_find_ctrl(const char *const ctrl_name)
+static struct cgroup_ctrl *cgroup_find_ctrl(const char *const ctrl_name,
+					    unsigned int strict)
 {
 	struct cgroup_ctrl *ctrl;
 	int l = 0;
@@ -438,11 +439,15 @@  static struct cgroup_ctrl *cgroup_find_ctrl(const char *const ctrl_name)
 	while (c == '_' || (c >= 'a' && c <= 'z'))
 		c = ctrl_name[++l];
 
-	if (l > 32)
+	if (l > 32 && strict)
 		tst_res(TWARN, "Subsys name len greater than max known value of MAX_CGROUP_TYPE_NAMELEN: %d > 32", l);
 
-	if (!(c == '\n' || c == '\0'))
+	if (!(c == '\n' || c == '\0')) {
+		if (!strict)
+			return NULL;
+
 		tst_brk(TBROK, "Unexpected char in %s: %c", ctrl_name, c);
+	}
 
 	for_each_ctrl(ctrl) {
 		if (!strncmp(ctrl_name, ctrl->ctrl_name, l))
@@ -478,7 +483,7 @@  static void cgroup_parse_config_line(const char *const config_entry)
 	if (vars_read != 7)
 		tst_brk(TBROK, "Incorrect number of vars read from config. Config possibly malformed?");
 
-	ctrl = cgroup_find_ctrl(ctrl_name);
+	ctrl = cgroup_find_ctrl(ctrl_name, 1);
 	if (!ctrl)
 		tst_brk(TBROK, "Could not find ctrl from config. Ctrls changing between calls?");
 
@@ -571,7 +576,7 @@  static void cgroup_root_scan(const char *const mnt_type,
 	SAFE_FILE_READAT(mnt_dfd, "cgroup.controllers", buf, sizeof(buf));
 
 	for (tok = strtok(buf, " "); tok; tok = strtok(NULL, " ")) {
-		const_ctrl = cgroup_find_ctrl(tok);
+		const_ctrl = cgroup_find_ctrl(tok, 1);
 		if (const_ctrl)
 			add_ctrl(&ctrl_field, const_ctrl);
 	}
@@ -588,7 +593,7 @@  static void cgroup_root_scan(const char *const mnt_type,
 
 v1:
 	for (tok = strtok(mnt_opts, ","); tok; tok = strtok(NULL, ",")) {
-		const_ctrl = cgroup_find_ctrl(tok);
+		const_ctrl = cgroup_find_ctrl(tok, 0);
 		if (const_ctrl)
 			add_ctrl(&ctrl_field, const_ctrl);
 
@@ -815,7 +820,7 @@  void tst_cg_require(const char *const ctrl_name,
 			const struct tst_cg_opts *options)
 {
 	const char *const cgsc = "cgroup.subtree_control";
-	struct cgroup_ctrl *const ctrl = cgroup_find_ctrl(ctrl_name);
+	struct cgroup_ctrl *const ctrl = cgroup_find_ctrl(ctrl_name, 1);
 	struct cgroup_root *root;
 	int base = !strcmp(ctrl->ctrl_name, "base");
 
@@ -1171,7 +1176,7 @@  static const struct cgroup_file *cgroup_file_find(const char *const file,
 	memcpy(ctrl_name, file_name, len);
 	ctrl_name[len] = '\0';
 
-	ctrl = cgroup_find_ctrl(ctrl_name);
+	ctrl = cgroup_find_ctrl(ctrl_name, 1);
 
 	if (!ctrl) {
 		tst_brk_(file, lineno, TBROK,
@@ -1198,7 +1203,7 @@  enum tst_cg_ver tst_cg_ver(const char *const file, const int lineno,
 				    const struct tst_cg_group *const cg,
 				    const char *const ctrl_name)
 {
-	const struct cgroup_ctrl *const ctrl = cgroup_find_ctrl(ctrl_name);
+	const struct cgroup_ctrl *const ctrl = cgroup_find_ctrl(ctrl_name, 1);
 	const struct cgroup_dir *dir;
 
 	if (!strcmp(ctrl_name, "cgroup")) {