chiark / gitweb /
device cgroup: don't create a new CGroupDeviceAllow when it already in the list
[elogind.git] / src / core / dbus-cgroup.c
index 9e97b20d1e693343092cc7809acfce93869b130a..4ce7dc5e7fc178ee7349eb5873fe7414181d4413 100644 (file)
@@ -314,21 +314,35 @@ int bus_cgroup_set_property(
                         }
 
                         if (mode != UNIT_CHECK) {
-                                a = new0(CGroupDeviceAllow, 1);
-                                if (!a)
-                                        return -ENOMEM;
-
-                                a->path = strdup(path);
-                                if (!a->path) {
-                                        free(a);
-                                        return -ENOMEM;
+                                CGroupDeviceAllow *b;
+                                bool exist = false;
+
+                                LIST_FOREACH(device_allow, b, c->device_allow) {
+                                        if (streq(b->path, path)) {
+                                                a = b;
+                                                exist = true;
+                                                break;
+                                        }
+                                }
+
+                                if (!exist) {
+                                        a = new0(CGroupDeviceAllow, 1);
+                                        if (!a)
+                                                return -ENOMEM;
+
+                                        a->path = strdup(path);
+                                        if (!a->path) {
+                                                free(a);
+                                                return -ENOMEM;
+                                        }
                                 }
 
                                 a->r = !!strchr(rwm, 'r');
                                 a->w = !!strchr(rwm, 'w');
                                 a->m = !!strchr(rwm, 'm');
 
-                                LIST_PREPEND(CGroupDeviceAllow, device_allow, c->device_allow, a);
+                                if (!exist)
+                                        LIST_PREPEND(CGroupDeviceAllow, device_allow, c->device_allow, a);
                         }
 
                         n++;