[systemd-devel] [PATCH v2] device cgroup: don't create a new CGroupDeviceAllow when it already in the list

Gao feng gaofeng at cn.fujitsu.com
Tue Aug 27 18:49:11 PDT 2013


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 | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c
index 9e97b20..4ce7dc5 100644
--- a/src/core/dbus-cgroup.c
+++ b/src/core/dbus-cgroup.c
@@ -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++;
-- 
1.8.3.1



More information about the systemd-devel mailing list