chiark / gitweb /
cgroup: additional validity checks for cgroup attribute names
[elogind.git] / src / core / unit.c
index d26f6e456c1dcfb5a451b2a495eee0357e561059..6cf02365e950221709f3d5cfe128f98eeebe749a 100644 (file)
@@ -1022,9 +1022,9 @@ static void unit_status_log_starting_stopping_reloading(Unit *u, JobType t) {
               t == JOB_STOP  ? SD_MESSAGE_UNIT_STOPPING :
                                SD_MESSAGE_UNIT_RELOADING;
 
-        log_struct(LOG_INFO,
+        log_struct_unit(LOG_INFO,
+                   u->id,
                    MESSAGE_ID(mid),
-                   "UNIT=%s", u->id,
                    "MESSAGE=%s", buf,
                    NULL);
 }
@@ -1438,9 +1438,9 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
                         check_unneeded_dependencies(u);
 
                 if (ns != os && ns == UNIT_FAILED) {
-                        log_struct(LOG_NOTICE,
+                        log_struct_unit(LOG_NOTICE,
+                                   u->id,
                                    "MESSAGE=Unit %s entered failed state", u->id,
-                                   "UNIT=%s", u->id,
                                    NULL);
                         unit_trigger_on_failure(u);
                 }
@@ -2156,26 +2156,27 @@ int unit_add_cgroup_attribute(
 
         _cleanup_free_ char *c = NULL;
         CGroupAttribute *a;
+        int r;
 
         assert(u);
         assert(name);
         assert(value);
 
         if (!controller) {
-                const char *dot;
-
-                dot = strchr(name, '.');
-                if (!dot)
+                r = cg_controller_from_attr(name, &c);
+                if (r < 0)
                         return -EINVAL;
 
-                c = strndup(name, dot - name);
-                if (!c)
-                        return -ENOMEM;
-
                 controller = c;
+        } else {
+                if (!filename_is_safe(name))
+                        return -EINVAL;
+
+                if (!filename_is_safe(controller))
+                        return -EINVAL;
         }
 
-        if (streq(controller, SYSTEMD_CGROUP_CONTROLLER))
+        if (!controller || streq(controller, SYSTEMD_CGROUP_CONTROLLER))
                 return -EINVAL;
 
         a = cgroup_attribute_find_list(u->cgroup_attributes, controller, name);