summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-08-07 20:42:58 -0400
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2014-10-26 18:23:47 -0400
commitd61ca0aa19cd8c6656428ce7f46b77b4fcccf38d (patch)
tree0782e8d2c6ebfd966bd92b5d5dfae34bae92e530
parentdaf3702ded96ad4d794a94d95454bf3a662b992f (diff)
core: do not add dependencies to self
Adds a pair of files which cause a segfault (also with systemd-analyze verify). https://bugzilla.redhat.com/show_bug.cgi?id=1124843 (cherry picked from commit e66047ff62c971eefa32b42373420d61e3f2a9c1)
-rw-r--r--src/core/load-dropin.c2
-rw-r--r--src/core/unit.c16
-rw-r--r--test/loopy.service2
-rw-r--r--test/loopy.service.d/compat.conf5
l---------test/loopy2.service1
5 files changed, 21 insertions, 5 deletions
diff --git a/src/core/load-dropin.c b/src/core/load-dropin.c
index a877e6609..31d0c07f3 100644
--- a/src/core/load-dropin.c
+++ b/src/core/load-dropin.c
@@ -206,7 +206,7 @@ int unit_load_dropin(Unit *u) {
}
u->dropin_paths = unit_find_dropin_paths(u);
- if (! u->dropin_paths)
+ if (!u->dropin_paths)
return 0;
STRV_FOREACH(f, u->dropin_paths) {
diff --git a/src/core/unit.c b/src/core/unit.c
index c47b2e826..22d8a7b09 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -551,14 +551,22 @@ static void merge_dependencies(Unit *u, Unit *other, UnitDependency d) {
UnitDependency k;
for (k = 0; k < _UNIT_DEPENDENCY_MAX; k++) {
- r = set_remove_and_put(back->dependencies[k], other, u);
- if (r == -EEXIST)
+ /* Do not add dependencies between u and itself */
+ if (back == u) {
set_remove(back->dependencies[k], other);
- else
- assert(r >= 0 || r == -ENOENT);
+ } else {
+ r = set_remove_and_put(back->dependencies[k], other, u);
+ if (r == -EEXIST)
+ set_remove(back->dependencies[k], other);
+ else
+ assert(r >= 0 || r == -ENOENT);
+ }
}
}
+ /* Also do not move dependencies on u to itself */
+ set_remove(other->dependencies[d], u);
+
complete_move(&u->dependencies[d], &other->dependencies[d]);
set_free(other->dependencies[d]);
diff --git a/test/loopy.service b/test/loopy.service
new file mode 100644
index 000000000..9eb645748
--- /dev/null
+++ b/test/loopy.service
@@ -0,0 +1,2 @@
+[Service]
+ExecStart=/bin/true
diff --git a/test/loopy.service.d/compat.conf b/test/loopy.service.d/compat.conf
new file mode 100644
index 000000000..51b84b89e
--- /dev/null
+++ b/test/loopy.service.d/compat.conf
@@ -0,0 +1,5 @@
+[Unit]
+BindsTo=loopy2.service
+
+[Install]
+Also=loopy2.service
diff --git a/test/loopy2.service b/test/loopy2.service
new file mode 120000
index 000000000..961b1fe9b
--- /dev/null
+++ b/test/loopy2.service
@@ -0,0 +1 @@
+loopy.service \ No newline at end of file