diff options
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/dbus-cgroup.c | 32 |
1 files 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++; |