From ad7bfffde594bf141e13f17e8d8214bfa29ea635 Mon Sep 17 00:00:00 2001 From: Gao feng Date: Wed, 28 Aug 2013 09:49:11 +0800 Subject: device cgroup: don't create a new CGroupDeviceAllow when it already in the list 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 9e97b20d1e..4ce7dc5e7f 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++; -- cgit v1.2.3-54-g00ecf