diff options
-rw-r--r-- | lib/tst_cgroup.c | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/lib/tst_cgroup.c b/lib/tst_cgroup.c index 5240aadaa..6e9ab372d 100644 --- a/lib/tst_cgroup.c +++ b/lib/tst_cgroup.c @@ -430,12 +430,28 @@ 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; + char c = ctrl_name[l]; + + while (c == '_' || (c >= 'a' && c <= 'z')) + c = ctrl_name[++l]; + + 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 (!strict) + return NULL; + + tst_brk(TBROK, "Unexpected char in %s: %c", ctrl_name, c); + } for_each_ctrl(ctrl) { - if (!strcmp(ctrl_name, ctrl->ctrl_name)) + if (!strncmp(ctrl_name, ctrl->ctrl_name, l)) return ctrl; } @@ -468,7 +484,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?"); @@ -561,7 +577,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); } @@ -578,7 +594,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); @@ -805,7 +821,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"); @@ -1161,7 +1177,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, @@ -1188,7 +1204,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")) { |