From: Gao feng Date: Wed, 28 Aug 2013 01:49:11 +0000 (+0800) Subject: device cgroup: don't create a new CGroupDeviceAllow when it already in the list X-Git-Tag: v207~70 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=ad7bfffde594bf141e13f17e8d8214bfa29ea635;p=elogind.git 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 --- diff --git a/src/core/dbus-cgroup.c b/src/core/dbus-cgroup.c index 9e97b20d1..4ce7dc5e7 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++;