[LTP] [PATCH] cgroup: Fix scanning V1 mount options
Richard Palethorpe
rpalethorpe@suse.com
Mon Oct 30 11:00:08 CET 2023
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(-)
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")) {
--
2.40.1
More information about the ltp
mailing list