chiark / gitweb /
device cgroup: don't create a new CGroupDeviceAllow when it already in the list
authorGao feng <gaofeng@cn.fujitsu.com>
Wed, 28 Aug 2013 01:49:11 +0000 (09:49 +0800)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Wed, 28 Aug 2013 12:04:56 +0000 (08:04 -0400)
If a device node is already in the device_allow list of
CGroupContext, we should replace it instead of create a
new one and append this new one to the end of device_allow
list.

change from v1: use streq to replace !strcmp

src/core/dbus-cgroup.c

index 9e97b20d1e693343092cc7809acfce93869b130a..4ce7dc5e7fc178ee7349eb5873fe7414181d4413 100644 (file)
@@ -314,21 +314,35 @@ int bus_cgroup_set_property(
                         }
 
                         if (mode != UNIT_CHECK) {
                         }
 
                         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');
 
                                 }
 
                                 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++;
                         }
 
                         n++;