sync patches fromsystemd community

This commit is contained in:
hongjinghao 2023-03-22 14:48:09 +08:00
parent 99feed31ce
commit 0bd6b14818
11 changed files with 736 additions and 1 deletions

View File

@ -0,0 +1,35 @@
From 73be22c6f245ad86ef33d95bd4ab0a8e9fd121be Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Fri, 3 Feb 2023 18:29:36 +0900
Subject: [PATCH] argv-util: also update program_invocation_short_name
Our logging uses program_invocation_short_name. Without this patch,
logs from forked client may become broken; spuriously truncated or
the short invocation name is not completely shown in the log.
(cherry picked from commit dd15e4cb57129b915e01495e113696bfe0b70214)
(cherry picked from commit ce4726468dc02bd7383cd7d90c8769576c6973e3)
(cherry picked from commit 7a862d9d1a7196a5576720959849f45fc68b041c)
(cherry picked from commit 9fbbd7bf28e5362b786e152a9ce4e8bd40621759)
---
src/basic/process-util.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/basic/process-util.c b/src/basic/process-util.c
index b76ca6f7c5..10651a4564 100644
--- a/src/basic/process-util.c
+++ b/src/basic/process-util.c
@@ -371,6 +371,10 @@ int rename_process(const char name[]) {
strncpy(program_invocation_name, name, k);
if (l > k)
truncated = true;
+
+ /* Also update the short name. */
+ char *p = strrchr(program_invocation_name, '/');
+ program_invocation_short_name = p ? p + 1 : program_invocation_name;
}
/* Third step, completely replace the argv[] array the kernel maintains for us. This requires privileges, but
--
2.27.0

View File

@ -0,0 +1,65 @@
From c8b3b524134539846917269ddd644ee93a35623f Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Wed, 16 Nov 2022 03:08:22 +0900
Subject: [PATCH] core/unit: drop dependency to the unit being merged
Fixes a bug in 15ed3c3a188cf7fa5a60ae508fc7a3ed048d2220.
Fixes #24990. Also, hopefully fixes #24577.
---
src/core/unit.c | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/src/core/unit.c b/src/core/unit.c
index 36e3afd7fb..1a580157af 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1044,10 +1044,10 @@ static int unit_add_dependency_hashmap(
return unit_per_dependency_type_hashmap_update(per_type, other, origin_mask, destination_mask);
}
-static void unit_merge_dependencies(
- Unit *u,
- Unit *other) {
-
+static void unit_merge_dependencies(Unit *u, Unit *other) {
+ Hashmap *deps;
+ void *dt; /* Actually of type UnitDependency, except that we don't bother casting it here,
+ * since the hashmaps all want it as void pointer. */
int r;
assert(u);
@@ -1056,12 +1056,19 @@ static void unit_merge_dependencies(
if (u == other)
return;
+ /* First, remove dependency to other. */
+ HASHMAP_FOREACH_KEY(deps, dt, u->dependencies) {
+ if (hashmap_remove(deps, other))
+ unit_maybe_warn_about_dependency(u, other->id, UNIT_DEPENDENCY_FROM_PTR(dt));
+
+ if (hashmap_isempty(deps))
+ hashmap_free(hashmap_remove(u->dependencies, dt));
+ }
+
for (;;) {
_cleanup_(hashmap_freep) Hashmap *other_deps = NULL;
UnitDependencyInfo di_back;
Unit *back;
- void *dt; /* Actually of type UnitDependency, except that we don't bother casting it here,
- * since the hashmaps all want it as void pointer. */
/* Let's focus on one dependency type at a time, that 'other' has defined. */
other_deps = hashmap_steal_first_key_and_value(other->dependencies, &dt);
@@ -1103,8 +1110,6 @@ static void unit_merge_dependencies(
* them per type wholesale. */
r = hashmap_put(u->dependencies, dt, other_deps);
if (r == -EEXIST) {
- Hashmap *deps;
-
/* The target unit already has dependencies of this type, let's then merge this individually. */
assert_se(deps = hashmap_get(u->dependencies, dt));
--
2.27.0

View File

@ -0,0 +1,112 @@
From ed9911630e4bca844381d7caeb850dad9a9fa122 Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Tue, 15 Nov 2022 22:59:01 +0900
Subject: [PATCH] core/unit: fix log message
As you can see in the below, the dropped dependency Before=issue-24990.service
is not logged, but the dependency Before=test1.service which is not owned by
the units generated by the TEST-26 is logged.
Before:
systemd[1]: issue-24990.service: Dependency After=test1.service dropped, merged into issue-24990.service
systemd[1]: issue-24990.service: Dependency Before=test1.service dropped, merged into issue-24990.service
After:
systemd[1]: issue-24990.service: Dependency After=test1.service is dropped, as test1.service is merged into issue-24990.service.
systemd[1]: issue-24990.service: Dependency Before=issue-24990.service in test1.service is dropped, as test1.service is merged into issue-24990.service.
---
src/core/unit.c | 49 ++++++++++++++++++++++---------------------------
1 file changed, 22 insertions(+), 27 deletions(-)
diff --git a/src/core/unit.c b/src/core/unit.c
index ea09416be5..988ba8e34a 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -937,29 +937,17 @@ static int unit_reserve_dependencies(Unit *u, Unit *other) {
return 0;
}
-static void unit_maybe_warn_about_dependency(
- Unit *u,
- const char *other_id,
- UnitDependency dependency) {
-
- assert(u);
-
+static bool unit_should_warn_about_dependency(UnitDependency dependency) {
/* Only warn about some unit types */
- if (!IN_SET(dependency,
- UNIT_CONFLICTS,
- UNIT_CONFLICTED_BY,
- UNIT_BEFORE,
- UNIT_AFTER,
- UNIT_ON_SUCCESS,
- UNIT_ON_FAILURE,
- UNIT_TRIGGERS,
- UNIT_TRIGGERED_BY))
- return;
-
- if (streq_ptr(u->id, other_id))
- log_unit_warning(u, "Dependency %s=%s dropped", unit_dependency_to_string(dependency), u->id);
- else
- log_unit_warning(u, "Dependency %s=%s dropped, merged into %s", unit_dependency_to_string(dependency), strna(other_id), u->id);
+ return IN_SET(dependency,
+ UNIT_CONFLICTS,
+ UNIT_CONFLICTED_BY,
+ UNIT_BEFORE,
+ UNIT_AFTER,
+ UNIT_ON_SUCCESS,
+ UNIT_ON_FAILURE,
+ UNIT_TRIGGERS,
+ UNIT_TRIGGERED_BY);
}
static int unit_per_dependency_type_hashmap_update(
@@ -1057,8 +1045,10 @@ static void unit_merge_dependencies(Unit *u, Unit *other) {
/* First, remove dependency to other. */
HASHMAP_FOREACH_KEY(deps, dt, u->dependencies) {
- if (hashmap_remove(deps, other))
- unit_maybe_warn_about_dependency(u, other->id, UNIT_DEPENDENCY_FROM_PTR(dt));
+ if (hashmap_remove(deps, other) && unit_should_warn_about_dependency(UNIT_DEPENDENCY_FROM_PTR(dt)))
+ log_unit_warning(u, "Dependency %s=%s is dropped, as %s is merged into %s.",
+ unit_dependency_to_string(UNIT_DEPENDENCY_FROM_PTR(dt)),
+ other->id, other->id, u->id);
if (hashmap_isempty(deps))
hashmap_free(hashmap_remove(u->dependencies, dt));
@@ -1085,7 +1075,11 @@ static void unit_merge_dependencies(Unit *u, Unit *other) {
if (back == u) {
/* This is a dependency pointing back to the unit we want to merge with?
* Suppress it (but warn) */
- unit_maybe_warn_about_dependency(u, other->id, UNIT_DEPENDENCY_FROM_PTR(dt));
+ if (unit_should_warn_about_dependency(UNIT_DEPENDENCY_FROM_PTR(dt)))
+ log_unit_warning(u, "Dependency %s=%s in %s is dropped, as %s is merged into %s.",
+ unit_dependency_to_string(UNIT_DEPENDENCY_FROM_PTR(dt)),
+ u->id, other->id, other->id, u->id);
+
hashmap_remove(other_deps, back);
continue;
}
@@ -3055,7 +3049,6 @@ int unit_add_dependency(
[UNIT_IN_SLICE] = UNIT_SLICE_OF,
[UNIT_SLICE_OF] = UNIT_IN_SLICE,
};
- Unit *original_u = u, *original_other = other;
UnitDependencyAtom a;
int r;
@@ -3074,7 +3067,9 @@ int unit_add_dependency(
/* We won't allow dependencies on ourselves. We will not consider them an error however. */
if (u == other) {
- unit_maybe_warn_about_dependency(original_u, original_other->id, d);
+ if (unit_should_warn_about_dependency(d))
+ log_unit_warning(u, "Dependency %s=%s is dropped.",
+ unit_dependency_to_string(d), u->id);
return 0;
}
--
2.27.0

View File

@ -0,0 +1,31 @@
From 53e0e6ef0eea396bb432cbfc1f2f6ea1272ff1f1 Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Tue, 15 Nov 2022 23:08:35 +0900
Subject: [PATCH] core/unit: fix logic of dropping self-referencing
dependencies
Fixes a bug in 15ed3c3a188cf7fa5a60ae508fc7a3ed048d2220.
---
src/core/unit.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/core/unit.c b/src/core/unit.c
index 1a580157af..a9052428e4 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1131,10 +1131,11 @@ static void unit_merge_dependencies(Unit *u, Unit *other) {
}
} else {
assert_se(r >= 0);
- TAKE_PTR(other_deps);
if (hashmap_remove(other_deps, u))
unit_maybe_warn_about_dependency(u, other->id, UNIT_DEPENDENCY_FROM_PTR(dt));
+
+ TAKE_PTR(other_deps);
}
}
--
2.27.0

View File

@ -0,0 +1,95 @@
From 4b7918a65cc2571a2b3fc166229e1b8db463e217 Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Thu, 17 Nov 2022 12:46:45 +0900
Subject: [PATCH] core/unit: merge two loops into one
No functional change, just refactoring.
---
src/core/unit.c | 47 +++++++++++++++--------------------------------
1 file changed, 15 insertions(+), 32 deletions(-)
diff --git a/src/core/unit.c b/src/core/unit.c
index a9052428e4..0d52e4bf1a 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1048,7 +1048,6 @@ static void unit_merge_dependencies(Unit *u, Unit *other) {
Hashmap *deps;
void *dt; /* Actually of type UnitDependency, except that we don't bother casting it here,
* since the hashmaps all want it as void pointer. */
- int r;
assert(u);
assert(other);
@@ -1075,6 +1074,8 @@ static void unit_merge_dependencies(Unit *u, Unit *other) {
if (!other_deps)
break; /* done! */
+ deps = hashmap_get(u->dependencies, dt);
+
/* Now iterate through all dependencies of this dependency type, of 'other'. We refer to the
* referenced units as 'back'. */
HASHMAP_FOREACH_KEY(di_back.data, back, other_deps) {
@@ -1085,6 +1086,7 @@ static void unit_merge_dependencies(Unit *u, Unit *other) {
/* This is a dependency pointing back to the unit we want to merge with?
* Suppress it (but warn) */
unit_maybe_warn_about_dependency(u, other->id, UNIT_DEPENDENCY_FROM_PTR(dt));
+ hashmap_remove(other_deps, back);
continue;
}
@@ -1103,40 +1105,21 @@ static void unit_merge_dependencies(Unit *u, Unit *other) {
di_move.origin_mask,
di_move.destination_mask) >= 0);
}
- }
- /* Now all references towards 'other' of the current type 'dt' are corrected to point to
- * 'u'. Lets's now move the deps of type 'dt' from 'other' to 'u'. First, let's try to move
- * them per type wholesale. */
- r = hashmap_put(u->dependencies, dt, other_deps);
- if (r == -EEXIST) {
/* The target unit already has dependencies of this type, let's then merge this individually. */
-
- assert_se(deps = hashmap_get(u->dependencies, dt));
-
- for (;;) {
- UnitDependencyInfo di_move;
-
- /* Get first dep */
- di_move.data = hashmap_steal_first_key_and_value(other_deps, (void**) &back);
- if (!di_move.data)
- break; /* done */
- if (back == u) {
- /* Would point back to us, ignore */
- unit_maybe_warn_about_dependency(u, other->id, UNIT_DEPENDENCY_FROM_PTR(dt));
- continue;
- }
-
- assert_se(unit_per_dependency_type_hashmap_update(deps, back, di_move.origin_mask, di_move.destination_mask) >= 0);
- }
- } else {
- assert_se(r >= 0);
-
- if (hashmap_remove(other_deps, u))
- unit_maybe_warn_about_dependency(u, other->id, UNIT_DEPENDENCY_FROM_PTR(dt));
-
- TAKE_PTR(other_deps);
+ if (deps)
+ assert_se(unit_per_dependency_type_hashmap_update(
+ deps,
+ back,
+ di_back.origin_mask,
+ di_back.destination_mask) >= 0);
}
+
+ /* Now all references towards 'other' of the current type 'dt' are corrected to point to 'u'.
+ * Lets's now move the deps of type 'dt' from 'other' to 'u'. If the unit does not have
+ * dependencies of this type, let's move them per type wholesale. */
+ if (!deps)
+ assert_se(hashmap_put(u->dependencies, dt, TAKE_PTR(other_deps)) >= 0);
}
other->dependencies = hashmap_free(other->dependencies);
--
2.27.0

View File

@ -0,0 +1,44 @@
From 1d0c81a05b1605a5fc3db44d5a157a1d6876eda9 Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Wed, 16 Nov 2022 03:18:30 +0900
Subject: [PATCH] core/unit: merge unit names after merging deps
Before:
systemd[1]: issue-24990.service: Dependency Before=n/a dropped, merged into issue-24990.service
After:
systemd[1]: issue-24990.service: Dependency Before=test1.service dropped, merged into issue-24990.service
---
src/core/unit.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/core/unit.c b/src/core/unit.c
index 0d52e4bf1a..ea09416be5 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -1165,11 +1165,6 @@ int unit_merge(Unit *u, Unit *other) {
if (r < 0)
return r;
- /* Merge names */
- r = unit_merge_names(u, other);
- if (r < 0)
- return r;
-
/* Redirect all references */
while (other->refs_by_target)
unit_ref_set(other->refs_by_target, other->refs_by_target->source, u);
@@ -1177,6 +1172,11 @@ int unit_merge(Unit *u, Unit *other) {
/* Merge dependencies */
unit_merge_dependencies(u, other);
+ /* Merge names. It is better to do that after merging deps, otherwise the log message contains n/a. */
+ r = unit_merge_names(u, other);
+ if (r < 0)
+ return r;
+
other->load_state = UNIT_MERGED;
other->merged_into = u;
--
2.27.0

View File

@ -0,0 +1,36 @@
From 28c5859fa30572950a24a7638a3a8191d65daf68 Mon Sep 17 00:00:00 2001
From: licunlong <licunlong1@huawei.com>
Date: Thu, 10 Mar 2022 09:22:29 +0800
Subject: [PATCH] main: drop get_process_cmdline from crash handler
get_process_cmdline calls malloc, which should be avoid in signal handler.
Fixes: #22690
---
src/core/main.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/core/main.c b/src/core/main.c
index 41a4b4225f..7c9265f394 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -274,11 +274,12 @@ _noreturn_ static void crash(int sig, siginfo_t *siginfo, void *context) {
int r;
if (siginfo) {
- _cleanup_free_ char *cmdline = NULL;
- pid_t sender_pid = siginfo->si_pid;
-
- (void) get_process_cmdline(sender_pid, SIZE_MAX, 0, &cmdline);
- log_emergency("Caught <%s> from PID "PID_FMT" (%s)", signal_to_string(sig), sender_pid, strna(cmdline));
+ if (siginfo->si_pid == 0)
+ log_emergency("Caught <%s> from unknown sender process.", signal_to_string(sig));
+ else if (siginfo->si_pid == 1)
+ log_emergency("Caught <%s> from our own process.", signal_to_string(sig));
+ else
+ log_emergency("Caught <%s> from PID "PID_FMT".", signal_to_string(sig), siginfo->si_pid);
}
/* Order things nicely. */
--
2.27.0

View File

@ -0,0 +1,54 @@
From 7347b3db838ea3f02afc6c8a6dccac1ff8e7edbd Mon Sep 17 00:00:00 2001
From: licunlong <licunlong1@huawei.com>
Date: Tue, 8 Mar 2022 19:18:36 +0800
Subject: [PATCH] main: log which process send SIGNAL to PID1 This can help
users to figure out what makes systemd freeze. 1. Someone kills systemd
accidentally, then the sender_pid won't be 1; 2. systemd triggers segfault or
assert, then the sender_pid will be 1;
---
src/core/main.c | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/src/core/main.c b/src/core/main.c
index 5009b8d85f..41a4b4225f 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -228,7 +228,7 @@ _noreturn_ static void freeze_or_exit_or_reboot(void) {
freeze();
}
-_noreturn_ static void crash(int sig) {
+_noreturn_ static void crash(int sig, siginfo_t *siginfo, void *context) {
struct sigaction sa;
pid_t pid;
@@ -273,6 +273,14 @@ _noreturn_ static void crash(int sig) {
siginfo_t status;
int r;
+ if (siginfo) {
+ _cleanup_free_ char *cmdline = NULL;
+ pid_t sender_pid = siginfo->si_pid;
+
+ (void) get_process_cmdline(sender_pid, SIZE_MAX, 0, &cmdline);
+ log_emergency("Caught <%s> from PID "PID_FMT" (%s)", signal_to_string(sig), sender_pid, strna(cmdline));
+ }
+
/* Order things nicely. */
r = wait_for_terminate(pid, &status);
if (r < 0)
@@ -330,8 +338,8 @@ _noreturn_ static void crash(int sig) {
static void install_crash_handler(void) {
static const struct sigaction sa = {
- .sa_handler = crash,
- .sa_flags = SA_NODEFER, /* So that we can raise the signal again from the signal handler */
+ .sa_sigaction = crash,
+ .sa_flags = SA_NODEFER | SA_SIGINFO, /* So that we can raise the signal again from the signal handler */
};
int r;
--
2.27.0

View File

@ -0,0 +1,40 @@
From 0aadfe4937045efd5a7a53a176d05db7dc937435 Mon Sep 17 00:00:00 2001
From: Robin Humble <plaguedbypenguins@gmail.com>
Date: Wed, 1 Feb 2023 23:36:48 +1100
Subject: [PATCH] pid1: fix segv triggered by status query (#26279)
If any query makes it to the end of install_info_follow() then I think symlink_target is set to NULL.
If that is followed by -EXDEV from unit_file_load_or_readlink(), then that causes basename(NULL)
which segfaults pid 1.
This is triggered by eg. "systemctl status crond" in RHEL9 if
/etc/systemd/system/crond.service
-> /ram/etc/systemd/system/crond.service
-> /usr/lib/systemd/system/.crond.service.blah.blah
-> /usr/lib/systemd/system/crond.service
(cherry picked from commit 19cfda9fc3c60de21a362ebb56bcb9f4a9855e85)
(cherry picked from commit 015b0ca9286471c05fe88cfa277dd82e20537ba8)
(cherry picked from commit 9a906fae890904284fe91e29b6bdcb64429fecba)
(cherry picked from commit a2dc9e3be9a8895edcba10f4c0d8d703b435c18b)
---
src/shared/install.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/shared/install.c b/src/shared/install.c
index 4bf868f8e9..f038665dea 100644
--- a/src/shared/install.c
+++ b/src/shared/install.c
@@ -1609,7 +1609,7 @@ static int install_info_traverse(
}
r = install_info_follow(c, i, paths->root_dir, flags, false);
- if (r == -EXDEV) {
+ if (r == -EXDEV && i->symlink_target) {
_cleanup_free_ char *buffer = NULL;
const char *bn;
--
2.27.0

View File

@ -0,0 +1,210 @@
From 5f882cc3ab32636d9242effb2cefad20d92d2ec2 Mon Sep 17 00:00:00 2001
From: Yu Watanabe <watanabe.yu+github@gmail.com>
Date: Tue, 15 Nov 2022 21:52:19 +0900
Subject: [PATCH] test: add test case for sysv-generator and invalid dependency
---
test/units/assert.sh | 58 +++++++++++++++++++
test/units/testsuite-26.sh | 116 ++++++++++++++++++++++++++++++++++++-
2 files changed, 172 insertions(+), 2 deletions(-)
create mode 100755 test/units/assert.sh
diff --git a/test/units/assert.sh b/test/units/assert.sh
new file mode 100755
index 0000000..2f4d93a
--- /dev/null
+++ b/test/units/assert.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+# utility functions for shell tests
+
+assert_true() {(
+ set +ex
+
+ local rc
+
+ "$@"
+ rc=$?
+ if [[ $rc -ne 0 ]]; then
+ echo "FAIL: command '$*' failed with exit code $rc" >&2
+ exit 1
+ fi
+)}
+
+
+assert_eq() {(
+ set +ex
+
+ if [[ "${1?}" != "${2?}" ]]; then
+ echo "FAIL: expected: '$2' actual: '$1'" >&2
+ exit 1
+ fi
+)}
+
+assert_in() {(
+ set +ex
+
+ if ! [[ "${2?}" =~ ${1?} ]]; then
+ echo "FAIL: '$1' not found in:" >&2
+ echo "$2" >&2
+ exit 1
+ fi
+)}
+
+assert_not_in() {(
+ set +ex
+
+ if [[ "${2?}" =~ ${1?} ]]; then
+ echo "FAIL: '$1' found in:" >&2
+ echo "$2" >&2
+ exit 1
+ fi
+)}
+
+assert_rc() {(
+ set +ex
+
+ local rc exp="${1?}"
+
+ shift
+ "$@"
+ rc=$?
+ assert_eq "$rc" "$exp"
+)}
diff --git a/test/units/testsuite-26.sh b/test/units/testsuite-26.sh
index 7982099..fe6b63b 100755
--- a/test/units/testsuite-26.sh
+++ b/test/units/testsuite-26.sh
@@ -2,6 +2,11 @@
set -eux
set -o pipefail
+# shellcheck source=test/units/assert.sh
+. "$(dirname "$0")"/assert.sh
+
+: >/failed
+
# Make sure PATH is set
systemctl show-environment | grep -q '^PATH='
@@ -26,6 +31,113 @@ systemctl show-environment | grep '^FOO=$' && exit 1
systemctl show-environment | grep '^PATH=.*testaddition$' && exit 1
systemctl show-environment | grep -q '^PATH='
-echo OK >/testok
+# test for sysv-generator (issue #24990)
+if [[ -x /usr/lib/systemd/system-generators/systemd-sysv-generator ]]; then
+ # This is configurable via -Dsysvinit-path=, but we can't get the value
+ # at runtime, so let's just support the two most common paths for now.
+ [[ -d /etc/rc.d/init.d ]] && SYSVINIT_PATH="/etc/rc.d/init.d" || SYSVINIT_PATH="/etc/init.d"
+
+ # invalid dependency
+ cat >"${SYSVINIT_PATH:?}/issue-24990" <<\EOF
+#!/bin/bash
+
+### BEGIN INIT INFO
+# Provides:test1 test2
+# Required-Start:test1 $remote_fs $network
+# Required-Stop:test1 $remote_fs $network
+# Description:Test
+# Short-Description: Test
+### END INIT INFO
+
+case "$1" in
+ start)
+ echo "Starting issue-24990.service"
+ sleep 1000 &
+ ;;
+ stop)
+ echo "Stopping issue-24990.service"
+ sleep 10 &
+ ;;
+ *)
+ echo "Usage: service test {start|stop|restart|status}"
+ ;;
+esac
+EOF
+
+ chmod +x "$SYSVINIT_PATH/issue-24990"
+ systemctl daemon-reload
+ [[ -L /run/systemd/generator.late/test1.service ]]
+ [[ -L /run/systemd/generator.late/test2.service ]]
+ assert_eq "$(readlink -f /run/systemd/generator.late/test1.service)" "/run/systemd/generator.late/issue-24990.service"
+ assert_eq "$(readlink -f /run/systemd/generator.late/test2.service)" "/run/systemd/generator.late/issue-24990.service"
+ output=$(systemctl cat issue-24990)
+ assert_in "SourcePath=$SYSVINIT_PATH/issue-24990" "$output"
+ assert_in "Description=LSB: Test" "$output"
+ assert_in "After=test1.service" "$output"
+ assert_in "After=remote-fs.target" "$output"
+ assert_in "After=network-online.target" "$output"
+ assert_in "Wants=network-online.target" "$output"
+ assert_in "ExecStart=$SYSVINIT_PATH/issue-24990 start" "$output"
+ assert_in "ExecStop=$SYSVINIT_PATH/issue-24990 stop" "$output"
+ systemctl status issue-24990 || :
+ systemctl show issue-24990
+ assert_not_in "issue-24990.service" "$(systemctl show --property=After --value)"
+ assert_not_in "issue-24990.service" "$(systemctl show --property=Before --value)"
+
+ if ! systemctl is-active network-online.target; then
+ systemctl start network-online.target
+ fi
+
+ systemctl restart issue-24990
+ systemctl stop issue-24990
+
+ # valid dependency
+ cat >"$SYSVINIT_PATH/issue-24990" <<\EOF
+#!/bin/bash
+
+### BEGIN INIT INFO
+# Provides:test1 test2
+# Required-Start:$remote_fs
+# Required-Stop:$remote_fs
+# Description:Test
+# Short-Description: Test
+### END INIT INFO
+
+case "$1" in
+ start)
+ echo "Starting issue-24990.service"
+ sleep 1000 &
+ ;;
+ stop)
+ echo "Stopping issue-24990.service"
+ sleep 10 &
+ ;;
+ *)
+ echo "Usage: service test {start|stop|restart|status}"
+ ;;
+esac
+EOF
+
+ chmod +x "$SYSVINIT_PATH/issue-24990"
+ systemctl daemon-reload
+ [[ -L /run/systemd/generator.late/test1.service ]]
+ [[ -L /run/systemd/generator.late/test2.service ]]
+ assert_eq "$(readlink -f /run/systemd/generator.late/test1.service)" "/run/systemd/generator.late/issue-24990.service"
+ assert_eq "$(readlink -f /run/systemd/generator.late/test2.service)" "/run/systemd/generator.late/issue-24990.service"
+ output=$(systemctl cat issue-24990)
+ assert_in "SourcePath=$SYSVINIT_PATH/issue-24990" "$output"
+ assert_in "Description=LSB: Test" "$output"
+ assert_in "After=remote-fs.target" "$output"
+ assert_in "ExecStart=$SYSVINIT_PATH/issue-24990 start" "$output"
+ assert_in "ExecStop=$SYSVINIT_PATH/issue-24990 stop" "$output"
+ systemctl status issue-24990 || :
+ systemctl show issue-24990
+ assert_not_in "issue-24990.service" "$(systemctl show --property=After --value)"
+ assert_not_in "issue-24990.service" "$(systemctl show --property=Before --value)"
+
+ systemctl restart issue-24990
+ systemctl stop issue-24990
+fi
-exit 0
+touch /testok
+rm /failed
--
2.27.0

View File

@ -21,7 +21,7 @@
Name: systemd
Url: https://www.freedesktop.org/wiki/Software/systemd
Version: 249
Release: 48
Release: 49
License: MIT and LGPLv2+ and GPLv2+
Summary: System and Service Manager
@ -441,6 +441,16 @@ Patch6393: backport-analyze-add-forgotten-return-statement.patch
Patch6394: backport-shared-condition-avoid-nss-lookup-in-PID1.patch
Patch6395: backport-logind-fix-getting-property-OnExternalPower-via-D-Bu.patch
Patch6396: backport-udev-support-by-path-devlink-for-multipath-nvme-bloc.patch
Patch6397: backport-argv-util-also-update-program_invocation_short_name.patch
Patch6398: backport-pid1-fix-segv-triggered-by-status-query.patch
Patch6399: backport-main-log-which-process-send-SIGNAL-to-PID1.patch
Patch6400: backport-main-drop-get_process_cmdline-from-crash-handler.patch
Patch6401: backport-core-unit-drop-dependency-to-the-unit-being-merged.patch
Patch6402: backport-core-unit-fix-logic-of-dropping-self-referencing-dep.patch
Patch6403: backport-core-unit-merge-two-loops-into-one.patch
Patch6404: backport-core-unit-merge-unit-names-after-merging-deps.patch
Patch6405: backport-core-unit-fix-log-message.patch
Patch6406: backport-test-add-test-case-for-sysv-generator-and-invalid-de.patch
Patch9001: update-rtc-with-system-clock-when-shutdown.patch
Patch9002: udev-add-actions-while-rename-netif-failed.patch
@ -1911,6 +1921,9 @@ fi
%{_libdir}/security/pam_systemd.so
%changelog
* Wed Mar 22 2023 hongjinghao <hongjinghao@huawei.comg> - 249-49
- backport: sync patches from systemd community
* Tue Mar 7 2023 wangyuhang <wangyuhang27@huawei.com> -249-48
- fix symlinks to NVMe drives are missing in /dev/disk/by-path