Fix in-service cgroup parser regression

Signed-off-by: Joachim Wiberg <troglobit@gmail.com>
This commit is contained in:
Joachim Wiberg committed 2023-03-21 16:31:43 +01:00
1 parent 36c6aa73aa
commit 9ee2be121f
1 file changed
+14 -6
+14 -6
View File
@@ -1164,9 +1164,14 @@ static void parse_env(svc_t *svc, char *env)
strlcpy(svc->env, env, sizeof(svc->env)); strlcpy(svc->env, env, sizeof(svc->env));
} }
/*
* the @cgroup argument can be, e.g., .system:mem.max:1234 or just the
* default group with some cfg, e.g., :mem.max:1234 as a side effect,
* cgroupinit also work, selecting group init.
*/
static void parse_cgroup(svc_t *svc, char *cgroup) static void parse_cgroup(svc_t *svc, char *cgroup)
{ {
char *ptr = cgroup; char *ptr = NULL;
if (!cgroup) if (!cgroup)
return; return;
@@ -1175,10 +1180,14 @@ static void parse_cgroup(svc_t *svc, char *cgroup)
ptr = strchr(cgroup, ':'); ptr = strchr(cgroup, ':');
if (ptr) if (ptr)
*ptr++ = 0; *ptr++ = 0;
group:
strlcpy(svc->cgroup.name, &cgroup[1], sizeof(svc->cgroup.name)); strlcpy(svc->cgroup.name, &cgroup[1], sizeof(svc->cgroup.name));
if (!ptr) if (!ptr)
return; return;
} } else if (cgroup[0] == ':') {
ptr = &cgroup[1];
} else
goto group;
if (strlen(ptr) >= sizeof(svc->cgroup)) { if (strlen(ptr) >= sizeof(svc->cgroup)) {
errx(1, "%s: cgroup settings too long (>%zu chars)", svc_ident(svc, NULL, 0), sizeof(svc->cgroup)); errx(1, "%s: cgroup settings too long (>%zu chars)", svc_ident(svc, NULL, 0), sizeof(svc->cgroup));
@@ -1508,10 +1517,9 @@ int service_register(int type, char *cfg, struct rlimit rlimit[], char *file)
ready_script = arg; ready_script = arg;
else if (MATCH_CMD(cmd, "env:", arg)) else if (MATCH_CMD(cmd, "env:", arg))
env = arg; env = arg;
else if (MATCH_CMD(cmd, "cgroup:", arg)) /* catch both cgroup: and cgroup. handled in parse_cgroup() */
cgroup = arg; /* only settings */ else if (MATCH_CMD(cmd, "cgroup", arg))
else if (MATCH_CMD(cmd, "cgroup.", arg)) cgroup = arg;
cgroup = arg; /* with group */
else if (MATCH_CMD(cmd, "conflict:", arg)) else if (MATCH_CMD(cmd, "conflict:", arg))
conflict = arg; conflict = arg;
else if (MATCH_CMD(cmd, "if:", arg)) else if (MATCH_CMD(cmd, "if:", arg))