import systemd-239-58.el8
This commit is contained in:
		
							parent
							
								
									253862ee4a
								
							
						
					
					
						commit
						ff9b3458f8
					
				| @ -1,4 +1,4 @@ | |||||||
| From cd407514366a2ec2c32ebc7a5b405d37005456fd Mon Sep 17 00:00:00 2001 | From 2ab6e6ae9853e410310268efc0cea7f2276979ee Mon Sep 17 00:00:00 2001 | ||||||
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
| Date: Tue, 20 Oct 2020 17:12:42 +0200 | Date: Tue, 20 Oct 2020 17:12:42 +0200 | ||||||
| Subject: [PATCH] sd-hwdb: allow empty properties | Subject: [PATCH] sd-hwdb: allow empty properties | ||||||
| @ -9,7 +9,7 @@ override properties (back to the empty) value for specific cases. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit afe87974dd57741f74dd87165b251886f24c859f) | (cherry picked from commit afe87974dd57741f74dd87165b251886f24c859f) | ||||||
| 
 | 
 | ||||||
| Related: #1930568 | Related: #2005009 | ||||||
| ---
 | ---
 | ||||||
|  src/hwdb/hwdb.c | 5 ++--- |  src/hwdb/hwdb.c | 5 ++--- | ||||||
|  1 file changed, 2 insertions(+), 3 deletions(-) |  1 file changed, 2 insertions(+), 3 deletions(-) | ||||||
| @ -1,9 +1,9 @@ | |||||||
| From a02798d09681906096cfb8f0f3997b535bb6a06d Mon Sep 17 00:00:00 2001 | From 793dc4d9e32baba27eac1f37283a7485b0889803 Mon Sep 17 00:00:00 2001 | ||||||
| From: David Tardon <dtardon@redhat.com> | From: David Tardon <dtardon@redhat.com> | ||||||
| Date: Thu, 19 Aug 2021 12:31:36 +0200 | Date: Thu, 19 Aug 2021 12:31:36 +0200 | ||||||
| Subject: [PATCH] Update hwdb | Subject: [PATCH] Update hwdb | ||||||
| 
 | 
 | ||||||
| Resolves: #1930568 | Resolves: #2005009 | ||||||
| ---
 | ---
 | ||||||
|  hwdb/20-OUI.hwdb                            | 26574 +++++++++++++++++- |  hwdb/20-OUI.hwdb                            | 26574 +++++++++++++++++- | ||||||
|  hwdb/20-acpi-vendor.hwdb                    |   257 +- |  hwdb/20-acpi-vendor.hwdb                    |   257 +- | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 26a1c41e771eb3b36f6f9b95ae35ce4803766e3c Mon Sep 17 00:00:00 2001 | From b029865ef6d8b23ecdbfda4e277a3f75cb59ee94 Mon Sep 17 00:00:00 2001 | ||||||
| From: David Tardon <dtardon@redhat.com> | From: David Tardon <dtardon@redhat.com> | ||||||
| Date: Mon, 25 Oct 2021 15:27:27 +0200 | Date: Mon, 25 Oct 2021 15:27:27 +0200 | ||||||
| Subject: [PATCH] Disable libpitc to fix CentOS Stream CI | Subject: [PATCH] Disable libpitc to fix CentOS Stream CI | ||||||
| @ -6,15 +6,13 @@ Subject: [PATCH] Disable libpitc to fix CentOS Stream CI | |||||||
| We have disabled it in our spec starting with 8.5.0, so let's follow | We have disabled it in our spec starting with 8.5.0, so let's follow | ||||||
| suit here. | suit here. | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit b029865ef6d8b23ecdbfda4e277a3f75cb59ee94) | Related: #2017033 | ||||||
| 
 |  | ||||||
| Related: #2024903 |  | ||||||
| ---
 | ---
 | ||||||
|  .github/workflows/unit_tests.sh | 2 +- |  .github/workflows/unit_tests.sh | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/.github/workflows/unit_tests.sh b/.github/workflows/unit_tests.sh
 | diff --git a/.github/workflows/unit_tests.sh b/.github/workflows/unit_tests.sh
 | ||||||
| index 36363603db..814870e7a0 100755
 | index ad4584ec1d..def38bffe2 100755
 | ||||||
| --- a/.github/workflows/unit_tests.sh
 | --- a/.github/workflows/unit_tests.sh
 | ||||||
| +++ b/.github/workflows/unit_tests.sh
 | +++ b/.github/workflows/unit_tests.sh
 | ||||||
| @@ -50,7 +50,7 @@ CONFIGURE_OPTS=(
 | @@ -50,7 +50,7 @@ CONFIGURE_OPTS=(
 | ||||||
							
								
								
									
										25
									
								
								SOURCES/0640-rpm-Fix-typo-in-_environmentdir.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								SOURCES/0640-rpm-Fix-typo-in-_environmentdir.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | From 74cbe4b73a1dbb1113c822690561b8b41b2fb60a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Neal Gompa <ngompa13@gmail.com> | ||||||
|  | Date: Mon, 25 Jun 2018 12:56:50 -0400 | ||||||
|  | Subject: [PATCH] rpm: Fix typo in %_environmentdir | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Neal Gompa <ngompa13@gmail.com> | ||||||
|  | (cherry picked from commit 6ea4cb975f99cdfd447332ffa9631790a5975eea) | ||||||
|  | Resolves: #2018024 | ||||||
|  | ---
 | ||||||
|  |  src/core/macros.systemd.in | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/macros.systemd.in b/src/core/macros.systemd.in
 | ||||||
|  | index f3b74f4273..a24d7bbe58 100644
 | ||||||
|  | --- a/src/core/macros.systemd.in
 | ||||||
|  | +++ b/src/core/macros.systemd.in
 | ||||||
|  | @@ -18,7 +18,7 @@
 | ||||||
|  |  %_sysctldir @sysctldir@ | ||||||
|  |  %_sysusersdir @sysusersdir@ | ||||||
|  |  %_tmpfilesdir @tmpfilesdir@ | ||||||
|  | -%_environmnentdir @environmentdir@
 | ||||||
|  | +%_environmentdir @environmentdir@
 | ||||||
|  |  %_modulesloaddir @modulesloaddir@ | ||||||
|  |  %_modprobedir @modprobedir@ | ||||||
|  |  %_systemdgeneratordir @systemgeneratordir@ | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | From 7b2d5268cf43a4ed7847bdbed2328bccddd5a716 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Neal Gompa <ngompa13@gmail.com> | ||||||
|  | Date: Tue, 26 Jun 2018 07:42:29 -0400 | ||||||
|  | Subject: [PATCH] rpm: Add misspelled %_environmentdir macro for temporary | ||||||
|  |  compatibility | ||||||
|  | 
 | ||||||
|  | This should be removed after systemd 240 is released. | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Neal Gompa <ngompa13@gmail.com> | ||||||
|  | (cherry picked from commit a6bb5504583e3267d35fa385fe20f60fd998ca5d) | ||||||
|  | Related: #2018024 | ||||||
|  | ---
 | ||||||
|  |  src/core/macros.systemd.in | 4 ++++ | ||||||
|  |  1 file changed, 4 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/macros.systemd.in b/src/core/macros.systemd.in
 | ||||||
|  | index a24d7bbe58..abbb42b22f 100644
 | ||||||
|  | --- a/src/core/macros.systemd.in
 | ||||||
|  | +++ b/src/core/macros.systemd.in
 | ||||||
|  | @@ -26,6 +26,10 @@
 | ||||||
|  |  %_systemd_system_env_generator_dir @systemenvgeneratordir@ | ||||||
|  |  %_systemd_user_env_generator_dir @userenvgeneratordir@ | ||||||
|  |   | ||||||
|  | +# Because we had one release with a typo...
 | ||||||
|  | +# This is temporary (Remove after systemd 240 is released)
 | ||||||
|  | +%_environmnentdir %_environmentdir
 | ||||||
|  | +
 | ||||||
|  |  %systemd_requires \ | ||||||
|  |  Requires(post): systemd \ | ||||||
|  |  Requires(preun): systemd \ | ||||||
| @ -0,0 +1,32 @@ | |||||||
|  | From 4d994a262ec1ad3e33e197cb09aa5aeabb5835dd Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 3 Jul 2018 15:40:53 +0200 | ||||||
|  | Subject: [PATCH] rpm: emit warning when macro with typo is used | ||||||
|  | 
 | ||||||
|  | Follow-up for a6bb550458. Suggested by @ignatenkobrain. | ||||||
|  | 
 | ||||||
|  | $ rpmbuild --eval %_environmentdir | ||||||
|  | /usr/lib/environment.d | ||||||
|  | $ rpmbuild --eval %_environmnentdir | ||||||
|  | warning: Use %_environmentdir instead | ||||||
|  | /usr/lib/environment.d | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit be9bf171bbf764997551f8a9b3c2aba5c6a875d3) | ||||||
|  | Related: #2018024 | ||||||
|  | ---
 | ||||||
|  |  src/core/macros.systemd.in | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/macros.systemd.in b/src/core/macros.systemd.in
 | ||||||
|  | index abbb42b22f..fe7ca26a34 100644
 | ||||||
|  | --- a/src/core/macros.systemd.in
 | ||||||
|  | +++ b/src/core/macros.systemd.in
 | ||||||
|  | @@ -28,7 +28,7 @@
 | ||||||
|  |   | ||||||
|  |  # Because we had one release with a typo... | ||||||
|  |  # This is temporary (Remove after systemd 240 is released) | ||||||
|  | -%_environmnentdir %_environmentdir
 | ||||||
|  | +%_environmnentdir %{warn:Use %%_environmentdir instead}%_environmentdir
 | ||||||
|  |   | ||||||
|  |  %systemd_requires \ | ||||||
|  |  Requires(post): systemd \ | ||||||
| @ -0,0 +1,75 @@ | |||||||
|  | From f29b7bcd85d4e8d824d36fecc130a0d74af718f8 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: David Tardon <dtardon@redhat.com> | ||||||
|  | Date: Tue, 12 Oct 2021 16:47:48 +0200 | ||||||
|  | Subject: [PATCH] Remove unintended additions to systemd-analyze man page | ||||||
|  | 
 | ||||||
|  | These changes were introduced in commit | ||||||
|  | a2e00522971897909db2a81b4daf10e5700f453e . | ||||||
|  | 
 | ||||||
|  | Resolves: #2004765 | ||||||
|  | ---
 | ||||||
|  |  man/systemd-analyze.xml | 51 +---------------------------------------- | ||||||
|  |  1 file changed, 1 insertion(+), 50 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/man/systemd-analyze.xml b/man/systemd-analyze.xml
 | ||||||
|  | index 7c873cbdd1..e17ff0cf90 100644
 | ||||||
|  | --- a/man/systemd-analyze.xml
 | ||||||
|  | +++ b/man/systemd-analyze.xml
 | ||||||
|  | @@ -354,56 +354,7 @@ $ eog targets.svg</programlisting>
 | ||||||
|  |        they elapse next. This takes the same input as the <varname>OnCalendar=</varname> setting in | ||||||
|  |        <citerefentry><refentrytitle>systemd.timer</refentrytitle><manvolnum>5</manvolnum></citerefentry>, | ||||||
|  |        following the syntax described in | ||||||
|  | -      <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>. By
 | ||||||
|  | -      default, only the next time the calendar expression will elapse is shown; use
 | ||||||
|  | -      <option>--iterations=</option> to show the specified number of next times the expression
 | ||||||
|  | -      elapses.</para>
 | ||||||
|  | -
 | ||||||
|  | -      <example>
 | ||||||
|  | -        <title>Show leap days in the near future</title>
 | ||||||
|  | -
 | ||||||
|  | -        <programlisting>$ systemd-analyze calendar --iterations=5 '*-2-29 0:0:0'
 | ||||||
|  | -  Original form: *-2-29 0:0:0
 | ||||||
|  | -Normalized form: *-02-29 00:00:00
 | ||||||
|  | -    Next elapse: Sat 2020-02-29 00:00:00 UTC
 | ||||||
|  | -       From now: 11 months 15 days left
 | ||||||
|  | -       Iter. #2: Thu 2024-02-29 00:00:00 UTC
 | ||||||
|  | -       From now: 4 years 11 months left
 | ||||||
|  | -       Iter. #3: Tue 2028-02-29 00:00:00 UTC
 | ||||||
|  | -       From now: 8 years 11 months left
 | ||||||
|  | -       Iter. #4: Sun 2032-02-29 00:00:00 UTC
 | ||||||
|  | -       From now: 12 years 11 months left
 | ||||||
|  | -       Iter. #5: Fri 2036-02-29 00:00:00 UTC
 | ||||||
|  | -       From now: 16 years 11 months left
 | ||||||
|  | -</programlisting>
 | ||||||
|  | -      </example>
 | ||||||
|  | -    </refsect2>
 | ||||||
|  | -
 | ||||||
|  | -    <refsect2>
 | ||||||
|  | -      <title><command>systemd-analyze timespan <replaceable>EXPRESSION</replaceable>...</command></title>
 | ||||||
|  | -
 | ||||||
|  | -      <para>This command parses a time span and outputs the normalized form and the equivalent value in
 | ||||||
|  | -      microseconds. The time span should adhere to the same syntax documented in
 | ||||||
|  | -      <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>.
 | ||||||
|  | -      Values without associated magnitudes are parsed as seconds.</para>
 | ||||||
|  | -
 | ||||||
|  | -      <example>
 | ||||||
|  | -        <title>Show parsing of timespans</title>
 | ||||||
|  | -
 | ||||||
|  | -        <programlisting>$ systemd-analyze timespan 1s 300s '1year 0.000001s'
 | ||||||
|  | -Original: 1s
 | ||||||
|  | -      μs: 1000000
 | ||||||
|  | -   Human: 1s
 | ||||||
|  | -
 | ||||||
|  | -Original: 300s
 | ||||||
|  | -      μs: 300000000
 | ||||||
|  | -   Human: 5min
 | ||||||
|  | -
 | ||||||
|  | -Original: 1year 0.000001s
 | ||||||
|  | -      μs: 31557600000001
 | ||||||
|  | -   Human: 1y 1us
 | ||||||
|  | -</programlisting>
 | ||||||
|  | -      </example>
 | ||||||
|  | +      <citerefentry><refentrytitle>systemd.time</refentrytitle><manvolnum>7</manvolnum></citerefentry>.</para>
 | ||||||
|  |      </refsect2> | ||||||
|  |   | ||||||
|  |      <refsect2> | ||||||
| @ -1,17 +1,14 @@ | |||||||
| From 5e081bdfe3711a812c0f2448a14909b0c518d808 Mon Sep 17 00:00:00 2001 | From ffd20a699280a4732d0fe4cddafe12ee8010ddb6 Mon Sep 17 00:00:00 2001 | ||||||
| From: David Tardon <dtardon@redhat.com> | From: David Tardon <dtardon@redhat.com> | ||||||
| Date: Wed, 13 Oct 2021 10:01:59 +0200 | Date: Wed, 13 Oct 2021 10:01:59 +0200 | ||||||
| Subject: [PATCH] Disable iptables for CI | Subject: [PATCH] Disable iptables for CI | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit ffd20a699280a4732d0fe4cddafe12ee8010ddb6) |  | ||||||
| 
 |  | ||||||
| Related: #2024903 |  | ||||||
| ---
 | ---
 | ||||||
|  .github/workflows/unit_tests.sh | 1 - |  .github/workflows/unit_tests.sh | 1 - | ||||||
|  1 file changed, 1 deletion(-) |  1 file changed, 1 deletion(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/.github/workflows/unit_tests.sh b/.github/workflows/unit_tests.sh
 | diff --git a/.github/workflows/unit_tests.sh b/.github/workflows/unit_tests.sh
 | ||||||
| index ad4584ec1d..36363603db 100755
 | index def38bffe2..814870e7a0 100755
 | ||||||
| --- a/.github/workflows/unit_tests.sh
 | --- a/.github/workflows/unit_tests.sh
 | ||||||
| +++ b/.github/workflows/unit_tests.sh
 | +++ b/.github/workflows/unit_tests.sh
 | ||||||
| @@ -92,7 +92,6 @@ SYSTEMD_BUILD_DEPS=(
 | @@ -92,7 +92,6 @@ SYSTEMD_BUILD_DEPS=(
 | ||||||
							
								
								
									
										103
									
								
								SOURCES/0645-core-fix-SIGABRT-on-empty-exec-command-argv.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								SOURCES/0645-core-fix-SIGABRT-on-empty-exec-command-argv.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | |||||||
|  | From 8e322f5bc24547963978be071a8a2547abad875a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Henri Chain <henri.chain@enioka.com> | ||||||
|  | Date: Tue, 5 Oct 2021 13:10:31 +0200 | ||||||
|  | Subject: [PATCH] core: fix SIGABRT on empty exec command argv | ||||||
|  | 
 | ||||||
|  | This verifies that the argv part of any exec_command parameters that | ||||||
|  | are sent through dbus is not empty at deserialization time. | ||||||
|  | 
 | ||||||
|  | There is an additional check in service.c service_verify() that again | ||||||
|  | checks if all exec_commands are correctly populated, after the service | ||||||
|  | has been loaded, whether through dbus or otherwise. | ||||||
|  | 
 | ||||||
|  | Fixes #20933. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 29500cf8c47e6eb0518d171d62aa8213020c9152) | ||||||
|  | 
 | ||||||
|  | Resolves: #2020239 | ||||||
|  | ---
 | ||||||
|  |  src/core/dbus-execute.c             |  4 ++++ | ||||||
|  |  src/core/service.c                  | 12 +++++++++++ | ||||||
|  |  test/TEST-23-TYPE-EXEC/testsuite.sh | 31 +++++++++++++++++++++++++++++ | ||||||
|  |  3 files changed, 47 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/dbus-execute.c b/src/core/dbus-execute.c
 | ||||||
|  | index 8348663000..2e64f0baf4 100644
 | ||||||
|  | --- a/src/core/dbus-execute.c
 | ||||||
|  | +++ b/src/core/dbus-execute.c
 | ||||||
|  | @@ -969,6 +969,10 @@ int bus_set_transient_exec_command(
 | ||||||
|  |                  if (r < 0) | ||||||
|  |                          return r; | ||||||
|  |   | ||||||
|  | +                if (strv_isempty(argv))
 | ||||||
|  | +                        return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
 | ||||||
|  | +                                                 "\"%s\" argv cannot be empty", name);
 | ||||||
|  | +
 | ||||||
|  |                  r = sd_bus_message_read(message, "b", &b); | ||||||
|  |                  if (r < 0) | ||||||
|  |                          return r; | ||||||
|  | diff --git a/src/core/service.c b/src/core/service.c
 | ||||||
|  | index 5e3e75b5ae..12adf89dd4 100644
 | ||||||
|  | --- a/src/core/service.c
 | ||||||
|  | +++ b/src/core/service.c
 | ||||||
|  | @@ -536,6 +536,18 @@ static int service_verify(Service *s) {
 | ||||||
|  |          if (UNIT(s)->load_state != UNIT_LOADED) | ||||||
|  |                  return 0; | ||||||
|  |   | ||||||
|  | +        for (ServiceExecCommand c = 0; c < _SERVICE_EXEC_COMMAND_MAX; c++) {
 | ||||||
|  | +                ExecCommand *command;
 | ||||||
|  | +
 | ||||||
|  | +                LIST_FOREACH(command, command, s->exec_command[c])
 | ||||||
|  | +                        if (strv_isempty(command->argv)) {
 | ||||||
|  | +                                log_unit_error(UNIT(s),
 | ||||||
|  | +                                               "Service has an empty argv in %s=. Refusing.",
 | ||||||
|  | +                                               service_exec_command_to_string(c));
 | ||||||
|  | +                                return -ENOEXEC;
 | ||||||
|  | +                        }
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  |          if (!s->exec_command[SERVICE_EXEC_START] && !s->exec_command[SERVICE_EXEC_STOP]) { | ||||||
|  |                  log_unit_error(UNIT(s), "Service lacks both ExecStart= and ExecStop= setting. Refusing."); | ||||||
|  |                  return -ENOEXEC; | ||||||
|  | diff --git a/test/TEST-23-TYPE-EXEC/testsuite.sh b/test/TEST-23-TYPE-EXEC/testsuite.sh
 | ||||||
|  | index 80734bbbdc..e0c34cfd04 100755
 | ||||||
|  | --- a/test/TEST-23-TYPE-EXEC/testsuite.sh
 | ||||||
|  | +++ b/test/TEST-23-TYPE-EXEC/testsuite.sh
 | ||||||
|  | @@ -21,6 +21,37 @@ systemd-run --unit=four -p Type=exec /bin/sleep infinity
 | ||||||
|  |  ! systemd-run --unit=five -p Type=exec -p User=idontexist /bin/sleep infinity | ||||||
|  |  ! systemd-run --unit=six -p Type=exec /tmp/brokenbinary | ||||||
|  |   | ||||||
|  | +# For issue #20933
 | ||||||
|  | +
 | ||||||
|  | +# Should work normally
 | ||||||
|  | +busctl call \
 | ||||||
|  | +  org.freedesktop.systemd1 /org/freedesktop/systemd1 \
 | ||||||
|  | +  org.freedesktop.systemd1.Manager StartTransientUnit \
 | ||||||
|  | +  "ssa(sv)a(sa(sv))" test-20933-ok.service replace 1 \
 | ||||||
|  | +    ExecStart "a(sasb)" 1 \
 | ||||||
|  | +      /usr/bin/sleep 2 /usr/bin/sleep 1 true \
 | ||||||
|  | +  0
 | ||||||
|  | +
 | ||||||
|  | +# DBus call should fail but not crash systemd
 | ||||||
|  | +busctl call \
 | ||||||
|  | +  org.freedesktop.systemd1 /org/freedesktop/systemd1 \
 | ||||||
|  | +  org.freedesktop.systemd1.Manager StartTransientUnit \
 | ||||||
|  | +  "ssa(sv)a(sa(sv))" test-20933-bad.service replace 1 \
 | ||||||
|  | +    ExecStart "a(sasb)" 1 \
 | ||||||
|  | +      /usr/bin/sleep 0 true \
 | ||||||
|  | +  0 && { echo 'unexpected success'; exit 1; }
 | ||||||
|  | +
 | ||||||
|  | +# Same but with the empty argv in the middle
 | ||||||
|  | +busctl call \
 | ||||||
|  | +  org.freedesktop.systemd1 /org/freedesktop/systemd1 \
 | ||||||
|  | +  org.freedesktop.systemd1.Manager StartTransientUnit \
 | ||||||
|  | +  "ssa(sv)a(sa(sv))" test-20933-bad-middle.service replace 1 \
 | ||||||
|  | +    ExecStart "a(sasb)" 3 \
 | ||||||
|  | +      /usr/bin/sleep 2 /usr/bin/sleep 1 true \
 | ||||||
|  | +      /usr/bin/sleep 0                  true \
 | ||||||
|  | +      /usr/bin/sleep 2 /usr/bin/sleep 1 true \
 | ||||||
|  | +  0 && { echo 'unexpected success'; exit 1; }
 | ||||||
|  | +
 | ||||||
|  |  systemd-analyze set-log-level info | ||||||
|  |   | ||||||
|  |  echo OK > /testok | ||||||
| @ -0,0 +1,39 @@ | |||||||
|  | From 71ebbd2da606c9cb4da694bbcc925078f253f496 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
|  | Date: Wed, 6 Oct 2021 00:19:41 +0900 | ||||||
|  | Subject: [PATCH] core/service: also check path in exec commands | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 8688a389cabdff61efe187bb85cc1776de03c460) | ||||||
|  | 
 | ||||||
|  | Related: #2020239 | ||||||
|  | ---
 | ||||||
|  |  src/core/service.c | 10 +++++++++- | ||||||
|  |  1 file changed, 9 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/service.c b/src/core/service.c
 | ||||||
|  | index 12adf89dd4..ae31973774 100644
 | ||||||
|  | --- a/src/core/service.c
 | ||||||
|  | +++ b/src/core/service.c
 | ||||||
|  | @@ -539,13 +539,21 @@ static int service_verify(Service *s) {
 | ||||||
|  |          for (ServiceExecCommand c = 0; c < _SERVICE_EXEC_COMMAND_MAX; c++) { | ||||||
|  |                  ExecCommand *command; | ||||||
|  |   | ||||||
|  | -                LIST_FOREACH(command, command, s->exec_command[c])
 | ||||||
|  | +                LIST_FOREACH(command, command, s->exec_command[c]) {
 | ||||||
|  | +                        if (!path_is_absolute(command->path) && !filename_is_valid(command->path)) {
 | ||||||
|  | +                                log_unit_error(UNIT(s),
 | ||||||
|  | +                                               "Service %s= binary path \"%s\" is neither a valid executable name nor an absolute path. Refusing.",
 | ||||||
|  | +                                               command->path,
 | ||||||
|  | +                                               service_exec_command_to_string(c));
 | ||||||
|  | +                                return -ENOEXEC;
 | ||||||
|  | +                        }
 | ||||||
|  |                          if (strv_isempty(command->argv)) { | ||||||
|  |                                  log_unit_error(UNIT(s), | ||||||
|  |                                                 "Service has an empty argv in %s=. Refusing.", | ||||||
|  |                                                 service_exec_command_to_string(c)); | ||||||
|  |                                  return -ENOEXEC; | ||||||
|  |                          } | ||||||
|  | +                }
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          if (!s->exec_command[SERVICE_EXEC_START] && !s->exec_command[SERVICE_EXEC_STOP]) { | ||||||
| @ -0,0 +1,124 @@ | |||||||
|  | From 397aaad6da5c4bfb160adca7a68f865086f2ed0a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Franck Bui <fbui@suse.com> | ||||||
|  | Date: Thu, 30 Sep 2021 14:05:36 +0200 | ||||||
|  | Subject: [PATCH] mount-util: fix fd_is_mount_point() when both the parent and | ||||||
|  |  directory are network fs | ||||||
|  | 
 | ||||||
|  | The second call to name_to_handle_at_loop() didn't check for the specific | ||||||
|  | errors that can happen when the parent dir is mounted by nfs and instead of | ||||||
|  | falling back like it's done for the child dir, fd_is_mount_point() failed in | ||||||
|  | this case. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 964ccab8286a7e75d7e9107f574f5cb23752bd5d) | ||||||
|  | 
 | ||||||
|  | Resolves: #2015057 | ||||||
|  | ---
 | ||||||
|  |  src/basic/mount-util.c | 71 ++++++++++++++++++++++++------------------ | ||||||
|  |  1 file changed, 41 insertions(+), 30 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/mount-util.c b/src/basic/mount-util.c
 | ||||||
|  | index 45348bf878..0c709001be 100644
 | ||||||
|  | --- a/src/basic/mount-util.c
 | ||||||
|  | +++ b/src/basic/mount-util.c
 | ||||||
|  | @@ -139,6 +139,19 @@ static int fd_fdinfo_mnt_id(int fd, const char *filename, int flags, int *mnt_id
 | ||||||
|  |          return safe_atoi(p, mnt_id); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static bool is_name_to_handle_at_fatal_error(int err) {
 | ||||||
|  | +        /* name_to_handle_at() can return "acceptable" errors that are due to the context. For
 | ||||||
|  | +         * example the kernel does not support name_to_handle_at() at all (ENOSYS), or the syscall
 | ||||||
|  | +         * was blocked (EACCES/EPERM; maybe through seccomp, because we are running inside of a
 | ||||||
|  | +         * container), or the mount point is not triggered yet (EOVERFLOW, think nfs4), or some
 | ||||||
|  | +         * general name_to_handle_at() flakiness (EINVAL). However other errors are not supposed to
 | ||||||
|  | +         * happen and therefore are considered fatal ones. */
 | ||||||
|  | +
 | ||||||
|  | +        assert(err < 0);
 | ||||||
|  | +
 | ||||||
|  | +        return !IN_SET(err, -EOPNOTSUPP, -ENOSYS, -EACCES, -EPERM, -EOVERFLOW, -EINVAL);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  int fd_is_mount_point(int fd, const char *filename, int flags) { | ||||||
|  |          _cleanup_free_ struct file_handle *h = NULL, *h_parent = NULL; | ||||||
|  |          int mount_id = -1, mount_id_parent = -1; | ||||||
|  | @@ -173,42 +186,40 @@ int fd_is_mount_point(int fd, const char *filename, int flags) {
 | ||||||
|  |           * real mounts of their own. */ | ||||||
|  |   | ||||||
|  |          r = name_to_handle_at_loop(fd, filename, &h, &mount_id, flags); | ||||||
|  | -        if (IN_SET(r, -ENOSYS, -EACCES, -EPERM, -EOVERFLOW, -EINVAL))
 | ||||||
|  | -                /* This kernel does not support name_to_handle_at() at all (ENOSYS), or the syscall was blocked
 | ||||||
|  | -                 * (EACCES/EPERM; maybe through seccomp, because we are running inside of a container?), or the mount
 | ||||||
|  | -                 * point is not triggered yet (EOVERFLOW, think nfs4), or some general name_to_handle_at() flakiness
 | ||||||
|  | -                 * (EINVAL): fall back to simpler logic. */
 | ||||||
|  | -                goto fallback_fdinfo;
 | ||||||
|  | -        else if (r == -EOPNOTSUPP)
 | ||||||
|  | -                /* This kernel or file system does not support name_to_handle_at(), hence let's see if the upper fs
 | ||||||
|  | -                 * supports it (in which case it is a mount point), otherwise fallback to the traditional stat()
 | ||||||
|  | -                 * logic */
 | ||||||
|  | +        if (r < 0) {
 | ||||||
|  | +                if (is_name_to_handle_at_fatal_error(r))
 | ||||||
|  | +                        return r;
 | ||||||
|  | +                if (r != -EOPNOTSUPP)
 | ||||||
|  | +                        goto fallback_fdinfo;
 | ||||||
|  | +
 | ||||||
|  | +                /* This kernel or file system does not support name_to_handle_at(), hence let's see
 | ||||||
|  | +                 * if the upper fs supports it (in which case it is a mount point), otherwise fall
 | ||||||
|  | +                 * back to the traditional stat() logic */
 | ||||||
|  |                  nosupp = true; | ||||||
|  | -        else if (r < 0)
 | ||||||
|  | -                return r;
 | ||||||
|  | +        }
 | ||||||
|  |   | ||||||
|  |          r = name_to_handle_at_loop(fd, "", &h_parent, &mount_id_parent, AT_EMPTY_PATH); | ||||||
|  | -        if (r == -EOPNOTSUPP) {
 | ||||||
|  | +        if (r < 0) {
 | ||||||
|  | +                if (is_name_to_handle_at_fatal_error(r))
 | ||||||
|  | +                        return r;
 | ||||||
|  | +                if (r != -EOPNOTSUPP)
 | ||||||
|  | +                        goto fallback_fdinfo;
 | ||||||
|  |                  if (nosupp) | ||||||
|  | -                        /* Neither parent nor child do name_to_handle_at()?  We have no choice but to fall back. */
 | ||||||
|  | +                        /* Both the parent and the directory can't do name_to_handle_at() */
 | ||||||
|  |                          goto fallback_fdinfo; | ||||||
|  | -                else
 | ||||||
|  | -                        /* The parent can't do name_to_handle_at() but the directory we are interested in can?  If so,
 | ||||||
|  | -                         * it must be a mount point. */
 | ||||||
|  | -                        return 1;
 | ||||||
|  | -        } else if (r < 0)
 | ||||||
|  | -                return r;
 | ||||||
|  |   | ||||||
|  | -        /* The parent can do name_to_handle_at() but the
 | ||||||
|  | -         * directory we are interested in can't? If so, it
 | ||||||
|  | -         * must be a mount point. */
 | ||||||
|  | +                /* The parent can't do name_to_handle_at() but the directory we are
 | ||||||
|  | +                 * interested in can?  If so, it must be a mount point. */
 | ||||||
|  | +                return 1;
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  | +        /* The parent can do name_to_handle_at() but the directory we are interested in can't? If
 | ||||||
|  | +         * so, it must be a mount point. */
 | ||||||
|  |          if (nosupp) | ||||||
|  |                  return 1; | ||||||
|  |   | ||||||
|  | -        /* If the file handle for the directory we are
 | ||||||
|  | -         * interested in and its parent are identical, we
 | ||||||
|  | -         * assume this is the root directory, which is a mount
 | ||||||
|  | -         * point. */
 | ||||||
|  | +        /* If the file handle for the directory we are interested in and its parent are identical,
 | ||||||
|  | +         * we assume this is the root directory, which is a mount point. */
 | ||||||
|  |   | ||||||
|  |          if (h->handle_bytes == h_parent->handle_bytes && | ||||||
|  |              h->handle_type == h_parent->handle_type && | ||||||
|  | @@ -300,10 +311,10 @@ int path_get_mnt_id(const char *path, int *ret) {
 | ||||||
|  |          int r; | ||||||
|  |   | ||||||
|  |          r = name_to_handle_at_loop(AT_FDCWD, path, NULL, ret, 0); | ||||||
|  | -        if (IN_SET(r, -EOPNOTSUPP, -ENOSYS, -EACCES, -EPERM, -EOVERFLOW, -EINVAL)) /* kernel/fs don't support this, or seccomp blocks access, or untriggered mount, or name_to_handle_at() is flaky */
 | ||||||
|  | -                return fd_fdinfo_mnt_id(AT_FDCWD, path, 0, ret);
 | ||||||
|  | +        if (r == 0 || is_name_to_handle_at_fatal_error(r))
 | ||||||
|  | +                return r;
 | ||||||
|  |   | ||||||
|  | -        return r;
 | ||||||
|  | +        return fd_fdinfo_mnt_id(AT_FDCWD, path, 0, ret);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  int umount_recursive(const char *prefix, int flags) { | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | From 537055fc407d7cff32ddd3414a6900ccff579c46 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Cyprien Laplace <claplace@vmware.com> | ||||||
|  | Date: Thu, 14 Nov 2019 09:42:14 -0500 | ||||||
|  | Subject: [PATCH] basic: add vmware hypervisor detection from device-tree | ||||||
|  | 
 | ||||||
|  | Allow ConditionVirtualization=vmware to work on ESXi on arm VMs | ||||||
|  | using device-tree. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 4d4ac92c928fcbc60b85fcbf8370af3883ee63db) | ||||||
|  | 
 | ||||||
|  | Resolves: #1959150 | ||||||
|  | ---
 | ||||||
|  |  src/basic/virt.c | 2 ++ | ||||||
|  |  1 file changed, 2 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/virt.c b/src/basic/virt.c
 | ||||||
|  | index 0b88005ed6..8d862b6d67 100644
 | ||||||
|  | --- a/src/basic/virt.c
 | ||||||
|  | +++ b/src/basic/virt.c
 | ||||||
|  | @@ -122,6 +122,8 @@ static int detect_vm_device_tree(void) {
 | ||||||
|  |                  return VIRTUALIZATION_KVM; | ||||||
|  |          else if (strstr(hvtype, "xen")) | ||||||
|  |                  return VIRTUALIZATION_XEN; | ||||||
|  | +        else if (strstr(hvtype, "vmware"))
 | ||||||
|  | +                return VIRTUALIZATION_VMWARE;
 | ||||||
|  |          else | ||||||
|  |                  return VIRTUALIZATION_VM_OTHER; | ||||||
|  |  #else | ||||||
| @ -0,0 +1,45 @@ | |||||||
|  | From a677e477ef541d172ede2a5bd728a4ff1ffb312d Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 1 Jun 2021 16:17:16 +0200 | ||||||
|  | Subject: [PATCH] pam: do not require a non-expired password for user@.service | ||||||
|  | 
 | ||||||
|  | Without this parameter, we would allow user@ to start if the user | ||||||
|  | has no password (i.e. the password is "locked"). But when the user does have a password, | ||||||
|  | and it is marked as expired, we would refuse to start the service. | ||||||
|  | There are other authentication mechanisms and we should not tie this service to | ||||||
|  | the password state. | ||||||
|  | 
 | ||||||
|  | The documented way to disable an *account* is to call 'chage -E0'. With a disabled | ||||||
|  | account, user@.service will still refuse to start: | ||||||
|  | 
 | ||||||
|  | systemd[16598]: PAM failed: User account has expired | ||||||
|  | systemd[16598]: PAM failed: User account has expired | ||||||
|  | systemd[16598]: user@1005.service: Failed to set up PAM session: Operation not permitted | ||||||
|  | systemd[16598]: user@1005.service: Failed at step PAM spawning /usr/lib/systemd/systemd: Operation not permitted | ||||||
|  | systemd[1]: user@1005.service: Main process exited, code=exited, status=224/PAM | ||||||
|  | systemd[1]: user@1005.service: Failed with result 'exit-code'. | ||||||
|  | systemd[1]: Failed to start user@1005.service. | ||||||
|  | systemd[1]: Stopping user-runtime-dir@1005.service... | ||||||
|  | 
 | ||||||
|  | Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1961746. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 71889176e4372b443018584c3520c1ff3efe2711) | ||||||
|  | 
 | ||||||
|  | Resolves: #1961746 | ||||||
|  | ---
 | ||||||
|  |  src/login/systemd-user.m4 | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/login/systemd-user.m4 b/src/login/systemd-user.m4
 | ||||||
|  | index 4f85b4b7fe..20c8999331 100644
 | ||||||
|  | --- a/src/login/systemd-user.m4
 | ||||||
|  | +++ b/src/login/systemd-user.m4
 | ||||||
|  | @@ -2,7 +2,7 @@
 | ||||||
|  |  # | ||||||
|  |  # Used by systemd --user instances. | ||||||
|  |   | ||||||
|  | -account required pam_unix.so
 | ||||||
|  | +account sufficient pam_unix.so no_pass_expiry
 | ||||||
|  |  m4_ifdef(`HAVE_SELINUX', | ||||||
|  |  session required pam_selinux.so close | ||||||
|  |  session required pam_selinux.so nottys open | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | From c0e530dc95fa7842ec1a48fd5df98956a76ae26c Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Luca Boccassi <luca.boccassi@microsoft.com> | ||||||
|  | Date: Fri, 26 Feb 2021 10:25:31 +0000 | ||||||
|  | Subject: [PATCH] udev rules: add rule to create /dev/ptp_hyperv | ||||||
|  | 
 | ||||||
|  | As for the KVM case, necessary for network cards with | ||||||
|  | PTP devices when running a guest on HyperV | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 32e868f058da8b90add00b2958c516241c532b70) | ||||||
|  | 
 | ||||||
|  | Resolves: #1991834 | ||||||
|  | ---
 | ||||||
|  |  rules/50-udev-default.rules.in | 2 ++ | ||||||
|  |  1 file changed, 2 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/rules/50-udev-default.rules.in b/rules/50-udev-default.rules.in
 | ||||||
|  | index 191f56f42e..36657ce1a4 100644
 | ||||||
|  | --- a/rules/50-udev-default.rules.in
 | ||||||
|  | +++ b/rules/50-udev-default.rules.in
 | ||||||
|  | @@ -83,4 +83,6 @@ KERNEL=="kvm", GROUP="kvm", MODE="@DEV_KVM_MODE@", OPTIONS+="static_node=kvm"
 | ||||||
|  |   | ||||||
|  |  SUBSYSTEM=="ptp", ATTR{clock_name}=="KVM virtual PTP", SYMLINK += "ptp_kvm" | ||||||
|  |   | ||||||
|  | +SUBSYSTEM=="ptp", ATTR{clock_name}=="hyperv", SYMLINK += "ptp_hyperv"
 | ||||||
|  | +
 | ||||||
|  |  LABEL="default_end" | ||||||
| @ -0,0 +1,223 @@ | |||||||
|  | From 9b30c003c8f80bf44f18168d07ea11c48e6d8864 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Wed, 7 Jul 2021 15:57:51 +0200 | ||||||
|  | Subject: [PATCH] process-util: explicitly handle processes lacking parents in | ||||||
|  |  get_process_ppid() | ||||||
|  | 
 | ||||||
|  | Let's make sure we signal out-of-band via an error message if a process | ||||||
|  | doesn't have a parent process whose PID we could return. Otherwise we'll | ||||||
|  | too likely hide errors, as we return an invalid PID 0, which in other | ||||||
|  | contexts has special meaning (i.e. usually "myself"). | ||||||
|  | 
 | ||||||
|  | Replaces: #20153 | ||||||
|  | 
 | ||||||
|  | This is based on work by @dtardon, but goes a different route, by | ||||||
|  | ensuring we propagate a proper error in this case. | ||||||
|  | 
 | ||||||
|  | This modernizes the function in question a bit in other ways, i.e. | ||||||
|  | renames stuff and makes the return parameter optional. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 0c4d1e6d96a549054bfe0597d197f829838917f1) | ||||||
|  | 
 | ||||||
|  | Resolves: #1977569 | ||||||
|  | ---
 | ||||||
|  |  src/basic/process-util.c     | 27 +++++++++++++------- | ||||||
|  |  src/coredump/coredump.c      | 23 +++++++++-------- | ||||||
|  |  src/test/test-process-util.c | 48 +++++++++++++++++++++++++++++++++--- | ||||||
|  |  3 files changed, 74 insertions(+), 24 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/process-util.c b/src/basic/process-util.c
 | ||||||
|  | index 0a4a747ba4..6016d83d41 100644
 | ||||||
|  | --- a/src/basic/process-util.c
 | ||||||
|  | +++ b/src/basic/process-util.c
 | ||||||
|  | @@ -603,20 +603,23 @@ int get_process_environ(pid_t pid, char **env) {
 | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int get_process_ppid(pid_t pid, pid_t *_ppid) {
 | ||||||
|  | -        int r;
 | ||||||
|  | +int get_process_ppid(pid_t pid, pid_t *ret) {
 | ||||||
|  |          _cleanup_free_ char *line = NULL; | ||||||
|  |          long unsigned ppid; | ||||||
|  |          const char *p; | ||||||
|  | +        int r;
 | ||||||
|  |   | ||||||
|  |          assert(pid >= 0); | ||||||
|  | -        assert(_ppid);
 | ||||||
|  |   | ||||||
|  |          if (pid == 0 || pid == getpid_cached()) { | ||||||
|  | -                *_ppid = getppid();
 | ||||||
|  | +                if (ret)
 | ||||||
|  | +                        *ret = getppid();
 | ||||||
|  |                  return 0; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | +        if (pid == 1) /* PID 1 has no parent, shortcut this case */
 | ||||||
|  | +                return -EADDRNOTAVAIL;
 | ||||||
|  | +
 | ||||||
|  |          p = procfs_file_alloca(pid, "stat"); | ||||||
|  |          r = read_one_line_file(p, &line); | ||||||
|  |          if (r == -ENOENT) | ||||||
|  | @@ -624,9 +627,8 @@ int get_process_ppid(pid_t pid, pid_t *_ppid) {
 | ||||||
|  |          if (r < 0) | ||||||
|  |                  return r; | ||||||
|  |   | ||||||
|  | -        /* Let's skip the pid and comm fields. The latter is enclosed
 | ||||||
|  | -         * in () but does not escape any () in its value, so let's
 | ||||||
|  | -         * skip over it manually */
 | ||||||
|  | +        /* Let's skip the pid and comm fields. The latter is enclosed in () but does not escape any () in its
 | ||||||
|  | +         * value, so let's skip over it manually */
 | ||||||
|  |   | ||||||
|  |          p = strrchr(line, ')'); | ||||||
|  |          if (!p) | ||||||
|  | @@ -640,10 +642,17 @@ int get_process_ppid(pid_t pid, pid_t *_ppid) {
 | ||||||
|  |                     &ppid) != 1) | ||||||
|  |                  return -EIO; | ||||||
|  |   | ||||||
|  | -        if ((long unsigned) (pid_t) ppid != ppid)
 | ||||||
|  | +        /* If ppid is zero the process has no parent. Which might be the case for PID 1 but also for
 | ||||||
|  | +         * processes originating in other namespaces that are inserted into a pidns. Return a recognizable
 | ||||||
|  | +         * error in this case. */
 | ||||||
|  | +        if (ppid == 0)
 | ||||||
|  | +                return -EADDRNOTAVAIL;
 | ||||||
|  | +
 | ||||||
|  | +        if ((pid_t) ppid < 0 || (long unsigned) (pid_t) ppid != ppid)
 | ||||||
|  |                  return -ERANGE; | ||||||
|  |   | ||||||
|  | -        *_ppid = (pid_t) ppid;
 | ||||||
|  | +        if (ret)
 | ||||||
|  | +                *ret = (pid_t) ppid;
 | ||||||
|  |   | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
|  | diff --git a/src/coredump/coredump.c b/src/coredump/coredump.c
 | ||||||
|  | index 2a130e8838..fb3a6ecfe9 100644
 | ||||||
|  | --- a/src/coredump/coredump.c
 | ||||||
|  | +++ b/src/coredump/coredump.c
 | ||||||
|  | @@ -591,8 +591,7 @@ static int get_process_ns(pid_t pid, const char *namespace, ino_t *ns) {
 | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -static int get_mount_namespace_leader(pid_t pid, pid_t *container_pid) {
 | ||||||
|  | -        pid_t cpid = pid, ppid = 0;
 | ||||||
|  | +static int get_mount_namespace_leader(pid_t pid, pid_t *ret) {
 | ||||||
|  |          ino_t proc_mntns; | ||||||
|  |          int r = 0; | ||||||
|  |   | ||||||
|  | @@ -602,8 +601,12 @@ static int get_mount_namespace_leader(pid_t pid, pid_t *container_pid) {
 | ||||||
|  |   | ||||||
|  |          for (;;) { | ||||||
|  |                  ino_t parent_mntns; | ||||||
|  | +                pid_t ppid;
 | ||||||
|  |   | ||||||
|  | -                r = get_process_ppid(cpid, &ppid);
 | ||||||
|  | +                r = get_process_ppid(pid, &ppid);
 | ||||||
|  | +                if (r == -EADDRNOTAVAIL) /* Reached the top (i.e. typically PID 1, but could also be a process
 | ||||||
|  | +                                          * whose parent is not in our pidns) */
 | ||||||
|  | +                        return -ENOENT;
 | ||||||
|  |                  if (r < 0) | ||||||
|  |                          return r; | ||||||
|  |   | ||||||
|  | @@ -611,17 +614,13 @@ static int get_mount_namespace_leader(pid_t pid, pid_t *container_pid) {
 | ||||||
|  |                  if (r < 0) | ||||||
|  |                          return r; | ||||||
|  |   | ||||||
|  | -                if (proc_mntns != parent_mntns)
 | ||||||
|  | -                        break;
 | ||||||
|  | -
 | ||||||
|  | -                if (ppid == 1)
 | ||||||
|  | -                        return -ENOENT;
 | ||||||
|  | +                if (proc_mntns != parent_mntns) {
 | ||||||
|  | +                        *ret = ppid;
 | ||||||
|  | +                        return 0;
 | ||||||
|  | +                }
 | ||||||
|  |   | ||||||
|  | -                cpid = ppid;
 | ||||||
|  | +                pid = ppid;
 | ||||||
|  |          } | ||||||
|  | -
 | ||||||
|  | -        *container_pid = ppid;
 | ||||||
|  | -        return 0;
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* Returns 1 if the parent was found. | ||||||
|  | diff --git a/src/test/test-process-util.c b/src/test/test-process-util.c
 | ||||||
|  | index 26e3247993..6b14ff592b 100644
 | ||||||
|  | --- a/src/test/test-process-util.c
 | ||||||
|  | +++ b/src/test/test-process-util.c
 | ||||||
|  | @@ -19,6 +19,7 @@
 | ||||||
|  |  #include "macro.h" | ||||||
|  |  #include "parse-util.h" | ||||||
|  |  #include "process-util.h" | ||||||
|  | +#include "procfs-util.h"
 | ||||||
|  |  #include "signal-util.h" | ||||||
|  |  #include "stdio-util.h" | ||||||
|  |  #include "string-util.h" | ||||||
|  | @@ -56,9 +57,12 @@ static void test_get_process_comm(pid_t pid) {
 | ||||||
|  |          assert_se(get_process_cmdline(pid, 1, false, &d) >= 0); | ||||||
|  |          log_info("PID"PID_FMT" cmdline truncated to 1: '%s'", pid, d); | ||||||
|  |   | ||||||
|  | -        assert_se(get_process_ppid(pid, &e) >= 0);
 | ||||||
|  | -        log_info("PID"PID_FMT" PPID: "PID_FMT, pid, e);
 | ||||||
|  | -        assert_se(pid == 1 ? e == 0 : e > 0);
 | ||||||
|  | +        r = get_process_ppid(pid, &e);
 | ||||||
|  | +        assert_se(pid == 1 ? r == -EADDRNOTAVAIL : r >= 0);
 | ||||||
|  | +        if (r >= 0) {
 | ||||||
|  | +                log_info("PID"PID_FMT" PPID: "PID_FMT, pid, e);
 | ||||||
|  | +                assert_se(e > 0);
 | ||||||
|  | +        }
 | ||||||
|  |   | ||||||
|  |          assert_se(is_kernel_thread(pid) == 0 || pid != 1); | ||||||
|  |   | ||||||
|  | @@ -585,6 +589,43 @@ static void test_ioprio_class_from_to_string(void) {
 | ||||||
|  |          test_ioprio_class_from_to_string_one("-1", -1); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static void test_get_process_ppid(void) {
 | ||||||
|  | +        uint64_t limit;
 | ||||||
|  | +        int r;
 | ||||||
|  | +
 | ||||||
|  | +        log_info("/* %s */", __func__);
 | ||||||
|  | +
 | ||||||
|  | +        assert_se(get_process_ppid(1, NULL) == -EADDRNOTAVAIL);
 | ||||||
|  | +
 | ||||||
|  | +        /* the process with the PID above the global limit definitely doesn't exist. Verify that */
 | ||||||
|  | +        assert_se(procfs_tasks_get_limit(&limit) >= 0);
 | ||||||
|  | +        assert_se(limit >= INT_MAX || get_process_ppid(limit+1, NULL) == -ESRCH);
 | ||||||
|  | +
 | ||||||
|  | +        for (pid_t pid = 0;;) {
 | ||||||
|  | +                _cleanup_free_ char *c1 = NULL, *c2 = NULL;
 | ||||||
|  | +                pid_t ppid;
 | ||||||
|  | +
 | ||||||
|  | +                r = get_process_ppid(pid, &ppid);
 | ||||||
|  | +                if (r == -EADDRNOTAVAIL) {
 | ||||||
|  | +                        log_info("No further parent PID");
 | ||||||
|  | +                        break;
 | ||||||
|  | +                }
 | ||||||
|  | +
 | ||||||
|  | +                assert_se(r >= 0);
 | ||||||
|  | +
 | ||||||
|  | +                /* NOTE: The size is SIZE_MAX in the original commit, but it would require backporting a
 | ||||||
|  | +                 * lot more stuff to support that (the current version of get_process_cmdline() just fails with
 | ||||||
|  | +                 * ENOMEM). UINT16_MAX should be enough for practical purposes.
 | ||||||
|  | +                 */
 | ||||||
|  | +                assert_se(get_process_cmdline(pid, UINT16_MAX, true, &c1) >= 0);
 | ||||||
|  | +                assert_se(get_process_cmdline(ppid, UINT16_MAX, true, &c2) >= 0);
 | ||||||
|  | +
 | ||||||
|  | +                log_info("Parent of " PID_FMT " (%s) is " PID_FMT " (%s).", pid, c1, ppid, c2);
 | ||||||
|  | +
 | ||||||
|  | +                pid = ppid;
 | ||||||
|  | +        }
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  int main(int argc, char *argv[]) { | ||||||
|  |          log_set_max_level(LOG_DEBUG); | ||||||
|  |          log_parse_environment(); | ||||||
|  | @@ -614,6 +655,7 @@ int main(int argc, char *argv[]) {
 | ||||||
|  |          test_safe_fork(); | ||||||
|  |          test_pid_to_ptr(); | ||||||
|  |          test_ioprio_class_from_to_string(); | ||||||
|  | +        test_get_process_ppid();
 | ||||||
|  |   | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
							
								
								
									
										30
									
								
								SOURCES/0652-errno-util-add-ERRNO_IS_PRIVILEGE-helper.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								SOURCES/0652-errno-util-add-ERRNO_IS_PRIVILEGE-helper.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | |||||||
|  | From c078d4d4bc3a61d186a98e03afc699b11134e09f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Wed, 20 Nov 2019 12:22:40 +0100 | ||||||
|  | Subject: [PATCH] errno-util: add ERRNO_IS_PRIVILEGE() helper | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit e884e000714c2db006384058a63788ffcce8c8b8) | ||||||
|  | 
 | ||||||
|  | Related: #1977569 | ||||||
|  | ---
 | ||||||
|  |  src/basic/util.h | 7 +++++++ | ||||||
|  |  1 file changed, 7 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/util.h b/src/basic/util.h
 | ||||||
|  | index c70467f98c..76b76d7e91 100644
 | ||||||
|  | --- a/src/basic/util.h
 | ||||||
|  | +++ b/src/basic/util.h
 | ||||||
|  | @@ -170,6 +170,13 @@ static inline int negative_errno(void) {
 | ||||||
|  |          return -errno; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +/* Two different errors for access problems */
 | ||||||
|  | +static inline bool ERRNO_IS_PRIVILEGE(int r) {
 | ||||||
|  | +        return IN_SET(abs(r),
 | ||||||
|  | +                      EACCES,
 | ||||||
|  | +                      EPERM);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  static inline unsigned u64log2(uint64_t n) { | ||||||
|  |  #if __SIZEOF_LONG_LONG__ == 8 | ||||||
|  |          return (n > 1) ? (unsigned) __builtin_clzll(n) ^ 63U : 0; | ||||||
| @ -0,0 +1,318 @@ | |||||||
|  | From 62678ec1aa02b53cb116b6f7dd72a54bf61153b7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 2 Nov 2021 18:18:21 +0100 | ||||||
|  | Subject: [PATCH] procfs-util: fix confusion wrt. quantity limit and maximum | ||||||
|  |  value | ||||||
|  | MIME-Version: 1.0 | ||||||
|  | Content-Type: text/plain; charset=UTF-8 | ||||||
|  | Content-Transfer-Encoding: 8bit | ||||||
|  | 
 | ||||||
|  | From packit/rawhide-arm64 logs: | ||||||
|  | Assertion 'limit >= INT_MAX || get_process_ppid(limit+1, NULL) == -ESRCH' failed at src/test/test-process-util.c:855, function test_get_process_ppid(). Aborting. | ||||||
|  | ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― | ||||||
|  | 
 | ||||||
|  | The kernel has a few different limits. In particular kernel.threads-max can be | ||||||
|  | set to some lower value, and kernel.pid_max can be set to a higher value. This | ||||||
|  | is nice because it reduces PID reuse, even if the number of threads that is | ||||||
|  | allowed is limited. But the tests assumed that we cannot have a thread with | ||||||
|  | PID above MIN(kernel.threads-max, kernel.pid_max-1), which is not valid. | ||||||
|  | 
 | ||||||
|  | So let's rework the whole thing: let's expose the helpers to read | ||||||
|  | kernel.threads-max and kernel.pid_max, and print what they return in tests. | ||||||
|  | procfs_tasks_get_limit() was something that is only used in tests, and wasn't | ||||||
|  | very well defined, so let's drop it. | ||||||
|  | 
 | ||||||
|  | Fixes #21193. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit c3dead53d50e334f2d072a2248256983d6dc9f8c) | ||||||
|  | 
 | ||||||
|  | Related: #1977569 | ||||||
|  | ---
 | ||||||
|  |  src/basic/procfs-util.c      | 53 +++++++++--------------------------- | ||||||
|  |  src/basic/procfs-util.h      |  4 ++- | ||||||
|  |  src/basic/util.c             | 49 +++++++++++++++++++++++---------- | ||||||
|  |  src/test/test-process-util.c | 10 +++++-- | ||||||
|  |  src/test/test-procfs-util.c  | 37 +++++++++++++++++++------ | ||||||
|  |  5 files changed, 88 insertions(+), 65 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/procfs-util.c b/src/basic/procfs-util.c
 | ||||||
|  | index 7aaf95bfce..fa5671dd72 100644
 | ||||||
|  | --- a/src/basic/procfs-util.c
 | ||||||
|  | +++ b/src/basic/procfs-util.c
 | ||||||
|  | @@ -12,54 +12,34 @@
 | ||||||
|  |  #include "stdio-util.h" | ||||||
|  |  #include "string-util.h" | ||||||
|  |   | ||||||
|  | -int procfs_tasks_get_limit(uint64_t *ret) {
 | ||||||
|  | +int procfs_get_pid_max(uint64_t *ret) {
 | ||||||
|  |          _cleanup_free_ char *value = NULL; | ||||||
|  | -        uint64_t pid_max, threads_max;
 | ||||||
|  |          int r; | ||||||
|  |   | ||||||
|  |          assert(ret); | ||||||
|  |   | ||||||
|  | -        /* So there are two sysctl files that control the system limit of processes:
 | ||||||
|  | -         *
 | ||||||
|  | -         * 1. kernel.threads-max: this is probably the sysctl that makes more sense, as it directly puts a limit on
 | ||||||
|  | -         *    concurrent tasks.
 | ||||||
|  | -         *
 | ||||||
|  | -         * 2. kernel.pid_max: this limits the numeric range PIDs can take, and thus indirectly also limits the number
 | ||||||
|  | -         *    of concurrent threads. AFAICS it's primarily a compatibility concept: some crappy old code used a signed
 | ||||||
|  | -         *    16bit type for PIDs, hence the kernel provides a way to ensure the PIDs never go beyond INT16_MAX by
 | ||||||
|  | -         *    default.
 | ||||||
|  | -         *
 | ||||||
|  | -         * By default #2 is set to much lower values than #1, hence the limit people come into contact with first, as
 | ||||||
|  | -         * it's the lowest boundary they need to bump when they want higher number of processes.
 | ||||||
|  | -         *
 | ||||||
|  | -         * Also note the weird definition of #2: PIDs assigned will be kept below this value, which means the number of
 | ||||||
|  | -         * tasks that can be created is one lower, as PID 0 is not a valid process ID. */
 | ||||||
|  | -
 | ||||||
|  |          r = read_one_line_file("/proc/sys/kernel/pid_max", &value); | ||||||
|  |          if (r < 0) | ||||||
|  |                  return r; | ||||||
|  |   | ||||||
|  | -        r = safe_atou64(value, &pid_max);
 | ||||||
|  | -        if (r < 0)
 | ||||||
|  | -                return r;
 | ||||||
|  | +        return safe_atou64(value, ret);
 | ||||||
|  | +}
 | ||||||
|  |   | ||||||
|  | -        value = mfree(value);
 | ||||||
|  | -        r = read_one_line_file("/proc/sys/kernel/threads-max", &value);
 | ||||||
|  | -        if (r < 0)
 | ||||||
|  | -                return r;
 | ||||||
|  | +int procfs_get_threads_max(uint64_t *ret) {
 | ||||||
|  | +        _cleanup_free_ char *value = NULL;
 | ||||||
|  | +        int r;
 | ||||||
|  |   | ||||||
|  | -        r = safe_atou64(value, &threads_max);
 | ||||||
|  | +        assert(ret);
 | ||||||
|  | +
 | ||||||
|  | +        r = read_one_line_file("/proc/sys/kernel/threads-max", &value);
 | ||||||
|  |          if (r < 0) | ||||||
|  |                  return r; | ||||||
|  |   | ||||||
|  | -        /* Subtract one from pid_max, since PID 0 is not a valid PID */
 | ||||||
|  | -        *ret = MIN(pid_max-1, threads_max);
 | ||||||
|  | -        return 0;
 | ||||||
|  | +        return safe_atou64(value, ret);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  int procfs_tasks_set_limit(uint64_t limit) { | ||||||
|  |          char buffer[DECIMAL_STR_MAX(uint64_t)+1]; | ||||||
|  | -        _cleanup_free_ char *value = NULL;
 | ||||||
|  |          uint64_t pid_max; | ||||||
|  |          int r; | ||||||
|  |   | ||||||
|  | @@ -74,10 +54,7 @@ int procfs_tasks_set_limit(uint64_t limit) {
 | ||||||
|  |           * set it to the maximum. */ | ||||||
|  |          limit = CLAMP(limit, 20U, TASKS_MAX); | ||||||
|  |   | ||||||
|  | -        r = read_one_line_file("/proc/sys/kernel/pid_max", &value);
 | ||||||
|  | -        if (r < 0)
 | ||||||
|  | -                return r;
 | ||||||
|  | -        r = safe_atou64(value, &pid_max);
 | ||||||
|  | +        r = procfs_get_pid_max(&pid_max);
 | ||||||
|  |          if (r < 0) | ||||||
|  |                  return r; | ||||||
|  |   | ||||||
|  | @@ -98,14 +75,10 @@ int procfs_tasks_set_limit(uint64_t limit) {
 | ||||||
|  |                  /* Hmm, we couldn't write this? If so, maybe it was already set properly? In that case let's not | ||||||
|  |                   * generate an error */ | ||||||
|  |   | ||||||
|  | -                value = mfree(value);
 | ||||||
|  | -                if (read_one_line_file("/proc/sys/kernel/threads-max", &value) < 0)
 | ||||||
|  | -                        return r; /* return original error */
 | ||||||
|  | -
 | ||||||
|  | -                if (safe_atou64(value, &threads_max) < 0)
 | ||||||
|  | +                if (procfs_get_threads_max(&threads_max) < 0)
 | ||||||
|  |                          return r; /* return original error */ | ||||||
|  |   | ||||||
|  | -                if (MIN(pid_max-1, threads_max) != limit)
 | ||||||
|  | +                if (MIN(pid_max - 1, threads_max) != limit)
 | ||||||
|  |                          return r; /* return original error */ | ||||||
|  |   | ||||||
|  |                  /* Yay! Value set already matches what we were trying to set, hence consider this a success. */ | ||||||
|  | diff --git a/src/basic/procfs-util.h b/src/basic/procfs-util.h
 | ||||||
|  | index 5a44e9eff7..caaee8b0b6 100644
 | ||||||
|  | --- a/src/basic/procfs-util.h
 | ||||||
|  | +++ b/src/basic/procfs-util.h
 | ||||||
|  | @@ -5,7 +5,9 @@
 | ||||||
|  |   | ||||||
|  |  #include "time-util.h" | ||||||
|  |   | ||||||
|  | -int procfs_tasks_get_limit(uint64_t *ret);
 | ||||||
|  | +int procfs_get_pid_max(uint64_t *ret);
 | ||||||
|  | +int procfs_get_threads_max(uint64_t *ret);
 | ||||||
|  | +
 | ||||||
|  |  int procfs_tasks_set_limit(uint64_t limit); | ||||||
|  |  int procfs_tasks_get_current(uint64_t *ret); | ||||||
|  |   | ||||||
|  | diff --git a/src/basic/util.c b/src/basic/util.c
 | ||||||
|  | index 609f8c2f33..548e3652cc 100644
 | ||||||
|  | --- a/src/basic/util.c
 | ||||||
|  | +++ b/src/basic/util.c
 | ||||||
|  | @@ -527,23 +527,46 @@ uint64_t physical_memory_scale(uint64_t v, uint64_t max) {
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  uint64_t system_tasks_max(void) { | ||||||
|  | -
 | ||||||
|  | -        uint64_t a = TASKS_MAX, b = TASKS_MAX;
 | ||||||
|  | +        uint64_t a = TASKS_MAX, b = TASKS_MAX, c = TASKS_MAX;
 | ||||||
|  |          _cleanup_free_ char *root = NULL; | ||||||
|  |          int r; | ||||||
|  |   | ||||||
|  | -        /* Determine the maximum number of tasks that may run on this system. We check three sources to determine this
 | ||||||
|  | -         * limit:
 | ||||||
|  | +        /* Determine the maximum number of tasks that may run on this system. We check three sources to
 | ||||||
|  | +         * determine this limit:
 | ||||||
|  | +         *
 | ||||||
|  | +         * a) kernel.threads-max sysctl: the maximum number of tasks (threads) the kernel allows.
 | ||||||
|  | +         *
 | ||||||
|  | +         *    This puts a direct limit on the number of concurrent tasks.
 | ||||||
|  | +         *
 | ||||||
|  | +         * b) kernel.pid_max sysctl: the maximum PID value.
 | ||||||
|  | +         *
 | ||||||
|  | +         *    This limits the numeric range PIDs can take, and thus indirectly also limits the number of
 | ||||||
|  | +         *    concurrent threads. It's primarily a compatibility concept: some crappy old code used a signed
 | ||||||
|  | +         *    16bit type for PIDs, hence the kernel provides a way to ensure the PIDs never go beyond
 | ||||||
|  | +         *    INT16_MAX by default.
 | ||||||
|  |           * | ||||||
|  | -         * a) the maximum tasks value the kernel allows on this architecture
 | ||||||
|  | -         * b) the cgroups pids_max attribute for the system
 | ||||||
|  | -         * c) the kernel's configured maximum PID value
 | ||||||
|  | +         *    Also note the weird definition: PIDs assigned will be kept below this value, which means
 | ||||||
|  | +         *    the number of tasks that can be created is one lower, as PID 0 is not a valid process ID.
 | ||||||
|  |           * | ||||||
|  | -         * And then pick the smallest of the three */
 | ||||||
|  | +         * c) pids.max on the root cgroup: the kernel's configured maximum number of tasks.
 | ||||||
|  | +         *
 | ||||||
|  | +         * and then pick the smallest of the three.
 | ||||||
|  | +         *
 | ||||||
|  | +         * By default pid_max is set to much lower values than threads-max, hence the limit people come into
 | ||||||
|  | +         * contact with first, as it's the lowest boundary they need to bump when they want higher number of
 | ||||||
|  | +         * processes.
 | ||||||
|  | +         */
 | ||||||
|  | +
 | ||||||
|  | +        r = procfs_get_threads_max(&a);
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                log_debug_errno(r, "Failed to read kernel.threads-max, ignoring: %m");
 | ||||||
|  |   | ||||||
|  | -        r = procfs_tasks_get_limit(&a);
 | ||||||
|  | +        r = procfs_get_pid_max(&b);
 | ||||||
|  |          if (r < 0) | ||||||
|  | -                log_debug_errno(r, "Failed to read maximum number of tasks from /proc, ignoring: %m");
 | ||||||
|  | +                log_debug_errno(r, "Failed to read kernel.pid_max, ignoring: %m");
 | ||||||
|  | +        else if (b > 0)
 | ||||||
|  | +                /* Subtract one from pid_max, since PID 0 is not a valid PID */
 | ||||||
|  | +                b--;
 | ||||||
|  |   | ||||||
|  |          r = cg_get_root_path(&root); | ||||||
|  |          if (r < 0) | ||||||
|  | @@ -555,15 +578,13 @@ uint64_t system_tasks_max(void) {
 | ||||||
|  |                  if (r < 0) | ||||||
|  |                          log_debug_errno(r, "Failed to read pids.max attribute of cgroup root, ignoring: %m"); | ||||||
|  |                  else if (!streq(value, "max")) { | ||||||
|  | -                        r = safe_atou64(value, &b);
 | ||||||
|  | +                        r = safe_atou64(value, &c);
 | ||||||
|  |                          if (r < 0) | ||||||
|  |                                  log_debug_errno(r, "Failed to parse pids.max attribute of cgroup root, ignoring: %m"); | ||||||
|  |                  } | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | -        return MIN3(TASKS_MAX,
 | ||||||
|  | -                    a <= 0 ? TASKS_MAX : a,
 | ||||||
|  | -                    b <= 0 ? TASKS_MAX : b);
 | ||||||
|  | +        return MIN3(a, b, c);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  uint64_t system_tasks_max_scale(uint64_t v, uint64_t max) { | ||||||
|  | diff --git a/src/test/test-process-util.c b/src/test/test-process-util.c
 | ||||||
|  | index 6b14ff592b..6295889b47 100644
 | ||||||
|  | --- a/src/test/test-process-util.c
 | ||||||
|  | +++ b/src/test/test-process-util.c
 | ||||||
|  | @@ -598,8 +598,14 @@ static void test_get_process_ppid(void) {
 | ||||||
|  |          assert_se(get_process_ppid(1, NULL) == -EADDRNOTAVAIL); | ||||||
|  |   | ||||||
|  |          /* the process with the PID above the global limit definitely doesn't exist. Verify that */ | ||||||
|  | -        assert_se(procfs_tasks_get_limit(&limit) >= 0);
 | ||||||
|  | -        assert_se(limit >= INT_MAX || get_process_ppid(limit+1, NULL) == -ESRCH);
 | ||||||
|  | +        assert_se(procfs_get_pid_max(&limit) >= 0);
 | ||||||
|  | +        log_debug("kernel.pid_max = %"PRIu64, limit);
 | ||||||
|  | +
 | ||||||
|  | +        if (limit < INT_MAX) {
 | ||||||
|  | +                r = get_process_ppid(limit + 1, NULL);
 | ||||||
|  | +                log_debug_errno(r, "get_process_limit(%"PRIu64") → %d/%m", limit + 1, r);
 | ||||||
|  | +                assert(r == -ESRCH);
 | ||||||
|  | +        }
 | ||||||
|  |   | ||||||
|  |          for (pid_t pid = 0;;) { | ||||||
|  |                  _cleanup_free_ char *c1 = NULL, *c2 = NULL; | ||||||
|  | diff --git a/src/test/test-procfs-util.c b/src/test/test-procfs-util.c
 | ||||||
|  | index 1d0612985b..bb6943fed0 100644
 | ||||||
|  | --- a/src/test/test-procfs-util.c
 | ||||||
|  | +++ b/src/test/test-procfs-util.c
 | ||||||
|  | @@ -5,11 +5,13 @@
 | ||||||
|  |  #include "log.h" | ||||||
|  |  #include "parse-util.h" | ||||||
|  |  #include "procfs-util.h" | ||||||
|  | +#include "process-util.h"
 | ||||||
|  | +#include "util.h"
 | ||||||
|  |   | ||||||
|  |  int main(int argc, char *argv[]) { | ||||||
|  |          char buf[CONST_MAX(FORMAT_TIMESPAN_MAX, FORMAT_BYTES_MAX)]; | ||||||
|  |          nsec_t nsec; | ||||||
|  | -        uint64_t v;
 | ||||||
|  | +        uint64_t v, w;
 | ||||||
|  |          int r; | ||||||
|  |   | ||||||
|  |          log_parse_environment(); | ||||||
|  | @@ -24,22 +26,41 @@ int main(int argc, char *argv[]) {
 | ||||||
|  |          assert_se(procfs_tasks_get_current(&v) >= 0); | ||||||
|  |          log_info("Current number of tasks: %" PRIu64, v); | ||||||
|  |   | ||||||
|  | -        assert_se(procfs_tasks_get_limit(&v) >= 0);
 | ||||||
|  | +        v = TASKS_MAX;
 | ||||||
|  | +        r = procfs_get_pid_max(&v);
 | ||||||
|  | +        assert(r >= 0 || r == -ENOENT || ERRNO_IS_PRIVILEGE(r));
 | ||||||
|  | +        log_info("kernel.pid_max: %"PRIu64, v);
 | ||||||
|  | +
 | ||||||
|  | +        w = TASKS_MAX;
 | ||||||
|  | +        r = procfs_get_threads_max(&w);
 | ||||||
|  | +        assert(r >= 0 || r == -ENOENT || ERRNO_IS_PRIVILEGE(r));
 | ||||||
|  | +        log_info("kernel.threads-max: %"PRIu64, w);
 | ||||||
|  | +
 | ||||||
|  | +        v = MIN(v - (v > 0), w);
 | ||||||
|  | +
 | ||||||
|  | +        assert_se(r >= 0);
 | ||||||
|  |          log_info("Limit of tasks: %" PRIu64, v); | ||||||
|  |          assert_se(v > 0); | ||||||
|  | -        assert_se(procfs_tasks_set_limit(v) >= 0);
 | ||||||
|  | +        r = procfs_tasks_set_limit(v);
 | ||||||
|  | +        if (r == -ENOENT || ERRNO_IS_PRIVILEGE(r)) {
 | ||||||
|  | +                log_notice_errno(r, "Skipping test: can't set task limits");
 | ||||||
|  | +                return EXIT_TEST_SKIP;
 | ||||||
|  | +        }
 | ||||||
|  | +        assert(r >= 0);
 | ||||||
|  |   | ||||||
|  |          if (v > 100) { | ||||||
|  | -                uint64_t w;
 | ||||||
|  | +                log_info("Reducing limit by one to %"PRIu64"…", v-1);
 | ||||||
|  | +
 | ||||||
|  |                  r = procfs_tasks_set_limit(v-1); | ||||||
|  | -                assert_se(IN_SET(r, 0, -EPERM, -EACCES, -EROFS));
 | ||||||
|  | +                log_info_errno(r, "procfs_tasks_set_limit: %m");
 | ||||||
|  | +                assert_se(r >= 0 || ERRNO_IS_PRIVILEGE(r));
 | ||||||
|  |   | ||||||
|  | -                assert_se(procfs_tasks_get_limit(&w) >= 0);
 | ||||||
|  | -                assert_se((r == 0 && w == v - 1) || (r < 0 && w == v));
 | ||||||
|  | +                assert_se(procfs_get_threads_max(&w) >= 0);
 | ||||||
|  | +                assert_se(r >= 0 ? w == v - 1 : w == v);
 | ||||||
|  |   | ||||||
|  |                  assert_se(procfs_tasks_set_limit(v) >= 0); | ||||||
|  |   | ||||||
|  | -                assert_se(procfs_tasks_get_limit(&w) >= 0);
 | ||||||
|  | +                assert_se(procfs_get_threads_max(&w) >= 0);
 | ||||||
|  |                  assert_se(v == w); | ||||||
|  |          } | ||||||
|  |   | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | From fe15b97e44beb69305d3970a3748624ae76f9f04 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Wed, 3 Nov 2021 09:39:16 +0100 | ||||||
|  | Subject: [PATCH] test-process-util: also add EROFS to the list of "good" | ||||||
|  |  errors | ||||||
|  | 
 | ||||||
|  | It is only added in the one place where we actually try to set the | ||||||
|  | setting to a new value. Before we were testing if we can set to it the | ||||||
|  | existing value, which was a noop. We could still get a permission error, | ||||||
|  | but this is the first place where we would propagate EROFS. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 6434a83d01d96e9f9a17ed9ce1f04a7d64859950) | ||||||
|  | 
 | ||||||
|  | Related: #1977569 | ||||||
|  | ---
 | ||||||
|  |  src/test/test-procfs-util.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/test/test-procfs-util.c b/src/test/test-procfs-util.c
 | ||||||
|  | index bb6943fed0..d656c4df4f 100644
 | ||||||
|  | --- a/src/test/test-procfs-util.c
 | ||||||
|  | +++ b/src/test/test-procfs-util.c
 | ||||||
|  | @@ -53,7 +53,7 @@ int main(int argc, char *argv[]) {
 | ||||||
|  |   | ||||||
|  |                  r = procfs_tasks_set_limit(v-1); | ||||||
|  |                  log_info_errno(r, "procfs_tasks_set_limit: %m"); | ||||||
|  | -                assert_se(r >= 0 || ERRNO_IS_PRIVILEGE(r));
 | ||||||
|  | +                assert_se(r >= 0 || ERRNO_IS_PRIVILEGE(r) || r == -EROFS);
 | ||||||
|  |   | ||||||
|  |                  assert_se(procfs_get_threads_max(&w) >= 0); | ||||||
|  |                  assert_se(r >= 0 ? w == v - 1 : w == v); | ||||||
| @ -0,0 +1,146 @@ | |||||||
|  | From a42cf9af339f48f633fa0b17a960e1e407b7450f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lorenz Bauer <lmb@cloudflare.com> | ||||||
|  | Date: Mon, 4 Nov 2019 16:35:46 +0000 | ||||||
|  | Subject: [PATCH] journal: refresh cached credentials of stdout streams | ||||||
|  | 
 | ||||||
|  | journald assumes that getsockopt(SO_PEERCRED) correctly identifies the | ||||||
|  | process on the remote end of the socket. However, this is incorrect | ||||||
|  | according to man 7 socket: | ||||||
|  | 
 | ||||||
|  |     The returned  credentials  are  those that were in effect at the | ||||||
|  |     time of the call to connect(2) or socketpair(2). | ||||||
|  | 
 | ||||||
|  | This becomes a problem when a new process inherits the stdout stream | ||||||
|  | from a parent. First, log messages from the child process will | ||||||
|  | be attributed to the parent. Second, the struct ucred used by journald | ||||||
|  | becomes invalid as soon as the parent exits. Further sendmsg calls then | ||||||
|  | fail with ENOENT. Logs for the child process then vanish from the journal. | ||||||
|  | 
 | ||||||
|  | Fix this by using recvmsg on the stdout stream, and refreshing the cached | ||||||
|  | struct ucred if SCM_CREDENTIALS indicate a new process. | ||||||
|  | 
 | ||||||
|  | Fixes #13708 | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 09d0b46ab61bebafe5bdc1be95ee153dfb13d6bc) | ||||||
|  | 
 | ||||||
|  | Resolves: #1931806 | ||||||
|  | ---
 | ||||||
|  |  src/journal/journald-stream.c        | 49 ++++++++++++++++++++++++++-- | ||||||
|  |  test/TEST-04-JOURNAL/test-journal.sh | 13 ++++++++ | ||||||
|  |  2 files changed, 60 insertions(+), 2 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/journal/journald-stream.c b/src/journal/journald-stream.c
 | ||||||
|  | index 6f8a4011ff..302a82d3d7 100644
 | ||||||
|  | --- a/src/journal/journald-stream.c
 | ||||||
|  | +++ b/src/journal/journald-stream.c
 | ||||||
|  | @@ -484,11 +484,22 @@ static int stdout_stream_scan(StdoutStream *s, bool force_flush) {
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static int stdout_stream_process(sd_event_source *es, int fd, uint32_t revents, void *userdata) { | ||||||
|  | +        uint8_t buf[CMSG_SPACE(sizeof(struct ucred))];
 | ||||||
|  |          StdoutStream *s = userdata; | ||||||
|  | +        struct ucred *ucred = NULL;
 | ||||||
|  | +        struct cmsghdr *cmsg;
 | ||||||
|  | +        struct iovec iovec;
 | ||||||
|  |          size_t limit; | ||||||
|  |          ssize_t l; | ||||||
|  |          int r; | ||||||
|  |   | ||||||
|  | +        struct msghdr msghdr = {
 | ||||||
|  | +                .msg_iov = &iovec,
 | ||||||
|  | +                .msg_iovlen = 1,
 | ||||||
|  | +                .msg_control = buf,
 | ||||||
|  | +                .msg_controllen = sizeof(buf),
 | ||||||
|  | +        };
 | ||||||
|  | +
 | ||||||
|  |          assert(s); | ||||||
|  |   | ||||||
|  |          if ((revents|EPOLLIN|EPOLLHUP) != (EPOLLIN|EPOLLHUP)) { | ||||||
|  | @@ -508,20 +519,50 @@ static int stdout_stream_process(sd_event_source *es, int fd, uint32_t revents,
 | ||||||
|  |           * always leave room for a terminating NUL we might need to add. */ | ||||||
|  |          limit = MIN(s->allocated - 1, s->server->line_max); | ||||||
|  |   | ||||||
|  | -        l = read(s->fd, s->buffer + s->length, limit - s->length);
 | ||||||
|  | +        iovec = IOVEC_MAKE(s->buffer + s->length, limit - s->length);
 | ||||||
|  | +
 | ||||||
|  | +        l = recvmsg(s->fd, &msghdr, MSG_DONTWAIT|MSG_CMSG_CLOEXEC);
 | ||||||
|  |          if (l < 0) { | ||||||
|  | -                if (errno == EAGAIN)
 | ||||||
|  | +                if (IN_SET(errno, EINTR, EAGAIN))
 | ||||||
|  |                          return 0; | ||||||
|  |   | ||||||
|  |                  log_warning_errno(errno, "Failed to read from stream: %m"); | ||||||
|  |                  goto terminate; | ||||||
|  |          } | ||||||
|  | +        cmsg_close_all(&msghdr);
 | ||||||
|  |   | ||||||
|  |          if (l == 0) { | ||||||
|  |                  stdout_stream_scan(s, true); | ||||||
|  |                  goto terminate; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | +        CMSG_FOREACH(cmsg, &msghdr)
 | ||||||
|  | +                if (cmsg->cmsg_level == SOL_SOCKET &&
 | ||||||
|  | +                    cmsg->cmsg_type == SCM_CREDENTIALS &&
 | ||||||
|  | +                    cmsg->cmsg_len == CMSG_LEN(sizeof(struct ucred))) {
 | ||||||
|  | +                        ucred = (struct ucred *)CMSG_DATA(cmsg);
 | ||||||
|  | +                        break;
 | ||||||
|  | +                }
 | ||||||
|  | +
 | ||||||
|  | +        /* Invalidate the context if the pid of the sender changed.
 | ||||||
|  | +         * This happens when a forked process inherits stdout / stderr
 | ||||||
|  | +         * from a parent. In this case getpeercred returns the ucred
 | ||||||
|  | +         * of the parent, which can be invalid if the parent has exited
 | ||||||
|  | +         * in the meantime.
 | ||||||
|  | +         */
 | ||||||
|  | +        if (ucred && ucred->pid != s->ucred.pid) {
 | ||||||
|  | +                /* force out any previously half-written lines from a
 | ||||||
|  | +                 * different process, before we switch to the new ucred
 | ||||||
|  | +                 * structure for everything we just added */
 | ||||||
|  | +                r = stdout_stream_scan(s, true);
 | ||||||
|  | +                if (r < 0)
 | ||||||
|  | +                        goto terminate;
 | ||||||
|  | +
 | ||||||
|  | +                s->ucred = *ucred;
 | ||||||
|  | +                client_context_release(s->server, s->context);
 | ||||||
|  | +                s->context = NULL;
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  |          s->length += l; | ||||||
|  |          r = stdout_stream_scan(s, false); | ||||||
|  |          if (r < 0) | ||||||
|  | @@ -559,6 +600,10 @@ int stdout_stream_install(Server *s, int fd, StdoutStream **ret) {
 | ||||||
|  |          if (r < 0) | ||||||
|  |                  return log_error_errno(r, "Failed to determine peer credentials: %m"); | ||||||
|  |   | ||||||
|  | +        r = setsockopt_int(fd, SOL_SOCKET, SO_PASSCRED, true);
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                return log_error_errno(r, "SO_PASSCRED failed: %m");
 | ||||||
|  | +
 | ||||||
|  |          if (mac_selinux_use()) { | ||||||
|  |                  r = getpeersec(fd, &stream->label); | ||||||
|  |                  if (r < 0 && r != -EOPNOTSUPP) | ||||||
|  | diff --git a/test/TEST-04-JOURNAL/test-journal.sh b/test/TEST-04-JOURNAL/test-journal.sh
 | ||||||
|  | index 260cae09ab..52a6ee84d1 100755
 | ||||||
|  | --- a/test/TEST-04-JOURNAL/test-journal.sh
 | ||||||
|  | +++ b/test/TEST-04-JOURNAL/test-journal.sh
 | ||||||
|  | @@ -63,6 +63,19 @@ grep -q '^PRIORITY=6$' /output
 | ||||||
|  |  ! grep -q '^FOO=' /output | ||||||
|  |  ! grep -q '^SYSLOG_FACILITY=' /output | ||||||
|  |   | ||||||
|  | +# https://github.com/systemd/systemd/issues/13708
 | ||||||
|  | +ID=$(journalctl --new-id128 | sed -n 2p)
 | ||||||
|  | +systemd-cat -t "$ID" bash -c 'echo parent; (echo child) & wait' &
 | ||||||
|  | +PID=$!
 | ||||||
|  | +wait %%
 | ||||||
|  | +journalctl --sync
 | ||||||
|  | +# We can drop this grep when https://github.com/systemd/systemd/issues/13937
 | ||||||
|  | +# has a fix.
 | ||||||
|  | +journalctl -b -o export -t "$ID" --output-fields=_PID | grep '^_PID=' >/output
 | ||||||
|  | +[[ `grep -c . /output` -eq 2 ]]
 | ||||||
|  | +grep -q "^_PID=$PID" /output
 | ||||||
|  | +grep -vq "^_PID=$PID" /output
 | ||||||
|  | +
 | ||||||
|  |  # Don't lose streams on restart | ||||||
|  |  systemctl start forever-print-hola | ||||||
|  |  sleep 3 | ||||||
| @ -1,37 +0,0 @@ | |||||||
| From 93c42f4da4563d225e3a2b9e72e8f9bb50d86bb1 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: David Tardon <dtardon@redhat.com> |  | ||||||
| Date: Fri, 17 Sep 2021 15:10:03 +0200 |  | ||||||
| Subject: [PATCH] Fix LGTM build |  | ||||||
| 
 |  | ||||||
| Related: #1850986 |  | ||||||
| ---
 |  | ||||||
|  src/network/netdev/netdev.c    | 2 +- |  | ||||||
|  src/network/networkd-network.c | 2 +- |  | ||||||
|  2 files changed, 2 insertions(+), 2 deletions(-) |  | ||||||
| 
 |  | ||||||
| diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c
 |  | ||||||
| index 82ce88402f..e97cc07028 100644
 |  | ||||||
| --- a/src/network/netdev/netdev.c
 |  | ||||||
| +++ b/src/network/netdev/netdev.c
 |  | ||||||
| @@ -640,7 +640,7 @@ static int netdev_load_one(Manager *manager, const char *filename) {
 |  | ||||||
|                               netdev_raw->match_host, netdev_raw->match_virt, |  | ||||||
|                               netdev_raw->match_kernel_cmdline, netdev_raw->match_kernel_version, |  | ||||||
|                               netdev_raw->match_arch, |  | ||||||
| -                             NULL, NULL, NULL, NULL, NULL, NULL) <= 0)
 |  | ||||||
| +                             NULL, NULL, NULL, NULL, NULL, NULL, NULL) <= 0)
 |  | ||||||
|                  return 0; |  | ||||||
|   |  | ||||||
|          if (netdev_raw->kind == _NETDEV_KIND_INVALID) { |  | ||||||
| diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
 |  | ||||||
| index 429aac5e6c..7637d135a4 100644
 |  | ||||||
| --- a/src/network/networkd-network.c
 |  | ||||||
| +++ b/src/network/networkd-network.c
 |  | ||||||
| @@ -479,7 +479,7 @@ int network_get(Manager *manager, struct udev_device *device,
 |  | ||||||
|                                       network->match_virt, network->match_kernel_cmdline, |  | ||||||
|                                       network->match_kernel_version, network->match_arch, |  | ||||||
|                                       address, path, parent_driver, driver, |  | ||||||
| -                                     devtype, ifname)) {
 |  | ||||||
| +                                     devtype, ifname, NULL)) {
 |  | ||||||
|                          if (network->match_name && device) { |  | ||||||
|                                  const char *attr; |  | ||||||
|                                  uint8_t name_assign_type = NET_NAME_UNKNOWN; |  | ||||||
| @ -0,0 +1,35 @@ | |||||||
|  | From 39b10c9e7e4ad80adc0e8c43f7d1917edee515dd Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Evgeny Vereshchagin <evvers@ya.ru> | ||||||
|  | Date: Sun, 2 Dec 2018 08:28:24 +0100 | ||||||
|  | Subject: [PATCH] util-lib: introduce HAS_FEATURE_ADDRESS_SANITIZER | ||||||
|  | 
 | ||||||
|  | https://clang.llvm.org/docs/AddressSanitizer.html#conditional-compilation-with-has-feature-address-sanitizer | ||||||
|  | (cherry picked from commit 289acab951c5937fdf6d3a2666f411fd66dd20e5) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  src/basic/macro.h | 11 +++++++++++ | ||||||
|  |  1 file changed, 11 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/macro.h b/src/basic/macro.h
 | ||||||
|  | index 0fe6a62aa8..62f2359633 100644
 | ||||||
|  | --- a/src/basic/macro.h
 | ||||||
|  | +++ b/src/basic/macro.h
 | ||||||
|  | @@ -55,6 +55,17 @@
 | ||||||
|  |  #  endif | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  | +#if !defined(HAS_FEATURE_ADDRESS_SANITIZER)
 | ||||||
|  | +#  if defined(__has_feature)
 | ||||||
|  | +#    if __has_feature(address_sanitizer)
 | ||||||
|  | +#      define HAS_FEATURE_ADDRESS_SANITIZER 1
 | ||||||
|  | +#    endif
 | ||||||
|  | +#  endif
 | ||||||
|  | +#  if !defined(HAS_FEATURE_ADDRESS_SANITIZER)
 | ||||||
|  | +#    define HAS_FEATURE_ADDRESS_SANITIZER 0
 | ||||||
|  | +#  endif
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  |  /* Temporarily disable some warnings */ | ||||||
|  |  #define DISABLE_WARNING_DECLARATION_AFTER_STATEMENT                     \ | ||||||
|  |          _Pragma("GCC diagnostic push");                                 \ | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | From c0c7a5d73bd53375f90fbe70287512269bc8de16 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
|  | Date: Tue, 12 Jan 2021 22:14:59 +0100 | ||||||
|  | Subject: [PATCH] ci: skip test-execute on GH Actions under ASan | ||||||
|  | 
 | ||||||
|  | It seems to suffer from the same issue as on Travis CI, where the test | ||||||
|  | randomly fails due to timeouts in its subtests. | ||||||
|  | 
 | ||||||
|  | See: https://github.com/systemd/systemd/issues/10696#issuecomment-758501797 | ||||||
|  | (cherry picked from commit f1a8fed286e3b9527b1837e9d5c6cb8d88bd2041) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  src/test/test-execute.c | 7 +++++++ | ||||||
|  |  1 file changed, 7 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/test/test-execute.c b/src/test/test-execute.c
 | ||||||
|  | index 294f8fe7dd..5303652b93 100644
 | ||||||
|  | --- a/src/test/test-execute.c
 | ||||||
|  | +++ b/src/test/test-execute.c
 | ||||||
|  | @@ -798,6 +798,13 @@ int main(int argc, char *argv[]) {
 | ||||||
|  |          log_parse_environment(); | ||||||
|  |          log_open(); | ||||||
|  |   | ||||||
|  | +#if HAS_FEATURE_ADDRESS_SANITIZER
 | ||||||
|  | +        if (strstr_ptr(ci_environment(), "travis") || strstr_ptr(ci_environment(), "github-actions")) {
 | ||||||
|  | +                log_notice("Running on Travis CI/GH Actions under ASan, skipping, see https://github.com/systemd/systemd/issues/10696");
 | ||||||
|  | +                return EXIT_TEST_SKIP;
 | ||||||
|  | +        }
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  |          (void) unsetenv("USER"); | ||||||
|  |          (void) unsetenv("LOGNAME"); | ||||||
|  |          (void) unsetenv("SHELL"); | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 307930f1c7e7588e6cfdc413147c5fc615ae73de Mon Sep 17 00:00:00 2001 | From 8c15742d1194e0db9a2555553e4d77ebb441b3dc Mon Sep 17 00:00:00 2001 | ||||||
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
| Date: Tue, 22 Sep 2020 19:05:17 +0200 | Date: Tue, 22 Sep 2020 19:05:17 +0200 | ||||||
| Subject: [PATCH] test-seccomp: accept ENOSYS from sysctl(2) too | Subject: [PATCH] test-seccomp: accept ENOSYS from sysctl(2) too | ||||||
| @ -7,7 +7,7 @@ It seems that kernel 5.9 started returning that. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 0af05e485a3a88f454c714901eb6109307dc893e) | (cherry picked from commit 0af05e485a3a88f454c714901eb6109307dc893e) | ||||||
| 
 | 
 | ||||||
| Related: #2024903 | Related: #2017033 | ||||||
| ---
 | ---
 | ||||||
|  src/test/test-seccomp.c | 2 +- |  src/test/test-seccomp.c | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
| @ -1,14 +1,13 @@ | |||||||
| From 5763844219e88a993d1b93653585bc68e909353c Mon Sep 17 00:00:00 2001 | From e61aa66a63bcfe9ce0d80f0db691ba40218b872a Mon Sep 17 00:00:00 2001 | ||||||
| From: Lennart Poettering <lennart@poettering.net> | From: Lennart Poettering <lennart@poettering.net> | ||||||
| Date: Fri, 14 Aug 2020 21:50:55 +0200 | Date: Fri, 14 Aug 2020 21:50:55 +0200 | ||||||
| Subject: [PATCH] test: accept that char device 0/0 can now be created witout | Subject: [PATCH] test: accept that char device 0/0 can now be created witout | ||||||
|  privileges |  privileges | ||||||
| 
 | 
 | ||||||
| Fixes: #16721 | Fixes: #16721 | ||||||
| 
 |  | ||||||
| (cherry picked from commit 5b5ce6298e5a1c09beacd5c963e2350979cbf94a) | (cherry picked from commit 5b5ce6298e5a1c09beacd5c963e2350979cbf94a) | ||||||
| 
 | 
 | ||||||
| Related: #2024903 | Related: #2017033 | ||||||
| ---
 | ---
 | ||||||
|  src/test/test-fs-util.c | 12 ++++++------ |  src/test/test-fs-util.c | 12 ++++++------ | ||||||
|  1 file changed, 6 insertions(+), 6 deletions(-) |  1 file changed, 6 insertions(+), 6 deletions(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 112de8e094470d2a8df4f7c9b8ca62bd68c96a70 Mon Sep 17 00:00:00 2001 | From d5cefb7293d2999dcad81bd71933b319ca6c3590 Mon Sep 17 00:00:00 2001 | ||||||
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
| Date: Mon, 12 Apr 2021 14:03:32 +0200 | Date: Mon, 12 Apr 2021 14:03:32 +0200 | ||||||
| Subject: [PATCH] meson: do not fail if rsync is not installed with meson | Subject: [PATCH] meson: do not fail if rsync is not installed with meson | ||||||
| @ -11,7 +11,7 @@ we need a quick workaround here. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 7c5fd25119a495009ea62f79e5daec34cc464628) | (cherry picked from commit 7c5fd25119a495009ea62f79e5daec34cc464628) | ||||||
| 
 | 
 | ||||||
| Related: #2030027 | Related: #2017033 | ||||||
| ---
 | ---
 | ||||||
|  man/meson.build | 25 ++++++++++++++----------- |  man/meson.build | 25 ++++++++++++++----------- | ||||||
|  1 file changed, 14 insertions(+), 11 deletions(-) |  1 file changed, 14 insertions(+), 11 deletions(-) | ||||||
| @ -1,14 +1,13 @@ | |||||||
| From b526b7636961ca3d303a6965879b3575e4cc293b Mon Sep 17 00:00:00 2001 | From 30afbfdc82eb61f3bf47d6b1fa67a61d0ffcc4f2 Mon Sep 17 00:00:00 2001 | ||||||
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
| Date: Fri, 14 Dec 2018 08:16:31 +0100 | Date: Fri, 14 Dec 2018 08:16:31 +0100 | ||||||
| Subject: [PATCH] pid1: fix free of uninitialized pointer in | Subject: [PATCH] pid1: fix free of uninitialized pointer in | ||||||
|  unit_fail_if_noncanonical() |  unit_fail_if_noncanonical() | ||||||
| 
 | 
 | ||||||
| https://bugzilla.redhat.com/show_bug.cgi?id=1653068 | https://bugzilla.redhat.com/show_bug.cgi?id=1653068 | ||||||
| 
 |  | ||||||
| (cherry picked from commit 58d9d89b4b41189bdcea86c2ad5cf708b7d54aca) | (cherry picked from commit 58d9d89b4b41189bdcea86c2ad5cf708b7d54aca) | ||||||
| 
 | 
 | ||||||
| Related: #2024903 | Related: #1970945 | ||||||
| ---
 | ---
 | ||||||
|  src/core/unit.c | 2 +- |  src/core/unit.c | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 814da05c68d9e892c1f89585cc07c6a0330f3e37 Mon Sep 17 00:00:00 2001 | From f025def77efc6bb1473b719e905fa70ed20b08d3 Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Wed, 8 Sep 2021 15:42:11 +0200 | Date: Wed, 8 Sep 2021 15:42:11 +0200 | ||||||
| Subject: [PATCH] sd-event: take ref on event loop object before dispatching | Subject: [PATCH] sd-event: take ref on event loop object before dispatching | ||||||
| @ -12,7 +12,7 @@ accidentally dropped. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 9f6ef467818f902fe5369c8e37a39a3901bdcf4f) | (cherry picked from commit 9f6ef467818f902fe5369c8e37a39a3901bdcf4f) | ||||||
| 
 | 
 | ||||||
| Resolves: #2024903 | Related: #1970945 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-event/sd-event.c | 2 +- |  src/libsystemd/sd-event/sd-event.c | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
| @ -0,0 +1,33 @@ | |||||||
|  | From c667291303bb876707d86ac3ab9ca62355bae1b3 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 22:45:34 +0200 | ||||||
|  | Subject: [PATCH] core: consider service with no start command immediately | ||||||
|  |  started | ||||||
|  | 
 | ||||||
|  | The service would always be in state == SERVICE_INACTIVE, but it needs to go | ||||||
|  | through state == SERVICE_START so that SuccessAction/FailureAction are executed. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit ef5ae8e71329e43c277e6d4f983f0c0793047b94) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  src/core/service.c | 6 ++++++ | ||||||
|  |  1 file changed, 6 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/service.c b/src/core/service.c
 | ||||||
|  | index ae31973774..4da1c5accb 100644
 | ||||||
|  | --- a/src/core/service.c
 | ||||||
|  | +++ b/src/core/service.c
 | ||||||
|  | @@ -2055,6 +2055,12 @@ static void service_enter_start(Service *s) {
 | ||||||
|  |                          goto fail; | ||||||
|  |                  } | ||||||
|  |   | ||||||
|  | +                /* We force a fake state transition here. Otherwise, the unit would go directly from
 | ||||||
|  | +                 * SERVICE_DEAD to SERVICE_DEAD without SERVICE_ACTIVATING or SERVICE_ACTIVE
 | ||||||
|  | +                 * inbetween. This way we can later trigger actions that depend on the state
 | ||||||
|  | +                 * transition, including SuccessAction=. */
 | ||||||
|  | +                service_set_state(s, SERVICE_START);
 | ||||||
|  | +
 | ||||||
|  |                  service_enter_start_post(s); | ||||||
|  |                  return; | ||||||
|  |          } | ||||||
| @ -0,0 +1,84 @@ | |||||||
|  | From 12ce6830c63b4a27bb6d5b7729d70a86079b108f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 15:56:35 +0200 | ||||||
|  | Subject: [PATCH] man: move description of *Action= modes to | ||||||
|  |  FailureAction=/SuccessAction= | ||||||
|  | 
 | ||||||
|  | FailureAction=/SuccessAction= were added later then StartLimitAction=, so it | ||||||
|  | was easiest to refer to the existing description. But those two settings are | ||||||
|  | somewhat simpler (they just execute the action unconditionally) while | ||||||
|  | StartLimitAction= has additional timing and burst parameters, and they are | ||||||
|  | about to take on a more prominent role, so let's move the description of | ||||||
|  | allowed values. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 454dd6ce7adb744584ecae9aa0bd1acf3a00e9ed) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  man/systemd.unit.xml | 44 +++++++++++++++++++++++--------------------- | ||||||
|  |  1 file changed, 23 insertions(+), 21 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
 | ||||||
|  | index 7605c43375..802db453a4 100644
 | ||||||
|  | --- a/man/systemd.unit.xml
 | ||||||
|  | +++ b/man/systemd.unit.xml
 | ||||||
|  | @@ -873,6 +873,24 @@
 | ||||||
|  |          </listitem> | ||||||
|  |        </varlistentry> | ||||||
|  |   | ||||||
|  | +      <varlistentry>
 | ||||||
|  | +        <term><varname>FailureAction=</varname></term>
 | ||||||
|  | +        <term><varname>SuccessAction=</varname></term>
 | ||||||
|  | +
 | ||||||
|  | +        <listitem><para>Configure the action to take when the unit stops and enters a failed state or inactive
 | ||||||
|  | +        state. Takes one of <option>none</option>, <option>reboot</option>, <option>reboot-force</option>,
 | ||||||
|  | +        <option>reboot-immediate</option>, <option>poweroff</option>, <option>poweroff-force</option> or
 | ||||||
|  | +        <option>poweroff-immediate</option>. If <option>none</option> is set, no action will be triggered.
 | ||||||
|  | +        <option>reboot</option> causes a reboot following the normal shutdown procedure (i.e. equivalent to
 | ||||||
|  | +        <command>systemctl reboot</command>). <option>reboot-force</option> causes a forced reboot which will
 | ||||||
|  | +        terminate all processes forcibly but should cause no dirty file systems on reboot (i.e. equivalent to
 | ||||||
|  | +        <command>systemctl reboot -f</command>) and <option>reboot-immediate</option> causes immediate execution of the
 | ||||||
|  | +        <citerefentry><refentrytitle>reboot</refentrytitle><manvolnum>2</manvolnum></citerefentry> system call, which
 | ||||||
|  | +        might result in data loss. Similarly, <option>poweroff</option>, <option>poweroff-force</option>,
 | ||||||
|  | +        <option>poweroff-immediate</option> have the effect of powering down the system with similar semantics. Both
 | ||||||
|  | +        options default to <option>none</option>.</para></listitem>
 | ||||||
|  | +      </varlistentry>
 | ||||||
|  | +
 | ||||||
|  |        <varlistentry> | ||||||
|  |          <term><varname>JobTimeoutSec=</varname></term> | ||||||
|  |          <term><varname>JobRunningTimeoutSec=</varname></term> | ||||||
|  | @@ -929,29 +947,13 @@
 | ||||||
|  |        <varlistentry> | ||||||
|  |          <term><varname>StartLimitAction=</varname></term> | ||||||
|  |   | ||||||
|  | -        <listitem><para>Configure the action to take if the rate limit configured with
 | ||||||
|  | -        <varname>StartLimitIntervalSec=</varname> and <varname>StartLimitBurst=</varname> is hit. Takes one of
 | ||||||
|  | -        <option>none</option>, <option>reboot</option>, <option>reboot-force</option>,
 | ||||||
|  | -        <option>reboot-immediate</option>, <option>poweroff</option>, <option>poweroff-force</option> or
 | ||||||
|  | -        <option>poweroff-immediate</option>. If <option>none</option> is set, hitting the rate limit will trigger no
 | ||||||
|  | -        action besides that the start will not be permitted. <option>reboot</option> causes a reboot following the
 | ||||||
|  | -        normal shutdown procedure (i.e. equivalent to <command>systemctl reboot</command>).
 | ||||||
|  | -        <option>reboot-force</option> causes a forced reboot which will terminate all processes forcibly but should
 | ||||||
|  | -        cause no dirty file systems on reboot (i.e. equivalent to <command>systemctl reboot -f</command>) and
 | ||||||
|  | -        <option>reboot-immediate</option> causes immediate execution of the
 | ||||||
|  | -        <citerefentry><refentrytitle>reboot</refentrytitle><manvolnum>2</manvolnum></citerefentry> system call, which
 | ||||||
|  | -        might result in data loss. Similarly, <option>poweroff</option>, <option>poweroff-force</option>,
 | ||||||
|  | -        <option>poweroff-immediate</option> have the effect of powering down the system with similar
 | ||||||
|  | -        semantics. Defaults to <option>none</option>.</para></listitem>
 | ||||||
|  | +        <listitem><para>Configure an additional action to take if the rate limit configured with
 | ||||||
|  | +        <varname>StartLimitIntervalSec=</varname> and <varname>StartLimitBurst=</varname> is hit.  Takes the same
 | ||||||
|  | +        values as the setting <varname>FailureAction=</varname>/<varname>SuccessAction=</varname> settings and executes
 | ||||||
|  | +        the same actions. If <option>none</option> is set, hitting the rate limit will trigger no action besides that
 | ||||||
|  | +        the start will not be permitted. Defaults to <option>none</option>.</para></listitem>
 | ||||||
|  |        </varlistentry> | ||||||
|  |   | ||||||
|  | -      <varlistentry>
 | ||||||
|  | -        <term><varname>FailureAction=</varname></term>
 | ||||||
|  | -        <term><varname>SuccessAction=</varname></term>
 | ||||||
|  | -        <listitem><para>Configure the action to take when the unit stops and enters a failed state or inactive
 | ||||||
|  | -        state. Takes the same values as the setting <varname>StartLimitAction=</varname> setting and executes the same
 | ||||||
|  | -        actions. Both options default to <option>none</option>.</para></listitem>
 | ||||||
|  | -      </varlistentry>
 | ||||||
|  |   | ||||||
|  |        <varlistentry> | ||||||
|  |          <term><varname>RebootArgument=</varname></term> | ||||||
| @ -0,0 +1,361 @@ | |||||||
|  | From 19d91eef7f15b654cd96ad5350385e535fab9e2a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 13:28:39 +0200 | ||||||
|  | Subject: [PATCH] core: define "exit" and "exit-force" actions for user units | ||||||
|  |  and only accept that | ||||||
|  | 
 | ||||||
|  | We would accept e.g. FailureAction=reboot-force in user units and then do an | ||||||
|  | exit in the user manager. Let's be stricter, and define "exit"/"exit-force" as | ||||||
|  | the only supported actions in user units. | ||||||
|  | 
 | ||||||
|  | v2: | ||||||
|  | - rename 'exit' to 'exit-force' and add new 'exit'
 | ||||||
|  | - add test for the parsing function
 | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 54fcb6192c618726d11404b24b1a1e9ec3169ee1) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  TODO                             |  4 +++ | ||||||
|  |  man/systemd.unit.xml             | 26 +++++++++------- | ||||||
|  |  src/core/dbus-unit.c             | 37 ++++++++++++++++++++++- | ||||||
|  |  src/core/emergency-action.c      | 47 ++++++++++++++++++++++------- | ||||||
|  |  src/core/emergency-action.h      |  5 ++++ | ||||||
|  |  src/core/load-fragment.c         | 42 +++++++++++++++++++++++++- | ||||||
|  |  src/test/meson.build             |  5 ++++ | ||||||
|  |  src/test/test-emergency-action.c | 51 ++++++++++++++++++++++++++++++++ | ||||||
|  |  8 files changed, 195 insertions(+), 22 deletions(-) | ||||||
|  |  create mode 100644 src/test/test-emergency-action.c | ||||||
|  | 
 | ||||||
|  | diff --git a/TODO b/TODO
 | ||||||
|  | index 3100e067d6..0705b6b08e 100644
 | ||||||
|  | --- a/TODO
 | ||||||
|  | +++ b/TODO
 | ||||||
|  | @@ -4,6 +4,10 @@ Bugfixes:
 | ||||||
|  |   | ||||||
|  |  * copy.c: set the right chattrs before copying files and others after | ||||||
|  |   | ||||||
|  | +* Many manager configuration settings that are only applicable to user
 | ||||||
|  | +  manager or system manager can be always set. It would be better to reject
 | ||||||
|  | +  them when parsing config.
 | ||||||
|  | +
 | ||||||
|  |  External: | ||||||
|  |   | ||||||
|  |  * Fedora: add an rpmlint check that verifies that all unit files in the RPM are listed in %systemd_post macros. | ||||||
|  | diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
 | ||||||
|  | index 802db453a4..5772a6684e 100644
 | ||||||
|  | --- a/man/systemd.unit.xml
 | ||||||
|  | +++ b/man/systemd.unit.xml
 | ||||||
|  | @@ -877,18 +877,24 @@
 | ||||||
|  |          <term><varname>FailureAction=</varname></term> | ||||||
|  |          <term><varname>SuccessAction=</varname></term> | ||||||
|  |   | ||||||
|  | -        <listitem><para>Configure the action to take when the unit stops and enters a failed state or inactive
 | ||||||
|  | -        state. Takes one of <option>none</option>, <option>reboot</option>, <option>reboot-force</option>,
 | ||||||
|  | -        <option>reboot-immediate</option>, <option>poweroff</option>, <option>poweroff-force</option> or
 | ||||||
|  | -        <option>poweroff-immediate</option>. If <option>none</option> is set, no action will be triggered.
 | ||||||
|  | -        <option>reboot</option> causes a reboot following the normal shutdown procedure (i.e. equivalent to
 | ||||||
|  | -        <command>systemctl reboot</command>). <option>reboot-force</option> causes a forced reboot which will
 | ||||||
|  | -        terminate all processes forcibly but should cause no dirty file systems on reboot (i.e. equivalent to
 | ||||||
|  | -        <command>systemctl reboot -f</command>) and <option>reboot-immediate</option> causes immediate execution of the
 | ||||||
|  | +        <listitem><para>Configure the action to take when the unit stops and enters a failed state or inactive state.
 | ||||||
|  | +        Takes one of <option>none</option>, <option>reboot</option>, <option>reboot-force</option>,
 | ||||||
|  | +        <option>reboot-immediate</option>, <option>poweroff</option>, <option>poweroff-force</option>,
 | ||||||
|  | +        <option>poweroff-immediate</option>, <option>exit</option>, and <option>exit-force</option>. In system mode,
 | ||||||
|  | +        all options except <option>exit</option> and <option>exit-force</option> are allowed. In user mode, only
 | ||||||
|  | +        <option>none</option>, <option>exit</option>, and <option>exit-force</option> are allowed. Both options default
 | ||||||
|  | +        to <option>none</option>.</para>
 | ||||||
|  | +
 | ||||||
|  | +        <para>If <option>none</option> is set, no action will be triggered. <option>reboot</option> causes a reboot
 | ||||||
|  | +        following the normal shutdown procedure (i.e. equivalent to <command>systemctl reboot</command>).
 | ||||||
|  | +        <option>reboot-force</option> causes a forced reboot which will terminate all processes forcibly but should
 | ||||||
|  | +        cause no dirty file systems on reboot (i.e. equivalent to <command>systemctl reboot -f</command>) and
 | ||||||
|  | +        <option>reboot-immediate</option> causes immediate execution of the
 | ||||||
|  |          <citerefentry><refentrytitle>reboot</refentrytitle><manvolnum>2</manvolnum></citerefentry> system call, which | ||||||
|  |          might result in data loss. Similarly, <option>poweroff</option>, <option>poweroff-force</option>, | ||||||
|  | -        <option>poweroff-immediate</option> have the effect of powering down the system with similar semantics. Both
 | ||||||
|  | -        options default to <option>none</option>.</para></listitem>
 | ||||||
|  | +        <option>poweroff-immediate</option> have the effect of powering down the system with similar
 | ||||||
|  | +        semantics. <option>exit</option> causes the user manager to exit following the normal shutdown procedure, and
 | ||||||
|  | +        <option>exit-force</option> causes it terminate without shutting down services.</para></listitem>
 | ||||||
|  |        </varlistentry> | ||||||
|  |   | ||||||
|  |        <varlistentry> | ||||||
|  | diff --git a/src/core/dbus-unit.c b/src/core/dbus-unit.c
 | ||||||
|  | index 549a166abc..e7ea9db3ac 100644
 | ||||||
|  | --- a/src/core/dbus-unit.c
 | ||||||
|  | +++ b/src/core/dbus-unit.c
 | ||||||
|  | @@ -1564,8 +1564,43 @@ static int bus_unit_set_live_property(
 | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +static int bus_set_transient_emergency_action(
 | ||||||
|  | +                Unit *u,
 | ||||||
|  | +                const char *name,
 | ||||||
|  | +                EmergencyAction *p,
 | ||||||
|  | +                sd_bus_message *message,
 | ||||||
|  | +                UnitWriteFlags flags,
 | ||||||
|  | +                sd_bus_error *error) {
 | ||||||
|  | +
 | ||||||
|  | +        const char *s;
 | ||||||
|  | +        EmergencyAction v;
 | ||||||
|  | +        int r;
 | ||||||
|  | +        bool system;
 | ||||||
|  | +
 | ||||||
|  | +        assert(p);
 | ||||||
|  | +
 | ||||||
|  | +        r = sd_bus_message_read(message, "s", &s);
 | ||||||
|  | +        if (r < 0)
 | ||||||
|  | +                return r;
 | ||||||
|  | +
 | ||||||
|  | +        system = MANAGER_IS_SYSTEM(u->manager);
 | ||||||
|  | +        r = parse_emergency_action(s, system, &v);
 | ||||||
|  | +        if (v < 0)
 | ||||||
|  | +                return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS,
 | ||||||
|  | +                                         v == -EOPNOTSUPP ? "EmergencyAction setting invalid for manager type: %s"
 | ||||||
|  | +                                                          : "Invalid %s setting: %s",
 | ||||||
|  | +                                         name, s);
 | ||||||
|  | +
 | ||||||
|  | +        if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
 | ||||||
|  | +                *p = v;
 | ||||||
|  | +                unit_write_settingf(u, flags, name,
 | ||||||
|  | +                                    "%s=%s", name, s);
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  | +        return 1;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  static BUS_DEFINE_SET_TRANSIENT_PARSE(collect_mode, CollectMode, collect_mode_from_string); | ||||||
|  | -static BUS_DEFINE_SET_TRANSIENT_PARSE(emergency_action, EmergencyAction, emergency_action_from_string);
 | ||||||
|  |  static BUS_DEFINE_SET_TRANSIENT_PARSE(job_mode, JobMode, job_mode_from_string); | ||||||
|  |   | ||||||
|  |  static int bus_set_transient_conditions( | ||||||
|  | diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c
 | ||||||
|  | index 766a3b4d2b..00f5996317 100644
 | ||||||
|  | --- a/src/core/emergency-action.c
 | ||||||
|  | +++ b/src/core/emergency-action.c
 | ||||||
|  | @@ -39,15 +39,6 @@ int emergency_action(
 | ||||||
|  |                  return -ECANCELED; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | -        if (!MANAGER_IS_SYSTEM(m)) {
 | ||||||
|  | -                /* Downgrade all options to simply exiting if we run
 | ||||||
|  | -                 * in user mode */
 | ||||||
|  | -
 | ||||||
|  | -                log_warning("Exiting: %s", reason);
 | ||||||
|  | -                m->exit_code = MANAGER_EXIT;
 | ||||||
|  | -                return -ECANCELED;
 | ||||||
|  | -        }
 | ||||||
|  | -
 | ||||||
|  |          switch (action) { | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_REBOOT: | ||||||
|  | @@ -80,11 +71,26 @@ int emergency_action(
 | ||||||
|  |                  (void) reboot(RB_AUTOBOOT); | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  | +        case EMERGENCY_ACTION_EXIT:
 | ||||||
|  | +                assert(MANAGER_IS_USER(m));
 | ||||||
|  | +
 | ||||||
|  | +                log_and_status(m, "Exiting", reason);
 | ||||||
|  | +
 | ||||||
|  | +                (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_EXIT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL);
 | ||||||
|  | +                break;
 | ||||||
|  | +
 | ||||||
|  |          case EMERGENCY_ACTION_POWEROFF: | ||||||
|  |                  log_and_status(m, "Powering off", reason); | ||||||
|  |                  (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL); | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  | +        case EMERGENCY_ACTION_EXIT_FORCE:
 | ||||||
|  | +                assert(MANAGER_IS_USER(m));
 | ||||||
|  | +
 | ||||||
|  | +                log_and_status(m, "Exiting immediately", reason);
 | ||||||
|  | +                m->exit_code = MANAGER_EXIT;
 | ||||||
|  | +                break;
 | ||||||
|  | +
 | ||||||
|  |          case EMERGENCY_ACTION_POWEROFF_FORCE: | ||||||
|  |                  log_and_status(m, "Forcibly powering off", reason); | ||||||
|  |                  m->exit_code = MANAGER_POWEROFF; | ||||||
|  | @@ -113,6 +119,27 @@ static const char* const emergency_action_table[_EMERGENCY_ACTION_MAX] = {
 | ||||||
|  |          [EMERGENCY_ACTION_REBOOT_IMMEDIATE] = "reboot-immediate", | ||||||
|  |          [EMERGENCY_ACTION_POWEROFF] = "poweroff", | ||||||
|  |          [EMERGENCY_ACTION_POWEROFF_FORCE] = "poweroff-force", | ||||||
|  | -        [EMERGENCY_ACTION_POWEROFF_IMMEDIATE] = "poweroff-immediate"
 | ||||||
|  | +        [EMERGENCY_ACTION_POWEROFF_IMMEDIATE] = "poweroff-immediate",
 | ||||||
|  | +        [EMERGENCY_ACTION_EXIT] = "exit",
 | ||||||
|  | +        [EMERGENCY_ACTION_EXIT_FORCE] = "exit-force",
 | ||||||
|  |  }; | ||||||
|  |  DEFINE_STRING_TABLE_LOOKUP(emergency_action, EmergencyAction); | ||||||
|  | +
 | ||||||
|  | +int parse_emergency_action(
 | ||||||
|  | +                const char *value,
 | ||||||
|  | +                bool system,
 | ||||||
|  | +                EmergencyAction *ret) {
 | ||||||
|  | +
 | ||||||
|  | +        EmergencyAction x;
 | ||||||
|  | +
 | ||||||
|  | +        x = emergency_action_from_string(value);
 | ||||||
|  | +        if (x < 0)
 | ||||||
|  | +                return -EINVAL;
 | ||||||
|  | +
 | ||||||
|  | +        if ((system && x >= _EMERGENCY_ACTION_FIRST_USER_ACTION) ||
 | ||||||
|  | +            (!system && x != EMERGENCY_ACTION_NONE && x < _EMERGENCY_ACTION_FIRST_USER_ACTION))
 | ||||||
|  | +                return -EOPNOTSUPP;
 | ||||||
|  | +
 | ||||||
|  | +        *ret = x;
 | ||||||
|  | +        return 0;
 | ||||||
|  | +}
 | ||||||
|  | diff --git a/src/core/emergency-action.h b/src/core/emergency-action.h
 | ||||||
|  | index 61791f176f..646ccc4e6b 100644
 | ||||||
|  | --- a/src/core/emergency-action.h
 | ||||||
|  | +++ b/src/core/emergency-action.h
 | ||||||
|  | @@ -13,6 +13,9 @@ typedef enum EmergencyAction {
 | ||||||
|  |          EMERGENCY_ACTION_POWEROFF, | ||||||
|  |          EMERGENCY_ACTION_POWEROFF_FORCE, | ||||||
|  |          EMERGENCY_ACTION_POWEROFF_IMMEDIATE, | ||||||
|  | +        EMERGENCY_ACTION_EXIT,
 | ||||||
|  | +        _EMERGENCY_ACTION_FIRST_USER_ACTION = EMERGENCY_ACTION_EXIT,
 | ||||||
|  | +        EMERGENCY_ACTION_EXIT_FORCE,
 | ||||||
|  |          _EMERGENCY_ACTION_MAX, | ||||||
|  |          _EMERGENCY_ACTION_INVALID = -1 | ||||||
|  |  } EmergencyAction; | ||||||
|  | @@ -24,3 +27,5 @@ int emergency_action(Manager *m, EmergencyAction action, const char *reboot_arg,
 | ||||||
|  |   | ||||||
|  |  const char* emergency_action_to_string(EmergencyAction i) _const_; | ||||||
|  |  EmergencyAction emergency_action_from_string(const char *s) _pure_; | ||||||
|  | +
 | ||||||
|  | +int parse_emergency_action(const char *value, bool system, EmergencyAction *ret);
 | ||||||
|  | diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
 | ||||||
|  | index e0d7b8f7f8..c102ffb9f0 100644
 | ||||||
|  | --- a/src/core/load-fragment.c
 | ||||||
|  | +++ b/src/core/load-fragment.c
 | ||||||
|  | @@ -77,7 +77,6 @@ DEFINE_CONFIG_PARSE(config_parse_socket_protocol, supported_socket_protocol_from
 | ||||||
|  |  DEFINE_CONFIG_PARSE(config_parse_exec_secure_bits, secure_bits_from_string, "Failed to parse secure bits"); | ||||||
|  |  DEFINE_CONFIG_PARSE_ENUM(config_parse_collect_mode, collect_mode, CollectMode, "Failed to parse garbage collection mode"); | ||||||
|  |  DEFINE_CONFIG_PARSE_ENUM(config_parse_device_policy, cgroup_device_policy, CGroupDevicePolicy, "Failed to parse device policy"); | ||||||
|  | -DEFINE_CONFIG_PARSE_ENUM(config_parse_emergency_action, emergency_action, EmergencyAction, "Failed to parse failure action specifier");
 | ||||||
|  |  DEFINE_CONFIG_PARSE_ENUM(config_parse_exec_keyring_mode, exec_keyring_mode, ExecKeyringMode, "Failed to parse keyring mode"); | ||||||
|  |  DEFINE_CONFIG_PARSE_ENUM(config_parse_exec_utmp_mode, exec_utmp_mode, ExecUtmpMode, "Failed to parse utmp mode"); | ||||||
|  |  DEFINE_CONFIG_PARSE_ENUM(config_parse_job_mode, job_mode, JobMode, "Failed to parse job mode"); | ||||||
|  | @@ -4253,6 +4252,47 @@ int config_parse_job_running_timeout_sec(
 | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +int config_parse_emergency_action(
 | ||||||
|  | +                const char* unit,
 | ||||||
|  | +                const char *filename,
 | ||||||
|  | +                unsigned line,
 | ||||||
|  | +                const char *section,
 | ||||||
|  | +                unsigned section_line,
 | ||||||
|  | +                const char *lvalue,
 | ||||||
|  | +                int ltype,
 | ||||||
|  | +                const char *rvalue,
 | ||||||
|  | +                void *data,
 | ||||||
|  | +                void *userdata) {
 | ||||||
|  | +
 | ||||||
|  | +        Manager *m = NULL;
 | ||||||
|  | +        EmergencyAction *x = data;
 | ||||||
|  | +        int r;
 | ||||||
|  | +
 | ||||||
|  | +        assert(filename);
 | ||||||
|  | +        assert(lvalue);
 | ||||||
|  | +        assert(rvalue);
 | ||||||
|  | +        assert(data);
 | ||||||
|  | +
 | ||||||
|  | +        if (unit)
 | ||||||
|  | +                m = ((Unit*) userdata)->manager;
 | ||||||
|  | +        else
 | ||||||
|  | +                m = data;
 | ||||||
|  | +
 | ||||||
|  | +        r = parse_emergency_action(rvalue, MANAGER_IS_SYSTEM(m), x);
 | ||||||
|  | +        if (r < 0) {
 | ||||||
|  | +                if (r == -EOPNOTSUPP)
 | ||||||
|  | +                        log_syntax(unit, LOG_ERR, filename, line, r,
 | ||||||
|  | +                                   "%s= specified as %s mode action, ignoring: %s",
 | ||||||
|  | +                                   lvalue, MANAGER_IS_SYSTEM(m) ? "user" : "system", rvalue);
 | ||||||
|  | +                else
 | ||||||
|  | +                        log_syntax(unit, LOG_ERR, filename, line, r,
 | ||||||
|  | +                                   "Failed to parse %s=, ignoring: %s", lvalue, rvalue);
 | ||||||
|  | +                return 0;
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  | +        return 0;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  #define FOLLOW_MAX 8 | ||||||
|  |   | ||||||
|  |  static int open_follow(char **filename, FILE **_f, Set *names, char **_final) { | ||||||
|  | diff --git a/src/test/meson.build b/src/test/meson.build
 | ||||||
|  | index 7b310d4ec7..40cf56d73d 100644
 | ||||||
|  | --- a/src/test/meson.build
 | ||||||
|  | +++ b/src/test/meson.build
 | ||||||
|  | @@ -65,6 +65,11 @@ tests += [
 | ||||||
|  |            libshared], | ||||||
|  |           []], | ||||||
|  |   | ||||||
|  | +        [['src/test/test-emergency-action.c'],
 | ||||||
|  | +         [libcore,
 | ||||||
|  | +          libshared],
 | ||||||
|  | +         []],
 | ||||||
|  | +
 | ||||||
|  |          [['src/test/test-job-type.c'], | ||||||
|  |           [libcore, | ||||||
|  |            libshared], | ||||||
|  | diff --git a/src/test/test-emergency-action.c b/src/test/test-emergency-action.c
 | ||||||
|  | new file mode 100644 | ||||||
|  | index 0000000000..493b23227e
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/src/test/test-emergency-action.c
 | ||||||
|  | @@ -0,0 +1,51 @@
 | ||||||
|  | +/* SPDX-License-Identifier: LGPL-2.1+ */
 | ||||||
|  | +
 | ||||||
|  | +#include "emergency-action.h"
 | ||||||
|  | +#include "tests.h"
 | ||||||
|  | +
 | ||||||
|  | +static void test_parse_emergency_action(void) {
 | ||||||
|  | +        EmergencyAction x;
 | ||||||
|  | +
 | ||||||
|  | +        log_info("/* %s */", __func__);
 | ||||||
|  | +
 | ||||||
|  | +        assert_se(parse_emergency_action("none", false, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_NONE);
 | ||||||
|  | +        assert_se(parse_emergency_action("reboot", false, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("reboot-force", false, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("reboot-immediate", false, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("poweroff", false, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("poweroff-force", false, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("poweroff-immediate", false, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_NONE);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit", false, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_EXIT);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit-force", false, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_EXIT_FORCE);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit-forcee", false, &x) == -EINVAL);
 | ||||||
|  | +
 | ||||||
|  | +        assert_se(parse_emergency_action("none", true, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_NONE);
 | ||||||
|  | +        assert_se(parse_emergency_action("reboot", true, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_REBOOT);
 | ||||||
|  | +        assert_se(parse_emergency_action("reboot-force", true, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_REBOOT_FORCE);
 | ||||||
|  | +        assert_se(parse_emergency_action("reboot-immediate", true, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_REBOOT_IMMEDIATE);
 | ||||||
|  | +        assert_se(parse_emergency_action("poweroff", true, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_POWEROFF);
 | ||||||
|  | +        assert_se(parse_emergency_action("poweroff-force", true, &x) == 0);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_POWEROFF_FORCE);
 | ||||||
|  | +        assert_se(parse_emergency_action("poweroff-immediate", true, &x) == 0);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit", true, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit-force", true, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit-forcee", true, &x) == -EINVAL);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_POWEROFF_IMMEDIATE);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +int main(int argc, char **argv) {
 | ||||||
|  | +        test_setup_logging(LOG_INFO);
 | ||||||
|  | +
 | ||||||
|  | +        test_parse_emergency_action();
 | ||||||
|  | +
 | ||||||
|  | +        return EXIT_SUCCESS;
 | ||||||
|  | +}
 | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | From 9dbb6564826a0def39a77ad292aecde75537d164 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 14:49:36 +0200 | ||||||
|  | Subject: [PATCH] core: accept system mode emergency action specifiers with a | ||||||
|  |  warning | ||||||
|  | 
 | ||||||
|  | Before we would only accept those "system" values, so there wasn't other | ||||||
|  | chocie. Let's provide backwards compatiblity in case somebody made use of | ||||||
|  | this functionality in user mode. | ||||||
|  | 
 | ||||||
|  | v2: use 'exit-force' not 'exit' | ||||||
|  | v3: use error value in log_syntax | ||||||
|  | (cherry picked from commit 469f76f170db39c72578e869ec7c087bb43f9350) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  src/core/load-fragment.c | 10 ++++++++++ | ||||||
|  |  1 file changed, 10 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/load-fragment.c b/src/core/load-fragment.c
 | ||||||
|  | index c102ffb9f0..c0b1fd4f91 100644
 | ||||||
|  | --- a/src/core/load-fragment.c
 | ||||||
|  | +++ b/src/core/load-fragment.c
 | ||||||
|  | @@ -4280,6 +4280,16 @@ int config_parse_emergency_action(
 | ||||||
|  |   | ||||||
|  |          r = parse_emergency_action(rvalue, MANAGER_IS_SYSTEM(m), x); | ||||||
|  |          if (r < 0) { | ||||||
|  | +                if (r == -EOPNOTSUPP && MANAGER_IS_USER(m)) {
 | ||||||
|  | +                        /* Compat mode: remove for systemd 241. */
 | ||||||
|  | +
 | ||||||
|  | +                        log_syntax(unit, LOG_INFO, filename, line, r,
 | ||||||
|  | +                                   "%s= in user mode specified as \"%s\", using \"exit-force\" instead.",
 | ||||||
|  | +                                   lvalue, rvalue);
 | ||||||
|  | +                        *x = EMERGENCY_ACTION_EXIT_FORCE;
 | ||||||
|  | +                        return 0;
 | ||||||
|  | +                }
 | ||||||
|  | +
 | ||||||
|  |                  if (r == -EOPNOTSUPP) | ||||||
|  |                          log_syntax(unit, LOG_ERR, filename, line, r, | ||||||
|  |                                     "%s= specified as %s mode action, ignoring: %s", | ||||||
| @ -0,0 +1,43 @@ | |||||||
|  | From f97c6d921fb6b3d7ba88e064b03d3dd767df9ba1 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 15:07:42 +0200 | ||||||
|  | Subject: [PATCH] core: allow services with no commands but SuccessAction set | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 3f00d379fa6221a4570c8cd955afd9b661787db9) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  src/core/service.c | 13 +++++++++---- | ||||||
|  |  1 file changed, 9 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/service.c b/src/core/service.c
 | ||||||
|  | index 4da1c5accb..7969bbf071 100644
 | ||||||
|  | --- a/src/core/service.c
 | ||||||
|  | +++ b/src/core/service.c
 | ||||||
|  | @@ -556,8 +556,13 @@ static int service_verify(Service *s) {
 | ||||||
|  |                  } | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | -        if (!s->exec_command[SERVICE_EXEC_START] && !s->exec_command[SERVICE_EXEC_STOP]) {
 | ||||||
|  | -                log_unit_error(UNIT(s), "Service lacks both ExecStart= and ExecStop= setting. Refusing.");
 | ||||||
|  | +        if (!s->exec_command[SERVICE_EXEC_START] && !s->exec_command[SERVICE_EXEC_STOP]
 | ||||||
|  | +            && UNIT(s)->success_action == EMERGENCY_ACTION_NONE) {
 | ||||||
|  | +                /* FailureAction= only makes sense if one of the start or stop commands is specified.
 | ||||||
|  | +                 * SuccessAction= will be executed unconditionally if no commands are specified. Hence,
 | ||||||
|  | +                 * either a command or SuccessAction= are required. */
 | ||||||
|  | +
 | ||||||
|  | +                log_unit_error(UNIT(s), "Service has no ExecStart=, ExecStop=, or SuccessAction=. Refusing.");
 | ||||||
|  |                  return -ENOEXEC; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | @@ -566,8 +571,8 @@ static int service_verify(Service *s) {
 | ||||||
|  |                  return -ENOEXEC; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | -        if (!s->remain_after_exit && !s->exec_command[SERVICE_EXEC_START]) {
 | ||||||
|  | -                log_unit_error(UNIT(s), "Service has no ExecStart= setting, which is only allowed for RemainAfterExit=yes services. Refusing.");
 | ||||||
|  | +        if (!s->remain_after_exit && !s->exec_command[SERVICE_EXEC_START] && UNIT(s)->success_action == EMERGENCY_ACTION_NONE) {
 | ||||||
|  | +                log_unit_error(UNIT(s), "Service has no ExecStart= and no SuccessAction= settings and does not have RemainAfterExit=yes set. Refusing.");
 | ||||||
|  |                  return -ENOEXEC; | ||||||
|  |          } | ||||||
|  |   | ||||||
| @ -0,0 +1,120 @@ | |||||||
|  | From b8358d4edf1896a821c9370c9ba31c2bb07c277a Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 15:24:44 +0200 | ||||||
|  | Subject: [PATCH] core: limit service-watchdogs=no to actual "watchdog" | ||||||
|  |  commands | ||||||
|  | 
 | ||||||
|  | The setting is now only looked at when considering an action for a job timeout | ||||||
|  | or unit start limit. It is ignored for ctrl-alt-del, SuccessAction, SuccessFailure. | ||||||
|  | 
 | ||||||
|  | v2: turn the parameter into a flag field | ||||||
|  | v3: rename Options to Flags | ||||||
|  | (cherry picked from commit 1710d4beff6329cf6ae0767953cad09593517b2a) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  src/core/emergency-action.c | 3 ++- | ||||||
|  |  src/core/emergency-action.h | 8 +++++++- | ||||||
|  |  src/core/job.c              | 3 ++- | ||||||
|  |  src/core/manager.c          | 2 +- | ||||||
|  |  src/core/unit.c             | 9 ++++++--- | ||||||
|  |  5 files changed, 18 insertions(+), 7 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c
 | ||||||
|  | index 00f5996317..e9e757dfa3 100644
 | ||||||
|  | --- a/src/core/emergency-action.c
 | ||||||
|  | +++ b/src/core/emergency-action.c
 | ||||||
|  | @@ -24,6 +24,7 @@ static void log_and_status(Manager *m, const char *message, const char *reason)
 | ||||||
|  |  int emergency_action( | ||||||
|  |                  Manager *m, | ||||||
|  |                  EmergencyAction action, | ||||||
|  | +                EmergencyActionFlags options,
 | ||||||
|  |                  const char *reboot_arg, | ||||||
|  |                  const char *reason) { | ||||||
|  |   | ||||||
|  | @@ -34,7 +35,7 @@ int emergency_action(
 | ||||||
|  |          if (action == EMERGENCY_ACTION_NONE) | ||||||
|  |                  return -ECANCELED; | ||||||
|  |   | ||||||
|  | -        if (!m->service_watchdogs) {
 | ||||||
|  | +        if (FLAGS_SET(options, EMERGENCY_ACTION_IS_WATCHDOG) && !m->service_watchdogs) {
 | ||||||
|  |                  log_warning("Watchdog disabled! Not acting on: %s", reason); | ||||||
|  |                  return -ECANCELED; | ||||||
|  |          } | ||||||
|  | diff --git a/src/core/emergency-action.h b/src/core/emergency-action.h
 | ||||||
|  | index 646ccc4e6b..efbfaf6c6a 100644
 | ||||||
|  | --- a/src/core/emergency-action.h
 | ||||||
|  | +++ b/src/core/emergency-action.h
 | ||||||
|  | @@ -20,10 +20,16 @@ typedef enum EmergencyAction {
 | ||||||
|  |          _EMERGENCY_ACTION_INVALID = -1 | ||||||
|  |  } EmergencyAction; | ||||||
|  |   | ||||||
|  | +typedef enum EmergencyActionFlags {
 | ||||||
|  | +        EMERGENCY_ACTION_IS_WATCHDOG = 1 << 0,
 | ||||||
|  | +} EmergencyActionFlags;
 | ||||||
|  | +
 | ||||||
|  |  #include "macro.h" | ||||||
|  |  #include "manager.h" | ||||||
|  |   | ||||||
|  | -int emergency_action(Manager *m, EmergencyAction action, const char *reboot_arg, const char *reason);
 | ||||||
|  | +int emergency_action(Manager *m,
 | ||||||
|  | +                     EmergencyAction action, EmergencyActionFlags options,
 | ||||||
|  | +                     const char *reboot_arg, const char *reason);
 | ||||||
|  |   | ||||||
|  |  const char* emergency_action_to_string(EmergencyAction i) _const_; | ||||||
|  |  EmergencyAction emergency_action_from_string(const char *s) _pure_; | ||||||
|  | diff --git a/src/core/job.c b/src/core/job.c
 | ||||||
|  | index 870ec0a387..d647aac42d 100644
 | ||||||
|  | --- a/src/core/job.c
 | ||||||
|  | +++ b/src/core/job.c
 | ||||||
|  | @@ -1076,7 +1076,8 @@ static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *user
 | ||||||
|  |          u = j->unit; | ||||||
|  |          job_finish_and_invalidate(j, JOB_TIMEOUT, true, false); | ||||||
|  |   | ||||||
|  | -        emergency_action(u->manager, u->job_timeout_action, u->job_timeout_reboot_arg, "job timed out");
 | ||||||
|  | +        emergency_action(u->manager, u->job_timeout_action, EMERGENCY_ACTION_IS_WATCHDOG,
 | ||||||
|  | +                         u->job_timeout_reboot_arg, "job timed out");
 | ||||||
|  |   | ||||||
|  |          return 0; | ||||||
|  |  } | ||||||
|  | diff --git a/src/core/manager.c b/src/core/manager.c
 | ||||||
|  | index 3c44ad3dbc..ac1b198b21 100644
 | ||||||
|  | --- a/src/core/manager.c
 | ||||||
|  | +++ b/src/core/manager.c
 | ||||||
|  | @@ -2528,7 +2528,7 @@ static void manager_handle_ctrl_alt_del(Manager *m) {
 | ||||||
|  |          if (ratelimit_below(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == EMERGENCY_ACTION_NONE) | ||||||
|  |                  manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY); | ||||||
|  |          else | ||||||
|  | -                emergency_action(m, m->cad_burst_action, NULL,
 | ||||||
|  | +                emergency_action(m, m->cad_burst_action, 0, NULL, 
 | ||||||
|  |                                  "Ctrl-Alt-Del was pressed more than 7 times within 2s"); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | diff --git a/src/core/unit.c b/src/core/unit.c
 | ||||||
|  | index 152a860d08..dc5c89c195 100644
 | ||||||
|  | --- a/src/core/unit.c
 | ||||||
|  | +++ b/src/core/unit.c
 | ||||||
|  | @@ -1669,7 +1669,8 @@ int unit_start_limit_test(Unit *u) {
 | ||||||
|  |          log_unit_warning(u, "Start request repeated too quickly."); | ||||||
|  |          u->start_limit_hit = true; | ||||||
|  |   | ||||||
|  | -        return emergency_action(u->manager, u->start_limit_action, u->reboot_arg, "unit failed");
 | ||||||
|  | +        return emergency_action(u->manager, u->start_limit_action, EMERGENCY_ACTION_IS_WATCHDOG,
 | ||||||
|  | +                                u->reboot_arg, "unit failed");
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  bool unit_shall_confirm_spawn(Unit *u) { | ||||||
|  | @@ -2469,9 +2470,11 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlag
 | ||||||
|  |                  unit_check_binds_to(u); | ||||||
|  |   | ||||||
|  |                  if (os != UNIT_FAILED && ns == UNIT_FAILED) | ||||||
|  | -                        (void) emergency_action(u->manager, u->failure_action, u->reboot_arg, "unit failed");
 | ||||||
|  | +                        (void) emergency_action(u->manager, u->failure_action, 0,
 | ||||||
|  | +                                                u->reboot_arg, "unit failed");
 | ||||||
|  |                  else if (!UNIT_IS_INACTIVE_OR_FAILED(os) && ns == UNIT_INACTIVE) | ||||||
|  | -                        (void) emergency_action(u->manager, u->success_action, u->reboot_arg, "unit succeeded");
 | ||||||
|  | +                        (void) emergency_action(u->manager, u->success_action, 0,
 | ||||||
|  | +                                                u->reboot_arg, "unit succeeded");
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          unit_add_to_dbus_queue(u); | ||||||
| @ -0,0 +1,56 @@ | |||||||
|  | From b0394ad25fd601b9ef29d26b87f12b0a0c17cda0 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 15:09:11 +0200 | ||||||
|  | Subject: [PATCH] units: use SuccessAction=exit-force in systemd-exit.service | ||||||
|  | 
 | ||||||
|  | Fixes #10414. | ||||||
|  | 
 | ||||||
|  | v2: | ||||||
|  | - rename .service.in to .service
 | ||||||
|  | - rename 'exit' to 'exit-force'
 | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 631c9b7bf2dab5065d753a7b1cfaff5b100b3c90) | ||||||
|  | 
 | ||||||
|  | Resolves: #1860899 | ||||||
|  | ---
 | ||||||
|  |  units/user/meson.build                                       | 2 +- | ||||||
|  |  units/user/{systemd-exit.service.in => systemd-exit.service} | 5 +---- | ||||||
|  |  2 files changed, 2 insertions(+), 5 deletions(-) | ||||||
|  |  rename units/user/{systemd-exit.service.in => systemd-exit.service} (87%) | ||||||
|  | 
 | ||||||
|  | diff --git a/units/user/meson.build b/units/user/meson.build
 | ||||||
|  | index b1c2e95597..36341a42f5 100644
 | ||||||
|  | --- a/units/user/meson.build
 | ||||||
|  | +++ b/units/user/meson.build
 | ||||||
|  | @@ -14,6 +14,7 @@ units = [
 | ||||||
|  |          'sockets.target', | ||||||
|  |          'sound.target', | ||||||
|  |          'timers.target', | ||||||
|  | +        'systemd-exit.service',
 | ||||||
|  |          'systemd-tmpfiles-clean.timer', | ||||||
|  |  ] | ||||||
|  |   | ||||||
|  | @@ -23,7 +24,6 @@ foreach file : units
 | ||||||
|  |  endforeach | ||||||
|  |   | ||||||
|  |  in_units = [ | ||||||
|  | -        'systemd-exit.service',
 | ||||||
|  |          'systemd-tmpfiles-clean.service', | ||||||
|  |          'systemd-tmpfiles-setup.service', | ||||||
|  |  ] | ||||||
|  | diff --git a/units/user/systemd-exit.service.in b/units/user/systemd-exit.service
 | ||||||
|  | similarity index 87% | ||||||
|  | rename from units/user/systemd-exit.service.in | ||||||
|  | rename to units/user/systemd-exit.service | ||||||
|  | index d69273f6b3..1d3b61e3ab 100644
 | ||||||
|  | --- a/units/user/systemd-exit.service.in
 | ||||||
|  | +++ b/units/user/systemd-exit.service
 | ||||||
|  | @@ -13,7 +13,4 @@ Documentation=man:systemd.special(7)
 | ||||||
|  |  DefaultDependencies=no | ||||||
|  |  Requires=shutdown.target | ||||||
|  |  After=shutdown.target | ||||||
|  | -
 | ||||||
|  | -[Service]
 | ||||||
|  | -Type=oneshot
 | ||||||
|  | -ExecStart=@SYSTEMCTL@ --user --force exit
 | ||||||
|  | +SuccessAction=exit-force
 | ||||||
| @ -0,0 +1,51 @@ | |||||||
|  | From f531c34dd8ead33b9972bcd06017ac80ccedb757 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 15:30:53 +0200 | ||||||
|  | Subject: [PATCH] units: use SuccessAction=reboot-force in | ||||||
|  |  systemd-reboot.service | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit d85515edcf9700dc068201ab9f7103f04f3b25b2) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  units/meson.build                                           | 2 +- | ||||||
|  |  units/{systemd-reboot.service.in => systemd-reboot.service} | 5 +---- | ||||||
|  |  2 files changed, 2 insertions(+), 5 deletions(-) | ||||||
|  |  rename units/{systemd-reboot.service.in => systemd-reboot.service} (89%) | ||||||
|  | 
 | ||||||
|  | diff --git a/units/meson.build b/units/meson.build
 | ||||||
|  | index a1cd2524dc..b482431a10 100644
 | ||||||
|  | --- a/units/meson.build
 | ||||||
|  | +++ b/units/meson.build
 | ||||||
|  | @@ -97,6 +97,7 @@ units = [
 | ||||||
|  |           'sockets.target.wants/'], | ||||||
|  |          ['systemd-networkd.socket',             'ENABLE_NETWORKD', | ||||||
|  |           join_paths(pkgsysconfdir, 'system/sockets.target.wants/')], | ||||||
|  | +        ['systemd-reboot.service',               ''],
 | ||||||
|  |          ['systemd-rfkill.socket',               'ENABLE_RFKILL'], | ||||||
|  |          ['systemd-tmpfiles-clean.timer',        '', | ||||||
|  |           'timers.target.wants/'], | ||||||
|  | @@ -182,7 +183,6 @@ in_units = [
 | ||||||
|  |          ['systemd-quotacheck.service',           'ENABLE_QUOTACHECK'], | ||||||
|  |          ['systemd-random-seed.service',          'ENABLE_RANDOMSEED', | ||||||
|  |           'sysinit.target.wants/'], | ||||||
|  | -        ['systemd-reboot.service',               ''],
 | ||||||
|  |          ['systemd-remount-fs.service',           '', | ||||||
|  |           'local-fs.target.wants/'], | ||||||
|  |          ['systemd-resolved.service',             'ENABLE_RESOLVE', | ||||||
|  | diff --git a/units/systemd-reboot.service.in b/units/systemd-reboot.service
 | ||||||
|  | similarity index 89% | ||||||
|  | rename from units/systemd-reboot.service.in | ||||||
|  | rename to units/systemd-reboot.service | ||||||
|  | index 4763ccfdca..505f60aabf 100644
 | ||||||
|  | --- a/units/systemd-reboot.service.in
 | ||||||
|  | +++ b/units/systemd-reboot.service
 | ||||||
|  | @@ -13,7 +13,4 @@ Documentation=man:systemd-halt.service(8)
 | ||||||
|  |  DefaultDependencies=no | ||||||
|  |  Requires=shutdown.target umount.target final.target | ||||||
|  |  After=shutdown.target umount.target final.target | ||||||
|  | -
 | ||||||
|  | -[Service]
 | ||||||
|  | -Type=oneshot
 | ||||||
|  | -ExecStart=@SYSTEMCTL@ --force reboot
 | ||||||
|  | +SuccessAction=reboot-force
 | ||||||
| @ -1,38 +0,0 @@ | |||||||
| From c132731b260174f5939099ceb4fccde84710c502 Mon Sep 17 00:00:00 2001 |  | ||||||
| From: Lennart Poettering <lennart@poettering.net> |  | ||||||
| Date: Mon, 3 Dec 2018 17:30:19 +0100 |  | ||||||
| Subject: [PATCH] macro: define HAS_FEATURE_ADDRESS_SANITIZER also on gcc |  | ||||||
| 
 |  | ||||||
| Let's make differences between compilers more minimal. |  | ||||||
| 
 |  | ||||||
| Related: #2039327 |  | ||||||
| 
 |  | ||||||
| (cherry picked from commit 01da36fadd365329cfd9e2c97eb419c63404b25f) |  | ||||||
| ---
 |  | ||||||
|  src/basic/macro.h | 13 +++++++++++++ |  | ||||||
|  1 file changed, 13 insertions(+) |  | ||||||
| 
 |  | ||||||
| diff --git a/src/basic/macro.h b/src/basic/macro.h
 |  | ||||||
| index 0fe6a62aa8..e87026882f 100644
 |  | ||||||
| --- a/src/basic/macro.h
 |  | ||||||
| +++ b/src/basic/macro.h
 |  | ||||||
| @@ -55,6 +55,19 @@
 |  | ||||||
|  #  endif |  | ||||||
|  #endif |  | ||||||
|   |  | ||||||
| +#if !defined(HAS_FEATURE_ADDRESS_SANITIZER)
 |  | ||||||
| +#  ifdef __SANITIZE_ADDRESS__
 |  | ||||||
| +#      define HAS_FEATURE_ADDRESS_SANITIZER 1
 |  | ||||||
| +#  elif defined(__has_feature)
 |  | ||||||
| +#    if __has_feature(address_sanitizer)
 |  | ||||||
| +#      define HAS_FEATURE_ADDRESS_SANITIZER 1
 |  | ||||||
| +#    endif
 |  | ||||||
| +#  endif
 |  | ||||||
| +#  if !defined(HAS_FEATURE_ADDRESS_SANITIZER)
 |  | ||||||
| +#    define HAS_FEATURE_ADDRESS_SANITIZER 0
 |  | ||||||
| +#  endif
 |  | ||||||
| +#endif
 |  | ||||||
| +
 |  | ||||||
|  /* Temporarily disable some warnings */ |  | ||||||
|  #define DISABLE_WARNING_DECLARATION_AFTER_STATEMENT                     \ |  | ||||||
|          _Pragma("GCC diagnostic push");                                 \ |  | ||||||
| @ -0,0 +1,56 @@ | |||||||
|  | From 7e84234d9953f7ffacf7fff82679c9c9c3b78b7e Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 15:34:57 +0200 | ||||||
|  | Subject: [PATCH] units: use SuccessAction=poweroff-force in | ||||||
|  |  systemd-poweroff.service | ||||||
|  | 
 | ||||||
|  | Explicit systemctl calls remain in systemd-halt.service and the system | ||||||
|  | systemd-exit.service. To convert systemd-halt, we'd need to add | ||||||
|  | SuccessAction=halt-force. Halting doesn't make much sense, so let's just | ||||||
|  | leave that is. systemd-exit.service will be converted in the next commit. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit afa6206583dfbc93e29981cb5d713841e4ca2865) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  units/meson.build                                            | 2 +- | ||||||
|  |  ...{systemd-poweroff.service.in => systemd-poweroff.service} | 5 +---- | ||||||
|  |  2 files changed, 2 insertions(+), 5 deletions(-) | ||||||
|  |  rename units/{systemd-poweroff.service.in => systemd-poweroff.service} (89%) | ||||||
|  | 
 | ||||||
|  | diff --git a/units/meson.build b/units/meson.build
 | ||||||
|  | index b482431a10..6fa804148b 100644
 | ||||||
|  | --- a/units/meson.build
 | ||||||
|  | +++ b/units/meson.build
 | ||||||
|  | @@ -97,6 +97,7 @@ units = [
 | ||||||
|  |           'sockets.target.wants/'], | ||||||
|  |          ['systemd-networkd.socket',             'ENABLE_NETWORKD', | ||||||
|  |           join_paths(pkgsysconfdir, 'system/sockets.target.wants/')], | ||||||
|  | +        ['systemd-poweroff.service',             ''],
 | ||||||
|  |          ['systemd-reboot.service',               ''], | ||||||
|  |          ['systemd-rfkill.socket',               'ENABLE_RFKILL'], | ||||||
|  |          ['systemd-tmpfiles-clean.timer',        '', | ||||||
|  | @@ -179,7 +180,6 @@ in_units = [
 | ||||||
|  |          ['systemd-nspawn@.service',              ''], | ||||||
|  |          ['systemd-portabled.service',            'ENABLE_PORTABLED', | ||||||
|  |           'dbus-org.freedesktop.portable1.service'], | ||||||
|  | -        ['systemd-poweroff.service',             ''],
 | ||||||
|  |          ['systemd-quotacheck.service',           'ENABLE_QUOTACHECK'], | ||||||
|  |          ['systemd-random-seed.service',          'ENABLE_RANDOMSEED', | ||||||
|  |           'sysinit.target.wants/'], | ||||||
|  | diff --git a/units/systemd-poweroff.service.in b/units/systemd-poweroff.service
 | ||||||
|  | similarity index 89% | ||||||
|  | rename from units/systemd-poweroff.service.in | ||||||
|  | rename to units/systemd-poweroff.service | ||||||
|  | index e9fd655508..8d1d54389b 100644
 | ||||||
|  | --- a/units/systemd-poweroff.service.in
 | ||||||
|  | +++ b/units/systemd-poweroff.service
 | ||||||
|  | @@ -13,7 +13,4 @@ Documentation=man:systemd-halt.service(8)
 | ||||||
|  |  DefaultDependencies=no | ||||||
|  |  Requires=shutdown.target umount.target final.target | ||||||
|  |  After=shutdown.target umount.target final.target | ||||||
|  | -
 | ||||||
|  | -[Service]
 | ||||||
|  | -Type=oneshot
 | ||||||
|  | -ExecStart=@SYSTEMCTL@ --force poweroff
 | ||||||
|  | +SuccessAction=poweroff-force
 | ||||||
| @ -0,0 +1,164 @@ | |||||||
|  | From c0aa64901aa4d5d7c917fccf0993819fb1a1262f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Tue, 16 Oct 2018 16:34:45 +0200 | ||||||
|  | Subject: [PATCH] units: allow and use SuccessAction=exit-force in system | ||||||
|  |  systemd-exit.service | ||||||
|  | 
 | ||||||
|  | C.f. 287419c119ef961db487a281162ab037eba70c61: 'systemctl exit 42' can be | ||||||
|  | used to set an exit value and pulls in exit.target, which pulls in systemd-exit.service, | ||||||
|  | which calls org.fdo.Manager.Exit, which calls method_exit(), which sets the objective | ||||||
|  | to MANAGER_EXIT. Allow the same to happen through SuccessAction=exit. | ||||||
|  | 
 | ||||||
|  | v2: update for 'exit' and 'exit-force' | ||||||
|  | (cherry picked from commit a400bd8c2a6285576edf8e2147e1d17aab129501) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  man/systemd.unit.xml                          |  7 +++-- | ||||||
|  |  src/core/emergency-action.c                   | 27 +++++++++++-------- | ||||||
|  |  src/test/test-emergency-action.c              |  6 ++--- | ||||||
|  |  units/meson.build                             |  2 +- | ||||||
|  |  ...d-exit.service.in => systemd-exit.service} |  5 +--- | ||||||
|  |  5 files changed, 24 insertions(+), 23 deletions(-) | ||||||
|  |  rename units/{systemd-exit.service.in => systemd-exit.service} (88%) | ||||||
|  | 
 | ||||||
|  | diff --git a/man/systemd.unit.xml b/man/systemd.unit.xml
 | ||||||
|  | index 5772a6684e..e80c760dd6 100644
 | ||||||
|  | --- a/man/systemd.unit.xml
 | ||||||
|  | +++ b/man/systemd.unit.xml
 | ||||||
|  | @@ -881,9 +881,8 @@
 | ||||||
|  |          Takes one of <option>none</option>, <option>reboot</option>, <option>reboot-force</option>, | ||||||
|  |          <option>reboot-immediate</option>, <option>poweroff</option>, <option>poweroff-force</option>, | ||||||
|  |          <option>poweroff-immediate</option>, <option>exit</option>, and <option>exit-force</option>. In system mode, | ||||||
|  | -        all options except <option>exit</option> and <option>exit-force</option> are allowed. In user mode, only
 | ||||||
|  | -        <option>none</option>, <option>exit</option>, and <option>exit-force</option> are allowed. Both options default
 | ||||||
|  | -        to <option>none</option>.</para>
 | ||||||
|  | +        all options are allowed. In user mode, only <option>none</option>, <option>exit</option>, and
 | ||||||
|  | +        <option>exit-force</option> are allowed. Both options default to <option>none</option>.</para>
 | ||||||
|  |   | ||||||
|  |          <para>If <option>none</option> is set, no action will be triggered. <option>reboot</option> causes a reboot | ||||||
|  |          following the normal shutdown procedure (i.e. equivalent to <command>systemctl reboot</command>). | ||||||
|  | @@ -893,7 +892,7 @@
 | ||||||
|  |          <citerefentry><refentrytitle>reboot</refentrytitle><manvolnum>2</manvolnum></citerefentry> system call, which | ||||||
|  |          might result in data loss. Similarly, <option>poweroff</option>, <option>poweroff-force</option>, | ||||||
|  |          <option>poweroff-immediate</option> have the effect of powering down the system with similar | ||||||
|  | -        semantics. <option>exit</option> causes the user manager to exit following the normal shutdown procedure, and
 | ||||||
|  | +        semantics. <option>exit</option> causes the manager to exit following the normal shutdown procedure, and
 | ||||||
|  |          <option>exit-force</option> causes it terminate without shutting down services.</para></listitem> | ||||||
|  |        </varlistentry> | ||||||
|  |   | ||||||
|  | diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c
 | ||||||
|  | index e9e757dfa3..44b92ae6f8 100644
 | ||||||
|  | --- a/src/core/emergency-action.c
 | ||||||
|  | +++ b/src/core/emergency-action.c
 | ||||||
|  | @@ -13,6 +13,7 @@
 | ||||||
|  |  #include "special.h" | ||||||
|  |  #include "string-table.h" | ||||||
|  |  #include "terminal-util.h" | ||||||
|  | +#include "virt.h"
 | ||||||
|  |   | ||||||
|  |  static void log_and_status(Manager *m, const char *message, const char *reason) { | ||||||
|  |          log_warning("%s: %s", message, reason); | ||||||
|  | @@ -73,12 +74,14 @@ int emergency_action(
 | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_EXIT: | ||||||
|  | -                assert(MANAGER_IS_USER(m));
 | ||||||
|  | -
 | ||||||
|  | -                log_and_status(m, "Exiting", reason);
 | ||||||
|  | +                if (MANAGER_IS_USER(m) || detect_container() > 0) {
 | ||||||
|  | +                        log_and_status(m, "Exiting", reason);
 | ||||||
|  | +                        (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_EXIT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL);
 | ||||||
|  | +                        break;
 | ||||||
|  | +                }
 | ||||||
|  |   | ||||||
|  | -                (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_EXIT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL);
 | ||||||
|  | -                break;
 | ||||||
|  | +                log_notice("Doing \"poweroff\" action instead of an \"exit\" emergency action.");
 | ||||||
|  | +                _fallthrough_;
 | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_POWEROFF: | ||||||
|  |                  log_and_status(m, "Powering off", reason); | ||||||
|  | @@ -86,11 +89,14 @@ int emergency_action(
 | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_EXIT_FORCE: | ||||||
|  | -                assert(MANAGER_IS_USER(m));
 | ||||||
|  | +                if (MANAGER_IS_USER(m) || detect_container() > 0) {
 | ||||||
|  | +                        log_and_status(m, "Exiting immediately", reason);
 | ||||||
|  | +                        m->exit_code = MANAGER_EXIT;
 | ||||||
|  | +                        break;
 | ||||||
|  | +                }
 | ||||||
|  |   | ||||||
|  | -                log_and_status(m, "Exiting immediately", reason);
 | ||||||
|  | -                m->exit_code = MANAGER_EXIT;
 | ||||||
|  | -                break;
 | ||||||
|  | +                log_notice("Doing \"poweroff-force\" action instead of an \"exit-force\" emergency action.");
 | ||||||
|  | +                _fallthrough_;
 | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_POWEROFF_FORCE: | ||||||
|  |                  log_and_status(m, "Forcibly powering off", reason); | ||||||
|  | @@ -137,8 +143,7 @@ int parse_emergency_action(
 | ||||||
|  |          if (x < 0) | ||||||
|  |                  return -EINVAL; | ||||||
|  |   | ||||||
|  | -        if ((system && x >= _EMERGENCY_ACTION_FIRST_USER_ACTION) ||
 | ||||||
|  | -            (!system && x != EMERGENCY_ACTION_NONE && x < _EMERGENCY_ACTION_FIRST_USER_ACTION))
 | ||||||
|  | +        if (!system && x != EMERGENCY_ACTION_NONE && x < _EMERGENCY_ACTION_FIRST_USER_ACTION)
 | ||||||
|  |                  return -EOPNOTSUPP; | ||||||
|  |   | ||||||
|  |          *ret = x; | ||||||
|  | diff --git a/src/test/test-emergency-action.c b/src/test/test-emergency-action.c
 | ||||||
|  | index 493b23227e..8ce28ed9f5 100644
 | ||||||
|  | --- a/src/test/test-emergency-action.c
 | ||||||
|  | +++ b/src/test/test-emergency-action.c
 | ||||||
|  | @@ -36,10 +36,10 @@ static void test_parse_emergency_action(void) {
 | ||||||
|  |          assert_se(parse_emergency_action("poweroff-force", true, &x) == 0); | ||||||
|  |          assert_se(x == EMERGENCY_ACTION_POWEROFF_FORCE); | ||||||
|  |          assert_se(parse_emergency_action("poweroff-immediate", true, &x) == 0); | ||||||
|  | -        assert_se(parse_emergency_action("exit", true, &x) == -EOPNOTSUPP);
 | ||||||
|  | -        assert_se(parse_emergency_action("exit-force", true, &x) == -EOPNOTSUPP);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit", true, &x) == 0);
 | ||||||
|  | +        assert_se(parse_emergency_action("exit-force", true, &x) == 0);
 | ||||||
|  |          assert_se(parse_emergency_action("exit-forcee", true, &x) == -EINVAL); | ||||||
|  | -        assert_se(x == EMERGENCY_ACTION_POWEROFF_IMMEDIATE);
 | ||||||
|  | +        assert_se(x == EMERGENCY_ACTION_EXIT_FORCE);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  int main(int argc, char **argv) { | ||||||
|  | diff --git a/units/meson.build b/units/meson.build
 | ||||||
|  | index 6fa804148b..a74fa95195 100644
 | ||||||
|  | --- a/units/meson.build
 | ||||||
|  | +++ b/units/meson.build
 | ||||||
|  | @@ -86,6 +86,7 @@ units = [
 | ||||||
|  |           'multi-user.target.wants/'], | ||||||
|  |          ['systemd-coredump.socket',             'ENABLE_COREDUMP', | ||||||
|  |           'sockets.target.wants/'], | ||||||
|  | +        ['systemd-exit.service',                 ''],
 | ||||||
|  |          ['systemd-initctl.socket',              '', | ||||||
|  |           'sockets.target.wants/'], | ||||||
|  |          ['systemd-journal-gatewayd.socket',     'ENABLE_REMOTE HAVE_MICROHTTPD'], | ||||||
|  | @@ -135,7 +136,6 @@ in_units = [
 | ||||||
|  |          ['systemd-binfmt.service',               'ENABLE_BINFMT', | ||||||
|  |           'sysinit.target.wants/'], | ||||||
|  |          ['systemd-coredump@.service',            'ENABLE_COREDUMP'], | ||||||
|  | -        ['systemd-exit.service',                 ''],
 | ||||||
|  |          ['systemd-firstboot.service',            'ENABLE_FIRSTBOOT', | ||||||
|  |           'sysinit.target.wants/'], | ||||||
|  |          ['systemd-fsck-root.service',            ''], | ||||||
|  | diff --git a/units/systemd-exit.service.in b/units/systemd-exit.service
 | ||||||
|  | similarity index 88% | ||||||
|  | rename from units/systemd-exit.service.in | ||||||
|  | rename to units/systemd-exit.service | ||||||
|  | index 2fb6ebd767..6029b13a05 100644
 | ||||||
|  | --- a/units/systemd-exit.service.in
 | ||||||
|  | +++ b/units/systemd-exit.service
 | ||||||
|  | @@ -13,7 +13,4 @@ Documentation=man:systemd.special(7)
 | ||||||
|  |  DefaultDependencies=no | ||||||
|  |  Requires=shutdown.target | ||||||
|  |  After=shutdown.target | ||||||
|  | -
 | ||||||
|  | -[Service]
 | ||||||
|  | -Type=oneshot
 | ||||||
|  | -ExecStart=@SYSTEMCTL@ --force exit
 | ||||||
|  | +SuccessAction=exit
 | ||||||
| @ -0,0 +1,174 @@ | |||||||
|  | From c8e9877d14c8742cc3732d305af2422f8a16f47d Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Wed, 17 Oct 2018 17:27:20 +0200 | ||||||
|  | Subject: [PATCH] core: do not "warn" about mundane emergency actions | ||||||
|  | 
 | ||||||
|  | For example in a container we'd log: | ||||||
|  | Oct 17 17:01:10 rawhide systemd[1]: Started Power-Off. | ||||||
|  | Oct 17 17:01:10 rawhide systemd[1]: Forcibly powering off: unit succeeded | ||||||
|  | Oct 17 17:01:10 rawhide systemd[1]: Reached target Power-Off. | ||||||
|  | Oct 17 17:01:10 rawhide systemd[1]: Shutting down. | ||||||
|  | and on the console we'd write (in red) | ||||||
|  | [  !!  ] Forcibly powering off: unit succeeded | ||||||
|  | 
 | ||||||
|  | This is not useful in any way, and the fact that we're calling an "emergency action" | ||||||
|  | is an internal implementation detail. Let's log about c-a-d and the watchdog actions | ||||||
|  | only. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit c7adcb1af9946d0672c16bb4bb7eedf39b3d1fcb) | ||||||
|  | 
 | ||||||
|  | Related: #1860899 | ||||||
|  | ---
 | ||||||
|  |  src/core/emergency-action.c | 29 ++++++++++++++++------------- | ||||||
|  |  src/core/emergency-action.h |  1 + | ||||||
|  |  src/core/job.c              |  3 ++- | ||||||
|  |  src/core/manager.c          |  2 +- | ||||||
|  |  src/core/unit.c             |  3 ++- | ||||||
|  |  5 files changed, 22 insertions(+), 16 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/emergency-action.c b/src/core/emergency-action.c
 | ||||||
|  | index 44b92ae6f8..fea1cb83db 100644
 | ||||||
|  | --- a/src/core/emergency-action.c
 | ||||||
|  | +++ b/src/core/emergency-action.c
 | ||||||
|  | @@ -15,11 +15,12 @@
 | ||||||
|  |  #include "terminal-util.h" | ||||||
|  |  #include "virt.h" | ||||||
|  |   | ||||||
|  | -static void log_and_status(Manager *m, const char *message, const char *reason) {
 | ||||||
|  | -        log_warning("%s: %s", message, reason);
 | ||||||
|  | -        manager_status_printf(m, STATUS_TYPE_EMERGENCY,
 | ||||||
|  | -                              ANSI_HIGHLIGHT_RED "  !!  " ANSI_NORMAL,
 | ||||||
|  | -                              "%s: %s", message, reason);
 | ||||||
|  | +static void log_and_status(Manager *m, bool warn, const char *message, const char *reason) {
 | ||||||
|  | +        log_full(warn ? LOG_WARNING : LOG_DEBUG, "%s: %s", message, reason);
 | ||||||
|  | +        if (warn)
 | ||||||
|  | +                manager_status_printf(m, STATUS_TYPE_EMERGENCY,
 | ||||||
|  | +                                      ANSI_HIGHLIGHT_RED "  !!  " ANSI_NORMAL,
 | ||||||
|  | +                                      "%s: %s", message, reason);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  int emergency_action( | ||||||
|  | @@ -41,17 +42,19 @@ int emergency_action(
 | ||||||
|  |                  return -ECANCELED; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | +        bool warn = FLAGS_SET(options, EMERGENCY_ACTION_WARN);
 | ||||||
|  | +
 | ||||||
|  |          switch (action) { | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_REBOOT: | ||||||
|  | -                log_and_status(m, "Rebooting", reason);
 | ||||||
|  | +                log_and_status(m, warn, "Rebooting", reason);
 | ||||||
|  |   | ||||||
|  |                  (void) update_reboot_parameter_and_warn(reboot_arg); | ||||||
|  |                  (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_REBOOT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL); | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_REBOOT_FORCE: | ||||||
|  | -                log_and_status(m, "Forcibly rebooting", reason);
 | ||||||
|  | +                log_and_status(m, warn, "Forcibly rebooting", reason);
 | ||||||
|  |   | ||||||
|  |                  (void) update_reboot_parameter_and_warn(reboot_arg); | ||||||
|  |                  m->exit_code = MANAGER_REBOOT; | ||||||
|  | @@ -59,7 +62,7 @@ int emergency_action(
 | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_REBOOT_IMMEDIATE: | ||||||
|  | -                log_and_status(m, "Rebooting immediately", reason);
 | ||||||
|  | +                log_and_status(m, warn, "Rebooting immediately", reason);
 | ||||||
|  |   | ||||||
|  |                  sync(); | ||||||
|  |   | ||||||
|  | @@ -75,7 +78,7 @@ int emergency_action(
 | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_EXIT: | ||||||
|  |                  if (MANAGER_IS_USER(m) || detect_container() > 0) { | ||||||
|  | -                        log_and_status(m, "Exiting", reason);
 | ||||||
|  | +                        log_and_status(m, warn, "Exiting", reason);
 | ||||||
|  |                          (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_EXIT_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL); | ||||||
|  |                          break; | ||||||
|  |                  } | ||||||
|  | @@ -84,13 +87,13 @@ int emergency_action(
 | ||||||
|  |                  _fallthrough_; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_POWEROFF: | ||||||
|  | -                log_and_status(m, "Powering off", reason);
 | ||||||
|  | +                log_and_status(m, warn, "Powering off", reason);
 | ||||||
|  |                  (void) manager_add_job_by_name_and_warn(m, JOB_START, SPECIAL_POWEROFF_TARGET, JOB_REPLACE_IRREVERSIBLY, NULL, NULL); | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_EXIT_FORCE: | ||||||
|  |                  if (MANAGER_IS_USER(m) || detect_container() > 0) { | ||||||
|  | -                        log_and_status(m, "Exiting immediately", reason);
 | ||||||
|  | +                        log_and_status(m, warn, "Exiting immediately", reason);
 | ||||||
|  |                          m->exit_code = MANAGER_EXIT; | ||||||
|  |                          break; | ||||||
|  |                  } | ||||||
|  | @@ -99,12 +102,12 @@ int emergency_action(
 | ||||||
|  |                  _fallthrough_; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_POWEROFF_FORCE: | ||||||
|  | -                log_and_status(m, "Forcibly powering off", reason);
 | ||||||
|  | +                log_and_status(m, warn, "Forcibly powering off", reason);
 | ||||||
|  |                  m->exit_code = MANAGER_POWEROFF; | ||||||
|  |                  break; | ||||||
|  |   | ||||||
|  |          case EMERGENCY_ACTION_POWEROFF_IMMEDIATE: | ||||||
|  | -                log_and_status(m, "Powering off immediately", reason);
 | ||||||
|  | +                log_and_status(m, warn, "Powering off immediately", reason);
 | ||||||
|  |   | ||||||
|  |                  sync(); | ||||||
|  |   | ||||||
|  | diff --git a/src/core/emergency-action.h b/src/core/emergency-action.h
 | ||||||
|  | index efbfaf6c6a..2aa1497118 100644
 | ||||||
|  | --- a/src/core/emergency-action.h
 | ||||||
|  | +++ b/src/core/emergency-action.h
 | ||||||
|  | @@ -22,6 +22,7 @@ typedef enum EmergencyAction {
 | ||||||
|  |   | ||||||
|  |  typedef enum EmergencyActionFlags { | ||||||
|  |          EMERGENCY_ACTION_IS_WATCHDOG = 1 << 0, | ||||||
|  | +        EMERGENCY_ACTION_WARN        = 1 << 1,
 | ||||||
|  |  } EmergencyActionFlags; | ||||||
|  |   | ||||||
|  |  #include "macro.h" | ||||||
|  | diff --git a/src/core/job.c b/src/core/job.c
 | ||||||
|  | index d647aac42d..43ab55ed18 100644
 | ||||||
|  | --- a/src/core/job.c
 | ||||||
|  | +++ b/src/core/job.c
 | ||||||
|  | @@ -1076,7 +1076,8 @@ static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *user
 | ||||||
|  |          u = j->unit; | ||||||
|  |          job_finish_and_invalidate(j, JOB_TIMEOUT, true, false); | ||||||
|  |   | ||||||
|  | -        emergency_action(u->manager, u->job_timeout_action, EMERGENCY_ACTION_IS_WATCHDOG,
 | ||||||
|  | +        emergency_action(u->manager, u->job_timeout_action,
 | ||||||
|  | +                         EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
 | ||||||
|  |                           u->job_timeout_reboot_arg, "job timed out"); | ||||||
|  |   | ||||||
|  |          return 0; | ||||||
|  | diff --git a/src/core/manager.c b/src/core/manager.c
 | ||||||
|  | index ac1b198b21..ee976f70b3 100644
 | ||||||
|  | --- a/src/core/manager.c
 | ||||||
|  | +++ b/src/core/manager.c
 | ||||||
|  | @@ -2528,7 +2528,7 @@ static void manager_handle_ctrl_alt_del(Manager *m) {
 | ||||||
|  |          if (ratelimit_below(&m->ctrl_alt_del_ratelimit) || m->cad_burst_action == EMERGENCY_ACTION_NONE) | ||||||
|  |                  manager_start_target(m, SPECIAL_CTRL_ALT_DEL_TARGET, JOB_REPLACE_IRREVERSIBLY); | ||||||
|  |          else | ||||||
|  | -                emergency_action(m, m->cad_burst_action, 0, NULL, 
 | ||||||
|  | +                emergency_action(m, m->cad_burst_action, EMERGENCY_ACTION_WARN, NULL,
 | ||||||
|  |                                  "Ctrl-Alt-Del was pressed more than 7 times within 2s"); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | diff --git a/src/core/unit.c b/src/core/unit.c
 | ||||||
|  | index dc5c89c195..23afa24c77 100644
 | ||||||
|  | --- a/src/core/unit.c
 | ||||||
|  | +++ b/src/core/unit.c
 | ||||||
|  | @@ -1669,7 +1669,8 @@ int unit_start_limit_test(Unit *u) {
 | ||||||
|  |          log_unit_warning(u, "Start request repeated too quickly."); | ||||||
|  |          u->start_limit_hit = true; | ||||||
|  |   | ||||||
|  | -        return emergency_action(u->manager, u->start_limit_action, EMERGENCY_ACTION_IS_WATCHDOG,
 | ||||||
|  | +        return emergency_action(u->manager, u->start_limit_action,
 | ||||||
|  | +                                EMERGENCY_ACTION_IS_WATCHDOG|EMERGENCY_ACTION_WARN,
 | ||||||
|  |                                  u->reboot_arg, "unit failed"); | ||||||
|  |  } | ||||||
|  |   | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From bfc6e3c33b49b4f2e611e2ff151d3088055df07d Mon Sep 17 00:00:00 2001 | From 2aaa40e698f66fd10d0a7a71ca39637e24809e97 Mon Sep 17 00:00:00 2001 | ||||||
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
| Date: Wed, 17 Oct 2018 17:48:35 +0200 | Date: Wed, 17 Oct 2018 17:48:35 +0200 | ||||||
| Subject: [PATCH] core: return true from cg_is_empty* on ENOENT | Subject: [PATCH] core: return true from cg_is_empty* on ENOENT | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 1bcf3fc6c57d92927b96cad8c739099b4ceae236) | (cherry picked from commit 1bcf3fc6c57d92927b96cad8c739099b4ceae236) | ||||||
| 
 | 
 | ||||||
| Related: #2024903 | Related: #1860899 | ||||||
| ---
 | ---
 | ||||||
|  src/basic/cgroup-util.c | 6 ++++-- |  src/basic/cgroup-util.c | 6 ++++-- | ||||||
|  1 file changed, 4 insertions(+), 2 deletions(-) |  1 file changed, 4 insertions(+), 2 deletions(-) | ||||||
| @ -0,0 +1,29 @@ | |||||||
|  | From 01da36fadd365329cfd9e2c97eb419c63404b25f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Mon, 3 Dec 2018 17:30:19 +0100 | ||||||
|  | Subject: [PATCH] macro: define HAS_FEATURE_ADDRESS_SANITIZER also on gcc | ||||||
|  | 
 | ||||||
|  | Let's make differences between compilers more minimal. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit be5f77b26e22a806179c7b03e03d424682ed325c) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  src/basic/macro.h | 4 +++- | ||||||
|  |  1 file changed, 3 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/macro.h b/src/basic/macro.h
 | ||||||
|  | index 62f2359633..e87026882f 100644
 | ||||||
|  | --- a/src/basic/macro.h
 | ||||||
|  | +++ b/src/basic/macro.h
 | ||||||
|  | @@ -56,7 +56,9 @@
 | ||||||
|  |  #endif | ||||||
|  |   | ||||||
|  |  #if !defined(HAS_FEATURE_ADDRESS_SANITIZER) | ||||||
|  | -#  if defined(__has_feature)
 | ||||||
|  | +#  ifdef __SANITIZE_ADDRESS__
 | ||||||
|  | +#      define HAS_FEATURE_ADDRESS_SANITIZER 1
 | ||||||
|  | +#  elif defined(__has_feature)
 | ||||||
|  |  #    if __has_feature(address_sanitizer) | ||||||
|  |  #      define HAS_FEATURE_ADDRESS_SANITIZER 1 | ||||||
|  |  #    endif | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From ccdf0a116dcba01ec4d8caec0baef2910d8d9800 Mon Sep 17 00:00:00 2001 | From 6fbbf368f5a6d181b21f448255d5a4182dc2ab3a Mon Sep 17 00:00:00 2001 | ||||||
| From: Frantisek Sumsal <frantisek@sumsal.cz> | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
| Date: Mon, 29 Nov 2021 13:00:21 +0100 | Date: Mon, 29 Nov 2021 13:00:21 +0100 | ||||||
| Subject: [PATCH] tests: add helper function to autodetect CI environments | Subject: [PATCH] tests: add helper function to autodetect CI environments | ||||||
| @ -7,9 +7,9 @@ Sadly there is no standarized way to check if we're running in some | |||||||
| CI environment. So let's try to gather the heuristics in one helper | CI environment. So let's try to gather the heuristics in one helper | ||||||
| function. | function. | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 6fbbf368f5a6d181b21f448255d5a4182dc2ab3a) | Loosely cherry-picked from 4eb0c875f8825199a829ddc597874915fbee0a84. | ||||||
| 
 | 
 | ||||||
| Related: #2039327 | Related: #2017033 | ||||||
| ---
 | ---
 | ||||||
|  src/basic/string-util.h |  6 ++++++ |  src/basic/string-util.h |  6 ++++++ | ||||||
|  src/shared/tests.c      | 42 +++++++++++++++++++++++++++++++++++++++++ |  src/shared/tests.c      | 42 +++++++++++++++++++++++++++++++++++++++++ | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From ad8b47946941e6a1f3ae778f5e8563ddf532b2ba Mon Sep 17 00:00:00 2001 | From 3539a72c260063713e4ecba17966ba9a768d8af9 Mon Sep 17 00:00:00 2001 | ||||||
| From: Lennart Poettering <lennart@poettering.net> | From: Lennart Poettering <lennart@poettering.net> | ||||||
| Date: Wed, 16 Jan 2019 00:13:38 +0100 | Date: Wed, 16 Jan 2019 00:13:38 +0100 | ||||||
| Subject: [PATCH] strv: rework FOREACH_STRING() macro | Subject: [PATCH] strv: rework FOREACH_STRING() macro | ||||||
| @ -15,9 +15,7 @@ instead of a "const char*", which is good too. | |||||||
| Fixes: #11394 | Fixes: #11394 | ||||||
| (cherry picked from commit 66a64081f82dfad90f2f9394a477820a2e3e6510) | (cherry picked from commit 66a64081f82dfad90f2f9394a477820a2e3e6510) | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 3539a72c260063713e4ecba17966ba9a768d8af9) | Related: #2017033 | ||||||
| 
 |  | ||||||
| Related: #2039327 |  | ||||||
| ---
 | ---
 | ||||||
|  src/basic/strv.h | 15 ++++----------- |  src/basic/strv.h | 15 ++++----------- | ||||||
|  1 file changed, 4 insertions(+), 11 deletions(-) |  1 file changed, 4 insertions(+), 11 deletions(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 5a45664f9b5d2ba7550ed1c12550554688b70f5c Mon Sep 17 00:00:00 2001 | From fdfff847313222eed3306ac605db46d8cbd23212 Mon Sep 17 00:00:00 2001 | ||||||
| From: Frantisek Sumsal <frantisek@sumsal.cz> | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
| Date: Mon, 29 Nov 2021 13:47:24 +0100 | Date: Mon, 29 Nov 2021 13:47:24 +0100 | ||||||
| Subject: [PATCH] test,systemctl: use "const char*" instead of "char*" | Subject: [PATCH] test,systemctl: use "const char*" instead of "char*" | ||||||
| @ -10,9 +10,7 @@ hence it's more correct to have the iterator const too. | |||||||
| 
 | 
 | ||||||
| Based on b2238e380e5f2fbcc129643b3fbd66f2828fd57c. | Based on b2238e380e5f2fbcc129643b3fbd66f2828fd57c. | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit fdfff847313222eed3306ac605db46d8cbd23212) | Related: #2017033 | ||||||
| 
 |  | ||||||
| Related: #2039327 |  | ||||||
| ---
 | ---
 | ||||||
|  src/systemctl/systemctl.c | 3 ++- |  src/systemctl/systemctl.c | 3 ++- | ||||||
|  src/test/test-execute.c   | 2 +- |  src/test/test-execute.c   | 2 +- | ||||||
| @ -33,7 +31,7 @@ index 3dd7c1522f..b967550b97 100644 | |||||||
|                  size_t argc; |                  size_t argc; | ||||||
|   |   | ||||||
| diff --git a/src/test/test-execute.c b/src/test/test-execute.c
 | diff --git a/src/test/test-execute.c b/src/test/test-execute.c
 | ||||||
| index 294f8fe7dd..4d21301982 100644
 | index 5303652b93..7581d5ed68 100644
 | ||||||
| --- a/src/test/test-execute.c
 | --- a/src/test/test-execute.c
 | ||||||
| +++ b/src/test/test-execute.c
 | +++ b/src/test/test-execute.c
 | ||||||
| @@ -146,7 +146,7 @@ invalid:
 | @@ -146,7 +146,7 @@ invalid:
 | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From d9542b919237306baee2d2396794f63da67b1314 Mon Sep 17 00:00:00 2001 | From a8fd8d157c832ddad34a9a3e372579c58261f7fb Mon Sep 17 00:00:00 2001 | ||||||
| From: Frantisek Sumsal <frantisek@sumsal.cz> | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
| Date: Mon, 29 Nov 2021 13:59:41 +0100 | Date: Mon, 29 Nov 2021 13:59:41 +0100 | ||||||
| Subject: [PATCH] ci: pass the $GITHUB_ACTIONS variable to the CentOS container | Subject: [PATCH] ci: pass the $GITHUB_ACTIONS variable to the CentOS container | ||||||
| @ -6,10 +6,8 @@ Subject: [PATCH] ci: pass the $GITHUB_ACTIONS variable to the CentOS container | |||||||
| so we can properly skip tests which are problematic when running in GH | so we can properly skip tests which are problematic when running in GH | ||||||
| Actions. | Actions. | ||||||
| 
 | 
 | ||||||
| Related: #2039327 | Related: #2017033 | ||||||
| rhel-only | rhel-only | ||||||
| 
 |  | ||||||
| (cherry picked from commit a8fd8d157c832ddad34a9a3e372579c58261f7fb) |  | ||||||
| ---
 | ---
 | ||||||
|  .github/workflows/unit_tests.sh | 2 +- |  .github/workflows/unit_tests.sh | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
| @ -0,0 +1,171 @@ | |||||||
|  | From cecb3cc06f6025835324c1837c03def1d9be8eb1 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
|  | Date: Wed, 1 Dec 2021 21:31:43 +0100 | ||||||
|  | Subject: [PATCH] lgtm: detect uninitialized variables using the __cleanup__ | ||||||
|  |  attribute | ||||||
|  | 
 | ||||||
|  | This is a slightly modified version of the original | ||||||
|  | `cpp/uninitialized-local` CodeQL query which focuses only on variables | ||||||
|  | using the cleanup macros. Since this has proven to cause issues in the | ||||||
|  | past, let's panic on every uninitialized variable using any of the | ||||||
|  | cleanup macros (as long as they're written using the __cleanup__ | ||||||
|  | attribute). | ||||||
|  | 
 | ||||||
|  | Some test results from a test I used when writing the query: | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  |  #define _cleanup_foo_ __attribute__((__cleanup__(foo))) | ||||||
|  |  #define _cleanup_(x) __attribute__((__cleanup__(x))) | ||||||
|  | 
 | ||||||
|  |  static inline void freep(void *p) { | ||||||
|  |          *(void**)p = mfree(*(void**) p); | ||||||
|  |  } | ||||||
|  | 
 | ||||||
|  |  #define _cleanup_free_ _cleanup_(freep) | ||||||
|  | 
 | ||||||
|  |  static inline void foo(char **p) { | ||||||
|  |      if (*p) | ||||||
|  |          *p = free(*p); | ||||||
|  |  } | ||||||
|  | 
 | ||||||
|  |  int main(void) { | ||||||
|  |      __attribute__((__cleanup__(foo))) char *a; | ||||||
|  |      char *b; | ||||||
|  |      _cleanup_foo_ char *c; | ||||||
|  |      char **d; | ||||||
|  |      _cleanup_free_ char *e; | ||||||
|  |      int r; | ||||||
|  | 
 | ||||||
|  |      r = fun(&e); | ||||||
|  |      if (r < 0) | ||||||
|  |          return 1; | ||||||
|  | 
 | ||||||
|  |      puts(a); | ||||||
|  |      puts(b); | ||||||
|  |      puts(c); | ||||||
|  |      puts(*d); | ||||||
|  |      puts(e); | ||||||
|  | 
 | ||||||
|  |      return 0; | ||||||
|  |  } | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | ``` | ||||||
|  | +| test.c:23:14:23:14 | e | The variable $@ may not be initialized here, but has a cleanup handler. | test.c:20:26:20:26 | e | e |
 | ||||||
|  | +| test.c:27:10:27:10 | a | The variable $@ may not be initialized here, but has a cleanup handler. | test.c:16:45:16:45 | a | a |
 | ||||||
|  | +| test.c:29:10:29:10 | c | The variable $@ may not be initialized here, but has a cleanup handler. | test.c:18:25:18:25 | c | c |
 | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 863bff75488d33f519deea6390988f3d9d72e6de) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .../UninitializedVariableWithCleanup.ql       | 99 +++++++++++++++++++ | ||||||
|  |  1 file changed, 99 insertions(+) | ||||||
|  |  create mode 100644 .lgtm/cpp-queries/UninitializedVariableWithCleanup.ql | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | new file mode 100644 | ||||||
|  | index 0000000000..6bf0ae01eb
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | @@ -0,0 +1,99 @@
 | ||||||
|  | +/**
 | ||||||
|  | + * vi: sw=2 ts=2 et syntax=ql:
 | ||||||
|  | + *
 | ||||||
|  | + * Based on cpp/uninitialized-local.
 | ||||||
|  | + *
 | ||||||
|  | + * @name Potentially uninitialized local variable using the cleanup attribute
 | ||||||
|  | + * @description Running the cleanup handler on a possibly uninitialized variable
 | ||||||
|  | + *              is generally a bad idea.
 | ||||||
|  | + * @id cpp/uninitialized-local-with-cleanup
 | ||||||
|  | + * @kind problem
 | ||||||
|  | + * @problem.severity error
 | ||||||
|  | + * @precision high
 | ||||||
|  | + * @tags security
 | ||||||
|  | + */
 | ||||||
|  | +
 | ||||||
|  | +import cpp
 | ||||||
|  | +import semmle.code.cpp.controlflow.StackVariableReachability
 | ||||||
|  | +
 | ||||||
|  | +/**
 | ||||||
|  | + * Auxiliary predicate: Types that don't require initialization
 | ||||||
|  | + * before they are used, since they're stack-allocated.
 | ||||||
|  | + */
 | ||||||
|  | +predicate allocatedType(Type t) {
 | ||||||
|  | +  /* Arrays: "int foo[1]; foo[0] = 42;" is ok. */
 | ||||||
|  | +  t instanceof ArrayType
 | ||||||
|  | +  or
 | ||||||
|  | +  /* Structs: "struct foo bar; bar.baz = 42" is ok. */
 | ||||||
|  | +  t instanceof Class
 | ||||||
|  | +  or
 | ||||||
|  | +  /* Typedefs to other allocated types are fine. */
 | ||||||
|  | +  allocatedType(t.(TypedefType).getUnderlyingType())
 | ||||||
|  | +  or
 | ||||||
|  | +  /* Type specifiers don't affect whether or not a type is allocated. */
 | ||||||
|  | +  allocatedType(t.getUnspecifiedType())
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +/**
 | ||||||
|  | + * A declaration of a local variable using __attribute__((__cleanup__(x)))
 | ||||||
|  | + * that leaves the variable uninitialized.
 | ||||||
|  | + */
 | ||||||
|  | +DeclStmt declWithNoInit(LocalVariable v) {
 | ||||||
|  | +  result.getADeclaration() = v and
 | ||||||
|  | +  not exists(v.getInitializer()) and
 | ||||||
|  | +  /* The variable has __attribute__((__cleanup__(...))) set */
 | ||||||
|  | +  v.getAnAttribute().hasName("cleanup") and
 | ||||||
|  | +  /* The type of the variable is not stack-allocated. */
 | ||||||
|  | +  exists(Type t | t = v.getType() | not allocatedType(t))
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +class UninitialisedLocalReachability extends StackVariableReachability {
 | ||||||
|  | +  UninitialisedLocalReachability() { this = "UninitialisedLocal" }
 | ||||||
|  | +
 | ||||||
|  | +  override predicate isSource(ControlFlowNode node, StackVariable v) { node = declWithNoInit(v) }
 | ||||||
|  | +
 | ||||||
|  | +  /* Note: _don't_ use the `useOfVarActual()` predicate here (and a couple of lines
 | ||||||
|  | +   * below), as it assumes that the callee always modifies the variable if
 | ||||||
|  | +   * it's passed to the function.
 | ||||||
|  | +   *
 | ||||||
|  | +   * i.e.:
 | ||||||
|  | +   * _cleanup_free char *x;
 | ||||||
|  | +   * fun(&x);
 | ||||||
|  | +   * puts(x);
 | ||||||
|  | +   *
 | ||||||
|  | +   * `useOfVarActual()` won't treat this an an uninitialized read even if the callee
 | ||||||
|  | +   * doesn't modify the argument, however, `useOfVar()` will
 | ||||||
|  | +   */
 | ||||||
|  | +  override predicate isSink(ControlFlowNode node, StackVariable v) { useOfVar(v, node) }
 | ||||||
|  | +
 | ||||||
|  | +  override predicate isBarrier(ControlFlowNode node, StackVariable v) {
 | ||||||
|  | +    // only report the _first_ possibly uninitialized use
 | ||||||
|  | +    useOfVar(v, node) or
 | ||||||
|  | +    definitionBarrier(v, node)
 | ||||||
|  | +  }
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +pragma[noinline]
 | ||||||
|  | +predicate containsInlineAssembly(Function f) { exists(AsmStmt s | s.getEnclosingFunction() = f) }
 | ||||||
|  | +
 | ||||||
|  | +/**
 | ||||||
|  | + * Auxiliary predicate: List common exceptions or false positives
 | ||||||
|  | + * for this check to exclude them.
 | ||||||
|  | + */
 | ||||||
|  | +VariableAccess commonException() {
 | ||||||
|  | +  // If the uninitialized use we've found is in a macro expansion, it's
 | ||||||
|  | +  // typically something like va_start(), and we don't want to complain.
 | ||||||
|  | +  result.getParent().isInMacroExpansion()
 | ||||||
|  | +  or
 | ||||||
|  | +  result.getParent() instanceof BuiltInOperation
 | ||||||
|  | +  or
 | ||||||
|  | +  // Finally, exclude functions that contain assembly blocks. It's
 | ||||||
|  | +  // anyone's guess what happens in those.
 | ||||||
|  | +  containsInlineAssembly(result.getEnclosingFunction())
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +from UninitialisedLocalReachability r, LocalVariable v, VariableAccess va
 | ||||||
|  | +where
 | ||||||
|  | +  r.reaches(_, v, va) and
 | ||||||
|  | +  not va = commonException()
 | ||||||
|  | +select va, "The variable $@ may not be initialized here, but has a cleanup handler.", v, v.getName()
 | ||||||
| @ -0,0 +1,84 @@ | |||||||
|  | From c4a34b71d4f51f071f7a722059e36388b41d30e4 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Evgeny Vereshchagin <evvers@ya.ru> | ||||||
|  | Date: Mon, 11 Mar 2019 21:05:13 +0100 | ||||||
|  | Subject: [PATCH] lgtm: replace the query used for looking for fgets with a | ||||||
|  |  more general query | ||||||
|  | 
 | ||||||
|  | to make it easier to comlain about `strtok` :-) | ||||||
|  | 
 | ||||||
|  | Inspired by https://github.com/systemd/systemd/pull/11963, which, in turn, | ||||||
|  | was prompted by https://github.com/systemd/systemd/pull/11555. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 7ba5ded9dbd7737bc368521f5ea7c90e5b06ab3e) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .../PotentiallyDangerousFunction.ql           | 30 +++++++++++++++++++ | ||||||
|  |  .lgtm/cpp-queries/fgets.ql                    | 21 ------------- | ||||||
|  |  2 files changed, 30 insertions(+), 21 deletions(-) | ||||||
|  |  create mode 100644 .lgtm/cpp-queries/PotentiallyDangerousFunction.ql | ||||||
|  |  delete mode 100644 .lgtm/cpp-queries/fgets.ql | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | new file mode 100644 | ||||||
|  | index 0000000000..ba80f4ad8c
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | @@ -0,0 +1,30 @@
 | ||||||
|  | +/**
 | ||||||
|  | + * @name Use of potentially dangerous function
 | ||||||
|  | + * @description Certain standard library functions are dangerous to call.
 | ||||||
|  | + * @kind problem
 | ||||||
|  | + * @problem.severity error
 | ||||||
|  | + * @precision high
 | ||||||
|  | + * @id cpp/potentially-dangerous-function
 | ||||||
|  | + * @tags reliability
 | ||||||
|  | + *       security
 | ||||||
|  | + *
 | ||||||
|  | + * Borrowed from
 | ||||||
|  | + * https://github.com/Semmle/ql/blob/master/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.ql
 | ||||||
|  | + */
 | ||||||
|  | +import cpp
 | ||||||
|  | +
 | ||||||
|  | +predicate potentiallyDangerousFunction(Function f, string message) {
 | ||||||
|  | +  (
 | ||||||
|  | +    f.getQualifiedName() = "fgets" and
 | ||||||
|  | +    message = "Call to fgets is potentially dangerous. Use read_line() instead."
 | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "strtok" and
 | ||||||
|  | +    message = "Call to strtok is potentially dangerous. Use extract_first_word() instead."
 | ||||||
|  | +  )
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +from FunctionCall call, Function target, string message
 | ||||||
|  | +where
 | ||||||
|  | +  call.getTarget() = target and
 | ||||||
|  | +  potentiallyDangerousFunction(target, message)
 | ||||||
|  | +select call, message
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/fgets.ql b/.lgtm/cpp-queries/fgets.ql
 | ||||||
|  | deleted file mode 100644 | ||||||
|  | index a4181e4f3d..0000000000
 | ||||||
|  | --- a/.lgtm/cpp-queries/fgets.ql
 | ||||||
|  | +++ /dev/null
 | ||||||
|  | @@ -1,21 +0,0 @@
 | ||||||
|  | -/**
 | ||||||
|  | - * @name Use of fgets()
 | ||||||
|  | - * @description fgets() is dangerous to call. Use read_line() instead.
 | ||||||
|  | - * @kind problem
 | ||||||
|  | - * @problem.severity error
 | ||||||
|  | - * @precision high
 | ||||||
|  | - * @id cpp/fgets
 | ||||||
|  | - * @tags reliability
 | ||||||
|  | - *       security
 | ||||||
|  | - */
 | ||||||
|  | -import cpp
 | ||||||
|  | -
 | ||||||
|  | -predicate dangerousFunction(Function function) {
 | ||||||
|  | -  exists (string name | name = function.getQualifiedName() |
 | ||||||
|  | -    name = "fgets")
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  | -from FunctionCall call, Function target
 | ||||||
|  | -where call.getTarget() = target
 | ||||||
|  | -  and dangerousFunction(target)
 | ||||||
|  | -select call, target.getQualifiedName() + " is potentially dangerous"
 | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | From 8b60932555141e1fe61a343863eae7655c2449a9 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Tue, 2 Apr 2019 12:43:47 +0200 | ||||||
|  | Subject: [PATCH] lgtm: beef up list of dangerous/questionnable API calls not | ||||||
|  |  to make | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 9b4805421eb2a7319f6507a26febfb9d2cdc3a93) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .../PotentiallyDangerousFunction.ql           | 22 +++++++++++++++++-- | ||||||
|  |  1 file changed, 20 insertions(+), 2 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | index ba80f4ad8c..cd0284b37a 100644
 | ||||||
|  | --- a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | +++ b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | @@ -16,10 +16,28 @@ import cpp
 | ||||||
|  |  predicate potentiallyDangerousFunction(Function f, string message) { | ||||||
|  |    ( | ||||||
|  |      f.getQualifiedName() = "fgets" and | ||||||
|  | -    message = "Call to fgets is potentially dangerous. Use read_line() instead."
 | ||||||
|  | +    message = "Call to fgets() is potentially dangerous. Use read_line() instead."
 | ||||||
|  |    ) or ( | ||||||
|  |      f.getQualifiedName() = "strtok" and | ||||||
|  | -    message = "Call to strtok is potentially dangerous. Use extract_first_word() instead."
 | ||||||
|  | +    message = "Call to strtok() is potentially dangerous. Use extract_first_word() instead."
 | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "strsep" and
 | ||||||
|  | +    message = "Call to strsep() is potentially dangerous. Use extract_first_word() instead."
 | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "dup" and
 | ||||||
|  | +    message = "Call to dup() is potentially dangerous. Use fcntl(fd, FD_DUPFD_CLOEXEC, 3) instead."
 | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "htonl" and
 | ||||||
|  | +    message = "Call to htonl() is confusing. Use htobe32() instead."
 | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "htons" and
 | ||||||
|  | +    message = "Call to htons() is confusing. Use htobe16() instead."
 | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "ntohl" and
 | ||||||
|  | +    message = "Call to ntohl() is confusing. Use be32toh() instead."
 | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "ntohs" and
 | ||||||
|  | +    message = "Call to ntohs() is confusing. Use be16toh() instead."
 | ||||||
|  |    ) | ||||||
|  |  } | ||||||
|  |   | ||||||
							
								
								
									
										26
									
								
								SOURCES/0683-lgtm-warn-about-strerror-use.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								SOURCES/0683-lgtm-warn-about-strerror-use.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | From af6eac25456d4ca7e8233e00aec7531e640f17af Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Fri, 5 Apr 2019 15:31:34 +0200 | ||||||
|  | Subject: [PATCH] lgtm: warn about strerror() use | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 9ff46eded2b99d244455467eb55c0ff3f51c5362) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .lgtm/cpp-queries/PotentiallyDangerousFunction.ql | 3 +++ | ||||||
|  |  1 file changed, 3 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | index cd0284b37a..96712cf1c6 100644
 | ||||||
|  | --- a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | +++ b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | @@ -38,6 +38,9 @@ predicate potentiallyDangerousFunction(Function f, string message) {
 | ||||||
|  |    ) or ( | ||||||
|  |      f.getQualifiedName() = "ntohs" and | ||||||
|  |      message = "Call to ntohs() is confusing. Use be16toh() instead." | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "strerror" and
 | ||||||
|  | +    message = "Call to strerror() is not thread-safe. Use strerror_r() or printf()'s %m format string instead."
 | ||||||
|  |    ) | ||||||
|  |  } | ||||||
|  |   | ||||||
| @ -0,0 +1,27 @@ | |||||||
|  | From bfa090ce83f2b0734c526a4426a20f6f0f943aa0 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Wed, 10 Apr 2019 19:36:40 +0200 | ||||||
|  | Subject: [PATCH] lgtm: complain about accept() [people should use accept4() | ||||||
|  |  instead, due to O_CLOEXEC] | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit e2d0fa6feb3797246c8bfda3db45a2f5b62e1b5b) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .lgtm/cpp-queries/PotentiallyDangerousFunction.ql | 3 +++ | ||||||
|  |  1 file changed, 3 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | index 96712cf1c6..865330430d 100644
 | ||||||
|  | --- a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | +++ b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | @@ -41,6 +41,9 @@ predicate potentiallyDangerousFunction(Function f, string message) {
 | ||||||
|  |    ) or ( | ||||||
|  |      f.getQualifiedName() = "strerror" and | ||||||
|  |      message = "Call to strerror() is not thread-safe. Use strerror_r() or printf()'s %m format string instead." | ||||||
|  | +  ) or (
 | ||||||
|  | +    f.getQualifiedName() = "accept" and
 | ||||||
|  | +    message = "Call to accept() is not O_CLOEXEC-safe. Use accept4() instead."
 | ||||||
|  |    ) | ||||||
|  |  } | ||||||
|  |   | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | From 6eeaef95566e6d85e714280c412e5df347838e34 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
|  | Date: Thu, 2 Dec 2021 16:55:17 +0100 | ||||||
|  | Subject: [PATCH] lgtm: don't treat the custom note as a list of tags | ||||||
|  | 
 | ||||||
|  | Just a cosmetic change. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit c7d70210fa45c3210b8b1eda51bc0f6d68bd8392) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .lgtm/cpp-queries/PotentiallyDangerousFunction.ql | 10 ++++++---- | ||||||
|  |  1 file changed, 6 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | index 865330430d..39e8dddd13 100644
 | ||||||
|  | --- a/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | +++ b/.lgtm/cpp-queries/PotentiallyDangerousFunction.ql
 | ||||||
|  | @@ -1,15 +1,17 @@
 | ||||||
|  |  /** | ||||||
|  | + * vi: sw=2 ts=2 et syntax=ql:
 | ||||||
|  | + *
 | ||||||
|  | + * Borrowed from
 | ||||||
|  | + * https://github.com/Semmle/ql/blob/master/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.ql
 | ||||||
|  | + *
 | ||||||
|  |   * @name Use of potentially dangerous function | ||||||
|  |   * @description Certain standard library functions are dangerous to call. | ||||||
|  | + * @id cpp/potentially-dangerous-function
 | ||||||
|  |   * @kind problem | ||||||
|  |   * @problem.severity error | ||||||
|  |   * @precision high | ||||||
|  | - * @id cpp/potentially-dangerous-function
 | ||||||
|  |   * @tags reliability | ||||||
|  |   *       security | ||||||
|  | - *
 | ||||||
|  | - * Borrowed from
 | ||||||
|  | - * https://github.com/Semmle/ql/blob/master/cpp/ql/src/Security/CWE/CWE-676/PotentiallyDangerousFunction.ql
 | ||||||
|  |   */ | ||||||
|  |  import cpp | ||||||
|  |   | ||||||
							
								
								
									
										42
									
								
								SOURCES/0686-lgtm-ignore-certain-cleanup-functions.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								SOURCES/0686-lgtm-ignore-certain-cleanup-functions.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,42 @@ | |||||||
|  | From 42123e9614ea73c7f64c684c90e4dbb049ef67ef Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
|  | Date: Sun, 5 Dec 2021 10:25:28 +0100 | ||||||
|  | Subject: [PATCH] lgtm: ignore certain cleanup functions | ||||||
|  | 
 | ||||||
|  | as they don't do any illegal stuff even when used with an uninitialized | ||||||
|  | variable. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit af1868213657b38b8d4008608976eb81546cfb8e) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .lgtm/cpp-queries/UninitializedVariableWithCleanup.ql | 9 +++++++++ | ||||||
|  |  1 file changed, 9 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | index 6bf0ae01eb..8c24b6d8f1 100644
 | ||||||
|  | --- a/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | +++ b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | @@ -34,6 +34,13 @@ predicate allocatedType(Type t) {
 | ||||||
|  |    allocatedType(t.getUnspecifiedType()) | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +/** Auxiliary predicate: List cleanup functions we want to explicitly ignore
 | ||||||
|  | +  * since they don't do anything illegal even when the variable is uninitialized
 | ||||||
|  | +  */
 | ||||||
|  | +predicate cleanupFunctionDenyList(string fun) {
 | ||||||
|  | +  fun = "erase_char"
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  /** | ||||||
|  |   * A declaration of a local variable using __attribute__((__cleanup__(x))) | ||||||
|  |   * that leaves the variable uninitialized. | ||||||
|  | @@ -43,6 +50,8 @@ DeclStmt declWithNoInit(LocalVariable v) {
 | ||||||
|  |    not exists(v.getInitializer()) and | ||||||
|  |    /* The variable has __attribute__((__cleanup__(...))) set */ | ||||||
|  |    v.getAnAttribute().hasName("cleanup") and | ||||||
|  | +  /* Check if the cleanup function is not on a deny list */
 | ||||||
|  | +  not exists(Attribute a | a = v.getAnAttribute() and a.getName() = "cleanup" | cleanupFunctionDenyList(a.getAnArgument().getValueText())) and
 | ||||||
|  |    /* The type of the variable is not stack-allocated. */ | ||||||
|  |    exists(Type t | t = v.getType() | not allocatedType(t)) | ||||||
|  |  } | ||||||
| @ -0,0 +1,96 @@ | |||||||
|  | From f9b19c9d4caaf870b30cce8a3d6be79eda099c4e Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
|  | Date: Sun, 5 Dec 2021 16:11:35 +0100 | ||||||
|  | Subject: [PATCH] lgtm: detect more possible problematic scenarios | ||||||
|  | 
 | ||||||
|  | 1) don't ignore stack-allocated variables, since they may hide | ||||||
|  |    heap-allocated stuff (compound types) | ||||||
|  | 2) check if there's a return between the variable declaration and its | ||||||
|  |    initialization; if so, treat the variable as uninitialized | ||||||
|  | 3) introduction of 2) increased the query runtime exponentially, so | ||||||
|  |    introduce some optimizations to bring it back to some reasonable | ||||||
|  |    values | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit c8fec8bf9b086f9fc7638db0f1a613a00d7c63a3) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .../UninitializedVariableWithCleanup.ql       | 48 ++++++++++--------- | ||||||
|  |  1 file changed, 25 insertions(+), 23 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | index 8c24b6d8f1..6b3b62f8bc 100644
 | ||||||
|  | --- a/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | +++ b/.lgtm/cpp-queries/UninitializedVariableWithCleanup.ql
 | ||||||
|  | @@ -16,24 +16,6 @@
 | ||||||
|  |  import cpp | ||||||
|  |  import semmle.code.cpp.controlflow.StackVariableReachability | ||||||
|  |   | ||||||
|  | -/**
 | ||||||
|  | - * Auxiliary predicate: Types that don't require initialization
 | ||||||
|  | - * before they are used, since they're stack-allocated.
 | ||||||
|  | - */
 | ||||||
|  | -predicate allocatedType(Type t) {
 | ||||||
|  | -  /* Arrays: "int foo[1]; foo[0] = 42;" is ok. */
 | ||||||
|  | -  t instanceof ArrayType
 | ||||||
|  | -  or
 | ||||||
|  | -  /* Structs: "struct foo bar; bar.baz = 42" is ok. */
 | ||||||
|  | -  t instanceof Class
 | ||||||
|  | -  or
 | ||||||
|  | -  /* Typedefs to other allocated types are fine. */
 | ||||||
|  | -  allocatedType(t.(TypedefType).getUnderlyingType())
 | ||||||
|  | -  or
 | ||||||
|  | -  /* Type specifiers don't affect whether or not a type is allocated. */
 | ||||||
|  | -  allocatedType(t.getUnspecifiedType())
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  |  /** Auxiliary predicate: List cleanup functions we want to explicitly ignore | ||||||
|  |    * since they don't do anything illegal even when the variable is uninitialized | ||||||
|  |    */ | ||||||
|  | @@ -47,13 +29,11 @@ predicate cleanupFunctionDenyList(string fun) {
 | ||||||
|  |   */ | ||||||
|  |  DeclStmt declWithNoInit(LocalVariable v) { | ||||||
|  |    result.getADeclaration() = v and | ||||||
|  | -  not exists(v.getInitializer()) and
 | ||||||
|  | +  not v.hasInitializer() and
 | ||||||
|  |    /* The variable has __attribute__((__cleanup__(...))) set */ | ||||||
|  |    v.getAnAttribute().hasName("cleanup") and | ||||||
|  |    /* Check if the cleanup function is not on a deny list */ | ||||||
|  | -  not exists(Attribute a | a = v.getAnAttribute() and a.getName() = "cleanup" | cleanupFunctionDenyList(a.getAnArgument().getValueText())) and
 | ||||||
|  | -  /* The type of the variable is not stack-allocated. */
 | ||||||
|  | -  exists(Type t | t = v.getType() | not allocatedType(t))
 | ||||||
|  | +  not cleanupFunctionDenyList(v.getAnAttribute().getAnArgument().getValueText())
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  class UninitialisedLocalReachability extends StackVariableReachability { | ||||||
|  | @@ -78,7 +58,29 @@ class UninitialisedLocalReachability extends StackVariableReachability {
 | ||||||
|  |    override predicate isBarrier(ControlFlowNode node, StackVariable v) { | ||||||
|  |      // only report the _first_ possibly uninitialized use | ||||||
|  |      useOfVar(v, node) or | ||||||
|  | -    definitionBarrier(v, node)
 | ||||||
|  | +    (
 | ||||||
|  | +      /* If there's an return statement somewhere between the variable declaration
 | ||||||
|  | +       * and a possible definition, don't accept is as a valid initialization.
 | ||||||
|  | +       *
 | ||||||
|  | +       * E.g.:
 | ||||||
|  | +       * _cleanup_free_ char *x;
 | ||||||
|  | +       * ...
 | ||||||
|  | +       * if (...)
 | ||||||
|  | +       *    return;
 | ||||||
|  | +       * ...
 | ||||||
|  | +       * x = malloc(...);
 | ||||||
|  | +       *
 | ||||||
|  | +       * is not a valid initialization, since we might return from the function
 | ||||||
|  | +       * _before_ the actual iniitialization (emphasis on _might_, since we
 | ||||||
|  | +       * don't know if the return statement might ever evaluate to true).
 | ||||||
|  | +       */
 | ||||||
|  | +      definitionBarrier(v, node) and
 | ||||||
|  | +      not exists(ReturnStmt rs |
 | ||||||
|  | +                 /* The attribute check is "just" a complexity optimization */
 | ||||||
|  | +                 v.getFunction() = rs.getEnclosingFunction() and v.getAnAttribute().hasName("cleanup") |
 | ||||||
|  | +                 rs.getLocation().isBefore(node.getLocation())
 | ||||||
|  | +      )
 | ||||||
|  | +    )
 | ||||||
|  |    } | ||||||
|  |  } | ||||||
|  |   | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | From 842c676a36abab0d92f1e68de2c8881fd00fdf4b Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
|  | Date: Tue, 30 Nov 2021 23:40:28 +0100 | ||||||
|  | Subject: [PATCH] lgtm: enable more (and potentially useful) queries | ||||||
|  | 
 | ||||||
|  | Not all available queries on LGTM are enabled by default, but some of | ||||||
|  | the excluded ones might come in handy, hence let's enable them | ||||||
|  | explicitly. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 38f36b9f3443b4d2085799c772e901a402b84af3) | ||||||
|  | 
 | ||||||
|  | Related: #2017033 | ||||||
|  | ---
 | ||||||
|  |  .lgtm.yml | 24 ++++++++++++++++++++++++ | ||||||
|  |  1 file changed, 24 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/.lgtm.yml b/.lgtm.yml
 | ||||||
|  | index 5948d8c2bc..fe93957b67 100644
 | ||||||
|  | --- a/.lgtm.yml
 | ||||||
|  | +++ b/.lgtm.yml
 | ||||||
|  | @@ -1,3 +1,27 @@
 | ||||||
|  | +---
 | ||||||
|  | +# vi: ts=2 sw=2 et:
 | ||||||
|  | +
 | ||||||
|  | +# Explicitly enable certain checks which are hidden by default
 | ||||||
|  | +queries:
 | ||||||
|  | +  - include: cpp/bad-strncpy-size
 | ||||||
|  | +  - include: cpp/declaration-hides-variable
 | ||||||
|  | +  - include: cpp/inconsistent-null-check
 | ||||||
|  | +  - include: cpp/mistyped-function-arguments
 | ||||||
|  | +  - include: cpp/nested-loops-with-same-variable
 | ||||||
|  | +  - include: cpp/sizeof-side-effect
 | ||||||
|  | +  - include: cpp/suspicious-pointer-scaling
 | ||||||
|  | +  - include: cpp/suspicious-pointer-scaling-void
 | ||||||
|  | +  - include: cpp/suspicious-sizeof
 | ||||||
|  | +  - include: cpp/unsafe-strcat
 | ||||||
|  | +  - include: cpp/unsafe-strncat
 | ||||||
|  | +  - include: cpp/unsigned-difference-expression-compared-zero
 | ||||||
|  | +  - include: cpp/unused-local-variable
 | ||||||
|  | +  - include:
 | ||||||
|  | +      tags:
 | ||||||
|  | +        - "security"
 | ||||||
|  | +        - "correctness"
 | ||||||
|  | +      severity: "error"
 | ||||||
|  | +
 | ||||||
|  |  extraction: | ||||||
|  |    cpp: | ||||||
|  |      prepare: | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 0e03f2192cd80e6a4a1bf83f0238cc6d133b8475 Mon Sep 17 00:00:00 2001 | From 4433c31a80c4477b0a0c503c74e8faebc44f4453 Mon Sep 17 00:00:00 2001 | ||||||
| From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
| Date: Thu, 7 Nov 2019 11:32:26 +0100 | Date: Thu, 7 Nov 2019 11:32:26 +0100 | ||||||
| Subject: [PATCH] meson: avoid bogus meson warning | Subject: [PATCH] meson: avoid bogus meson warning | ||||||
| @ -11,14 +11,12 @@ so meson shouldn't warn. But let's set avoid the warning and shorten things by | |||||||
| setting the final value immediately. | setting the final value immediately. | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit cbe804947482998cc767bfb0c169e6263a6ef097) | (cherry picked from commit cbe804947482998cc767bfb0c169e6263a6ef097) | ||||||
| 
 |  | ||||||
| Related: #2030027 |  | ||||||
| ---
 | ---
 | ||||||
|  src/test/meson.build | 5 ++--- |  src/test/meson.build | 5 ++--- | ||||||
|  1 file changed, 2 insertions(+), 3 deletions(-) |  1 file changed, 2 insertions(+), 3 deletions(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/src/test/meson.build b/src/test/meson.build
 | diff --git a/src/test/meson.build b/src/test/meson.build
 | ||||||
| index 7b310d4ec7..4bbc67d367 100644
 | index 40cf56d73d..6eaa62e53f 100644
 | ||||||
| --- a/src/test/meson.build
 | --- a/src/test/meson.build
 | ||||||
| +++ b/src/test/meson.build
 | +++ b/src/test/meson.build
 | ||||||
| @@ -10,12 +10,11 @@ test_hashmap_ordered_c = custom_target(
 | @@ -10,12 +10,11 @@ test_hashmap_ordered_c = custom_target(
 | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From a423abe6a3914364c36d4299c1b770fdbe376834 Mon Sep 17 00:00:00 2001 | From de7125dcfe6d6c8af05262ab786f9fe7cbf15113 Mon Sep 17 00:00:00 2001 | ||||||
| From: Frantisek Sumsal <frantisek@sumsal.cz> | From: Frantisek Sumsal <frantisek@sumsal.cz> | ||||||
| Date: Wed, 15 Dec 2021 12:15:19 +0100 | Date: Wed, 15 Dec 2021 12:15:19 +0100 | ||||||
| Subject: [PATCH] test: make TEST-47 less racy | Subject: [PATCH] test: make TEST-47 less racy | ||||||
| @ -8,9 +8,7 @@ Based on: | |||||||
|   - e00e2e0b50bbd120290572c8d1242703fb98b34e |   - e00e2e0b50bbd120290572c8d1242703fb98b34e | ||||||
|   - 197298ff9fc930de450330095cc5b67d165d0801 |   - 197298ff9fc930de450330095cc5b67d165d0801 | ||||||
| 
 | 
 | ||||||
| Related: #2039327 | Related: #2017033 | ||||||
| 
 |  | ||||||
| (cherry picked from commit de7125dcfe6d6c8af05262ab786f9fe7cbf15113) |  | ||||||
| ---
 | ---
 | ||||||
|  test/TEST-47-ISSUE-14566/testsuite.sh | 2 ++ |  test/TEST-47-ISSUE-14566/testsuite.sh | 2 ++ | ||||||
|  1 file changed, 2 insertions(+) |  1 file changed, 2 insertions(+) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From f1f0eb4d262e91830324de3f99fa58cd154a7876 Mon Sep 17 00:00:00 2001 | From 894d307d0d149adb46e630550566e5a3f6ff8d2e Mon Sep 17 00:00:00 2001 | ||||||
| From: Lennart Poettering <lennart@poettering.net> | From: Lennart Poettering <lennart@poettering.net> | ||||||
| Date: Mon, 18 Mar 2019 12:21:27 +0100 | Date: Mon, 18 Mar 2019 12:21:27 +0100 | ||||||
| Subject: [PATCH] core: rename unit_{start_limit|condition|assert}_test() to | Subject: [PATCH] core: rename unit_{start_limit|condition|assert}_test() to | ||||||
| @ -11,7 +11,7 @@ various things, hence let's streamline the naming a bit. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 97a3f4ee052e1b8a0ff03accfa478e352891a84f) | (cherry picked from commit 97a3f4ee052e1b8a0ff03accfa478e352891a84f) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| ---
 | ---
 | ||||||
|  src/core/automount.c |  2 +- |  src/core/automount.c |  2 +- | ||||||
|  src/core/mount.c     |  2 +- |  src/core/mount.c     |  2 +- | ||||||
| @ -38,7 +38,7 @@ index 76e70f4dac..2bc160cb07 100644 | |||||||
|                  automount_enter_dead(a, AUTOMOUNT_FAILURE_START_LIMIT_HIT); |                  automount_enter_dead(a, AUTOMOUNT_FAILURE_START_LIMIT_HIT); | ||||||
|                  return r; |                  return r; | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index 9b1c59b1c3..4cb49d845d 100644
 | index 7e80a0c974..aa586d88cb 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1065,7 +1065,7 @@ static int mount_start(Unit *u) {
 | @@ -1065,7 +1065,7 @@ static int mount_start(Unit *u) {
 | ||||||
| @ -64,10 +64,10 @@ index ed40bc6c19..4bccc0396b 100644 | |||||||
|                  path_enter_dead(p, PATH_FAILURE_START_LIMIT_HIT); |                  path_enter_dead(p, PATH_FAILURE_START_LIMIT_HIT); | ||||||
|                  return r; |                  return r; | ||||||
| diff --git a/src/core/service.c b/src/core/service.c
 | diff --git a/src/core/service.c b/src/core/service.c
 | ||||||
| index 5e3e75b5ae..01cb1a375e 100644
 | index 7969bbf071..1a1de43d0d 100644
 | ||||||
| --- a/src/core/service.c
 | --- a/src/core/service.c
 | ||||||
| +++ b/src/core/service.c
 | +++ b/src/core/service.c
 | ||||||
| @@ -2357,7 +2357,7 @@ static int service_start(Unit *u) {
 | @@ -2388,7 +2388,7 @@ static int service_start(Unit *u) {
 | ||||||
|          assert(IN_SET(s->state, SERVICE_DEAD, SERVICE_FAILED)); |          assert(IN_SET(s->state, SERVICE_DEAD, SERVICE_FAILED)); | ||||||
|   |   | ||||||
|          /* Make sure we don't enter a busy loop of some kind. */ |          /* Make sure we don't enter a busy loop of some kind. */ | ||||||
| @ -116,7 +116,7 @@ index 1718ffc5a5..be16321296 100644 | |||||||
|                  timer_enter_dead(t, TIMER_FAILURE_START_LIMIT_HIT); |                  timer_enter_dead(t, TIMER_FAILURE_START_LIMIT_HIT); | ||||||
|                  return r; |                  return r; | ||||||
| diff --git a/src/core/unit.c b/src/core/unit.c
 | diff --git a/src/core/unit.c b/src/core/unit.c
 | ||||||
| index 152a860d08..fa94a67fdd 100644
 | index 23afa24c77..9013186d8a 100644
 | ||||||
| --- a/src/core/unit.c
 | --- a/src/core/unit.c
 | ||||||
| +++ b/src/core/unit.c
 | +++ b/src/core/unit.c
 | ||||||
| @@ -1633,7 +1633,7 @@ static bool unit_condition_test_list(Unit *u, Condition *first, const char *(*to
 | @@ -1633,7 +1633,7 @@ static bool unit_condition_test_list(Unit *u, Condition *first, const char *(*to
 | ||||||
| @ -147,7 +147,7 @@ index 152a860d08..fa94a67fdd 100644 | |||||||
|          assert(u); |          assert(u); | ||||||
|   |   | ||||||
|          if (ratelimit_below(&u->start_limit)) { |          if (ratelimit_below(&u->start_limit)) { | ||||||
| @@ -1748,14 +1747,14 @@ int unit_start(Unit *u) {
 | @@ -1750,14 +1749,14 @@ int unit_start(Unit *u) {
 | ||||||
|           * speed up activation in case there is some hold-off time, |           * speed up activation in case there is some hold-off time, | ||||||
|           * but we don't want to recheck the condition in that case. */ |           * but we don't want to recheck the condition in that case. */ | ||||||
|          if (state != UNIT_ACTIVATING && |          if (state != UNIT_ACTIVATING && | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 6f3b6308bb5705fdcadec3f4cac105211bc0a3e2 Mon Sep 17 00:00:00 2001 | From 471eda89a25a3ceac91a2d05e39a54aae78038ed Mon Sep 17 00:00:00 2001 | ||||||
| From: Daan De Meyer <daan.j.demeyer@gmail.com> | From: Daan De Meyer <daan.j.demeyer@gmail.com> | ||||||
| Date: Tue, 24 Aug 2021 16:46:47 +0100 | Date: Tue, 24 Aug 2021 16:46:47 +0100 | ||||||
| Subject: [PATCH] core: Check unit start rate limiting earlier | Subject: [PATCH] core: Check unit start rate limiting earlier | ||||||
| @ -16,7 +16,7 @@ earlier on. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 9727f2427ff6b2e1f4ab927cc57ad8e888f04e95) | (cherry picked from commit 9727f2427ff6b2e1f4ab927cc57ad8e888f04e95) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| 
 | 
 | ||||||
| [msekleta: I've deleted part of the original commit that adds test for | [msekleta: I've deleted part of the original commit that adds test for | ||||||
| issue #17433. This was necessary because upstream commit assumes newer | issue #17433. This was necessary because upstream commit assumes newer | ||||||
| @ -82,7 +82,7 @@ index 2bc160cb07..5e16adabb5 100644 | |||||||
| +        .test_start_limit = automount_test_start_limit,
 | +        .test_start_limit = automount_test_start_limit,
 | ||||||
|  }; |  }; | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index 4cb49d845d..619f64d5b7 100644
 | index aa586d88cb..22848847e5 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1065,12 +1065,6 @@ static int mount_start(Unit *u) {
 | @@ -1065,12 +1065,6 @@ static int mount_start(Unit *u) {
 | ||||||
| @ -98,7 +98,7 @@ index 4cb49d845d..619f64d5b7 100644 | |||||||
|          r = unit_acquire_invocation_id(u); |          r = unit_acquire_invocation_id(u); | ||||||
|          if (r < 0) |          if (r < 0) | ||||||
|                  return r; |                  return r; | ||||||
| @@ -1953,6 +1947,21 @@ static int mount_control_pid(Unit *u) {
 | @@ -1957,6 +1951,21 @@ static int mount_control_pid(Unit *u) {
 | ||||||
|          return m->control_pid; |          return m->control_pid; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @ -120,7 +120,7 @@ index 4cb49d845d..619f64d5b7 100644 | |||||||
|  static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = { |  static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = { | ||||||
|          [MOUNT_EXEC_MOUNT] = "ExecMount", |          [MOUNT_EXEC_MOUNT] = "ExecMount", | ||||||
|          [MOUNT_EXEC_UNMOUNT] = "ExecUnmount", |          [MOUNT_EXEC_UNMOUNT] = "ExecUnmount", | ||||||
| @@ -2044,4 +2053,6 @@ const UnitVTable mount_vtable = {
 | @@ -2048,4 +2057,6 @@ const UnitVTable mount_vtable = {
 | ||||||
|                          [JOB_TIMEOUT]    = "Timed out unmounting %s.", |                          [JOB_TIMEOUT]    = "Timed out unmounting %s.", | ||||||
|                  }, |                  }, | ||||||
|          }, |          }, | ||||||
| @ -174,10 +174,10 @@ index 4bccc0396b..1e69a1f05f 100644 | |||||||
| +        .test_start_limit = path_test_start_limit,
 | +        .test_start_limit = path_test_start_limit,
 | ||||||
|  }; |  }; | ||||||
| diff --git a/src/core/service.c b/src/core/service.c
 | diff --git a/src/core/service.c b/src/core/service.c
 | ||||||
| index 01cb1a375e..a21d98ab8f 100644
 | index 1a1de43d0d..c5f408d817 100644
 | ||||||
| --- a/src/core/service.c
 | --- a/src/core/service.c
 | ||||||
| +++ b/src/core/service.c
 | +++ b/src/core/service.c
 | ||||||
| @@ -2356,13 +2356,6 @@ static int service_start(Unit *u) {
 | @@ -2387,13 +2387,6 @@ static int service_start(Unit *u) {
 | ||||||
|   |   | ||||||
|          assert(IN_SET(s->state, SERVICE_DEAD, SERVICE_FAILED)); |          assert(IN_SET(s->state, SERVICE_DEAD, SERVICE_FAILED)); | ||||||
|   |   | ||||||
| @ -191,7 +191,7 @@ index 01cb1a375e..a21d98ab8f 100644 | |||||||
|          r = unit_acquire_invocation_id(u); |          r = unit_acquire_invocation_id(u); | ||||||
|          if (r < 0) |          if (r < 0) | ||||||
|                  return r; |                  return r; | ||||||
| @@ -4050,6 +4043,22 @@ static bool service_needs_console(Unit *u) {
 | @@ -4081,6 +4074,22 @@ static bool service_needs_console(Unit *u) {
 | ||||||
|                        SERVICE_FINAL_SIGKILL); |                        SERVICE_FINAL_SIGKILL); | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @ -214,7 +214,7 @@ index 01cb1a375e..a21d98ab8f 100644 | |||||||
|  static const char* const service_restart_table[_SERVICE_RESTART_MAX] = { |  static const char* const service_restart_table[_SERVICE_RESTART_MAX] = { | ||||||
|          [SERVICE_RESTART_NO] = "no", |          [SERVICE_RESTART_NO] = "no", | ||||||
|          [SERVICE_RESTART_ON_SUCCESS] = "on-success", |          [SERVICE_RESTART_ON_SUCCESS] = "on-success", | ||||||
| @@ -4191,4 +4200,6 @@ const UnitVTable service_vtable = {
 | @@ -4222,4 +4231,6 @@ const UnitVTable service_vtable = {
 | ||||||
|                          [JOB_FAILED]     = "Stopped (with error) %s.", |                          [JOB_FAILED]     = "Stopped (with error) %s.", | ||||||
|                  }, |                  }, | ||||||
|          }, |          }, | ||||||
| @ -359,10 +359,10 @@ index be16321296..fb9ae17990 100644 | |||||||
| +        .test_start_limit = timer_test_start_limit,
 | +        .test_start_limit = timer_test_start_limit,
 | ||||||
|  }; |  }; | ||||||
| diff --git a/src/core/unit.c b/src/core/unit.c
 | diff --git a/src/core/unit.c b/src/core/unit.c
 | ||||||
| index fa94a67fdd..9005f79df3 100644
 | index 9013186d8a..f0df7452fa 100644
 | ||||||
| --- a/src/core/unit.c
 | --- a/src/core/unit.c
 | ||||||
| +++ b/src/core/unit.c
 | +++ b/src/core/unit.c
 | ||||||
| @@ -1726,10 +1726,16 @@ int unit_start(Unit *u) {
 | @@ -1728,10 +1728,16 @@ int unit_start(Unit *u) {
 | ||||||
|   |   | ||||||
|          assert(u); |          assert(u); | ||||||
|   |   | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 5f2ee8632f15a8978c522de6789777171e898671 Mon Sep 17 00:00:00 2001 | From 51210a849ea7f163a1760de989756206c01dd758 Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Mon, 4 Oct 2021 19:44:06 +0200 | Date: Mon, 4 Oct 2021 19:44:06 +0200 | ||||||
| Subject: [PATCH] sd-event: introduce callback invoked when event source | Subject: [PATCH] sd-event: introduce callback invoked when event source | ||||||
| @ -6,7 +6,7 @@ Subject: [PATCH] sd-event: introduce callback invoked when event source | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit fd69f2247520b0be3190ded96d646a415edc97b7) | (cherry picked from commit fd69f2247520b0be3190ded96d646a415edc97b7) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/libsystemd.sym        |  5 +++ |  src/libsystemd/libsystemd.sym        |  5 +++ | ||||||
|  src/libsystemd/sd-event/sd-event.c   | 61 +++++++++++++++++++++++----- |  src/libsystemd/sd-event/sd-event.c   | 61 +++++++++++++++++++++++----- | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From c08bb8f464ff4d27fbf762d19d28fe92955a668d Mon Sep 17 00:00:00 2001 | From 3674514b7220a136dcfd464c205d41609f0c99a7 Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Mon, 4 Oct 2021 17:51:52 +0200 | Date: Mon, 4 Oct 2021 17:51:52 +0200 | ||||||
| Subject: [PATCH] core: rename/generalize UNIT(u)->test_start_limit() hook | Subject: [PATCH] core: rename/generalize UNIT(u)->test_start_limit() hook | ||||||
| @ -15,7 +15,7 @@ the virtual function that implements the check. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 705578c3b9d794097233aa66010cf67b2a444716) | (cherry picked from commit 705578c3b9d794097233aa66010cf67b2a444716) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| ---
 | ---
 | ||||||
|  src/core/automount.c | 6 +++--- |  src/core/automount.c | 6 +++--- | ||||||
|  src/core/mount.c     | 6 +++--- |  src/core/mount.c     | 6 +++--- | ||||||
| @ -58,10 +58,10 @@ index 5e16adabb5..f212620c8f 100644 | |||||||
| +        .can_start = automount_can_start,
 | +        .can_start = automount_can_start,
 | ||||||
|  }; |  }; | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index 619f64d5b7..72341fe685 100644
 | index 22848847e5..032a2ca156 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1947,7 +1947,7 @@ static int mount_control_pid(Unit *u) {
 | @@ -1951,7 +1951,7 @@ static int mount_control_pid(Unit *u) {
 | ||||||
|          return m->control_pid; |          return m->control_pid; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @ -70,7 +70,7 @@ index 619f64d5b7..72341fe685 100644 | |||||||
|          Mount *m = MOUNT(u); |          Mount *m = MOUNT(u); | ||||||
|          int r; |          int r; | ||||||
|   |   | ||||||
| @@ -1959,7 +1959,7 @@ static int mount_test_start_limit(Unit *u) {
 | @@ -1963,7 +1963,7 @@ static int mount_test_start_limit(Unit *u) {
 | ||||||
|                  return r; |                  return r; | ||||||
|          } |          } | ||||||
|   |   | ||||||
| @ -79,7 +79,7 @@ index 619f64d5b7..72341fe685 100644 | |||||||
|  } |  } | ||||||
|   |   | ||||||
|  static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = { |  static const char* const mount_exec_command_table[_MOUNT_EXEC_COMMAND_MAX] = { | ||||||
| @@ -2054,5 +2054,5 @@ const UnitVTable mount_vtable = {
 | @@ -2058,5 +2058,5 @@ const UnitVTable mount_vtable = {
 | ||||||
|                  }, |                  }, | ||||||
|          }, |          }, | ||||||
|   |   | ||||||
| @ -116,10 +116,10 @@ index 1e69a1f05f..58f490589d 100644 | |||||||
| +        .can_start = path_can_start,
 | +        .can_start = path_can_start,
 | ||||||
|  }; |  }; | ||||||
| diff --git a/src/core/service.c b/src/core/service.c
 | diff --git a/src/core/service.c b/src/core/service.c
 | ||||||
| index a21d98ab8f..2b7e85d3eb 100644
 | index c5f408d817..e8ae1a5772 100644
 | ||||||
| --- a/src/core/service.c
 | --- a/src/core/service.c
 | ||||||
| +++ b/src/core/service.c
 | +++ b/src/core/service.c
 | ||||||
| @@ -4043,7 +4043,7 @@ static bool service_needs_console(Unit *u) {
 | @@ -4074,7 +4074,7 @@ static bool service_needs_console(Unit *u) {
 | ||||||
|                        SERVICE_FINAL_SIGKILL); |                        SERVICE_FINAL_SIGKILL); | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @ -128,7 +128,7 @@ index a21d98ab8f..2b7e85d3eb 100644 | |||||||
|          Service *s = SERVICE(u); |          Service *s = SERVICE(u); | ||||||
|          int r; |          int r; | ||||||
|   |   | ||||||
| @@ -4056,7 +4056,7 @@ static int service_test_start_limit(Unit *u) {
 | @@ -4087,7 +4087,7 @@ static int service_test_start_limit(Unit *u) {
 | ||||||
|                  return r; |                  return r; | ||||||
|          } |          } | ||||||
|   |   | ||||||
| @ -137,7 +137,7 @@ index a21d98ab8f..2b7e85d3eb 100644 | |||||||
|  } |  } | ||||||
|   |   | ||||||
|  static const char* const service_restart_table[_SERVICE_RESTART_MAX] = { |  static const char* const service_restart_table[_SERVICE_RESTART_MAX] = { | ||||||
| @@ -4201,5 +4201,5 @@ const UnitVTable service_vtable = {
 | @@ -4232,5 +4232,5 @@ const UnitVTable service_vtable = {
 | ||||||
|                  }, |                  }, | ||||||
|          }, |          }, | ||||||
|   |   | ||||||
| @ -232,10 +232,10 @@ index fb9ae17990..684180bf99 100644 | |||||||
| +        .can_start = timer_can_start,
 | +        .can_start = timer_can_start,
 | ||||||
|  }; |  }; | ||||||
| diff --git a/src/core/unit.c b/src/core/unit.c
 | diff --git a/src/core/unit.c b/src/core/unit.c
 | ||||||
| index 9005f79df3..bd0a6bb7cc 100644
 | index f0df7452fa..4de218feac 100644
 | ||||||
| --- a/src/core/unit.c
 | --- a/src/core/unit.c
 | ||||||
| +++ b/src/core/unit.c
 | +++ b/src/core/unit.c
 | ||||||
| @@ -1726,9 +1726,9 @@ int unit_start(Unit *u) {
 | @@ -1728,9 +1728,9 @@ int unit_start(Unit *u) {
 | ||||||
|   |   | ||||||
|          assert(u); |          assert(u); | ||||||
|   |   | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From faaac88f0686066e0b930952f12010f6d93fd6cf Mon Sep 17 00:00:00 2001 | From cb519c7d769851ee5e24c797fc04eaa13383c674 Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Mon, 4 Oct 2021 19:41:34 +0200 | Date: Mon, 4 Oct 2021 19:41:34 +0200 | ||||||
| Subject: [PATCH] mount: make mount units start jobs not runnable if | Subject: [PATCH] mount: make mount units start jobs not runnable if | ||||||
| @ -6,16 +6,16 @@ Subject: [PATCH] mount: make mount units start jobs not runnable if | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit a7c93dfe91e88a5a561341c523a45c7f8d71a588) | (cherry picked from commit a7c93dfe91e88a5a561341c523a45c7f8d71a588) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| ---
 | ---
 | ||||||
|  src/core/mount.c | 3 +++ |  src/core/mount.c | 3 +++ | ||||||
|  1 file changed, 3 insertions(+) |  1 file changed, 3 insertions(+) | ||||||
| 
 | 
 | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index 72341fe685..dbac1b7cb1 100644
 | index 032a2ca156..ab09e6fbb0 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1953,6 +1953,9 @@ static int mount_can_start(Unit *u) {
 | @@ -1957,6 +1957,9 @@ static int mount_can_start(Unit *u) {
 | ||||||
|   |   | ||||||
|          assert(m); |          assert(m); | ||||||
|   |   | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 0b28134258e40b2fc054326175317db65c23bcd6 Mon Sep 17 00:00:00 2001 | From b0c226e9fd3e6bfa5388832cc2745d9ec935f3ec Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Mon, 4 Oct 2021 20:31:49 +0200 | Date: Mon, 4 Oct 2021 20:31:49 +0200 | ||||||
| Subject: [PATCH] mount: retrigger run queue after ratelimit expired to run | Subject: [PATCH] mount: retrigger run queue after ratelimit expired to run | ||||||
| @ -8,16 +8,16 @@ Fixes #20329 | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit edc027b4f1cfaa49e8ecdde763eb8c623402d464) | (cherry picked from commit edc027b4f1cfaa49e8ecdde763eb8c623402d464) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| ---
 | ---
 | ||||||
|  src/core/mount.c | 21 +++++++++++++++++++++ |  src/core/mount.c | 21 +++++++++++++++++++++ | ||||||
|  1 file changed, 21 insertions(+) |  1 file changed, 21 insertions(+) | ||||||
| 
 | 
 | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index dbac1b7cb1..c05779343c 100644
 | index ab09e6fbb0..bdba9e6884 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1706,6 +1706,21 @@ static bool mount_is_mounted(Mount *m) {
 | @@ -1710,6 +1710,21 @@ static bool mount_is_mounted(Mount *m) {
 | ||||||
|          return UNIT(m)->perpetual || m->is_mounted; |          return UNIT(m)->perpetual || m->is_mounted; | ||||||
|  } |  } | ||||||
|   |   | ||||||
| @ -39,7 +39,7 @@ index dbac1b7cb1..c05779343c 100644 | |||||||
|  static void mount_enumerate(Manager *m) { |  static void mount_enumerate(Manager *m) { | ||||||
|          int r; |          int r; | ||||||
|   |   | ||||||
| @@ -1759,6 +1774,12 @@ static void mount_enumerate(Manager *m) {
 | @@ -1763,6 +1778,12 @@ static void mount_enumerate(Manager *m) {
 | ||||||
|                          goto fail; |                          goto fail; | ||||||
|                  } |                  } | ||||||
|   |   | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 567c8855016ee5e7641d6c5f1ed84badd9fae10d Mon Sep 17 00:00:00 2001 | From 5a218b6820be7ffaf21cd42cd4c96b47d18442ee Mon Sep 17 00:00:00 2001 | ||||||
| From: Lennart Poettering <lennart@poettering.net> | From: Lennart Poettering <lennart@poettering.net> | ||||||
| Date: Fri, 12 Nov 2021 09:43:07 +0100 | Date: Fri, 12 Nov 2021 09:43:07 +0100 | ||||||
| Subject: [PATCH] pid1: add a manager_trigger_run_queue() helper | Subject: [PATCH] pid1: add a manager_trigger_run_queue() helper | ||||||
| @ -11,7 +11,7 @@ Follow-up for #20953 | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit b0c4b2824693fe6a27ea9439ec7a6328a0e23704) | (cherry picked from commit b0c4b2824693fe6a27ea9439ec7a6328a0e23704) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| ---
 | ---
 | ||||||
|  src/core/job.c     |  5 ++--- |  src/core/job.c     |  5 ++--- | ||||||
|  src/core/manager.c | 12 ++++++++++++ |  src/core/manager.c | 12 ++++++++++++ | ||||||
| @ -20,10 +20,10 @@ Related: #2037395 | |||||||
|  4 files changed, 19 insertions(+), 9 deletions(-) |  4 files changed, 19 insertions(+), 9 deletions(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/src/core/job.c b/src/core/job.c
 | diff --git a/src/core/job.c b/src/core/job.c
 | ||||||
| index 870ec0a387..cc6e1ee65a 100644
 | index 43ab55ed18..55f36b928f 100644
 | ||||||
| --- a/src/core/job.c
 | --- a/src/core/job.c
 | ||||||
| +++ b/src/core/job.c
 | +++ b/src/core/job.c
 | ||||||
| @@ -1137,11 +1137,10 @@ void job_add_to_run_queue(Job *j) {
 | @@ -1139,11 +1139,10 @@ void job_add_to_run_queue(Job *j) {
 | ||||||
|          if (j->in_run_queue) |          if (j->in_run_queue) | ||||||
|                  return; |                  return; | ||||||
|   |   | ||||||
| @ -38,7 +38,7 @@ index 870ec0a387..cc6e1ee65a 100644 | |||||||
|   |   | ||||||
|  void job_add_to_dbus_queue(Job *j) { |  void job_add_to_dbus_queue(Job *j) { | ||||||
| diff --git a/src/core/manager.c b/src/core/manager.c
 | diff --git a/src/core/manager.c b/src/core/manager.c
 | ||||||
| index 3c44ad3dbc..ae6ce35d99 100644
 | index ee976f70b3..845c26f498 100644
 | ||||||
| --- a/src/core/manager.c
 | --- a/src/core/manager.c
 | ||||||
| +++ b/src/core/manager.c
 | +++ b/src/core/manager.c
 | ||||||
| @@ -2120,6 +2120,18 @@ static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
 | @@ -2120,6 +2120,18 @@ static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) {
 | ||||||
| @ -74,10 +74,10 @@ index c4b8e80093..7b572c8dfd 100644 | |||||||
|   |   | ||||||
|  int manager_open_serialization(Manager *m, FILE **_f); |  int manager_open_serialization(Manager *m, FILE **_f); | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index c05779343c..9ff7c71edd 100644
 | index bdba9e6884..c17154cde1 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1708,15 +1708,12 @@ static bool mount_is_mounted(Mount *m) {
 | @@ -1712,15 +1712,12 @@ static bool mount_is_mounted(Mount *m) {
 | ||||||
|   |   | ||||||
|  static int mount_on_ratelimit_expire(sd_event_source *s, void *userdata) { |  static int mount_on_ratelimit_expire(sd_event_source *s, void *userdata) { | ||||||
|          Manager *m = userdata; |          Manager *m = userdata; | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From a9a25019ea307741d7d42178ac0f47a2320f8e94 Mon Sep 17 00:00:00 2001 | From dd662fc39a28655b89619a828a15e5e457bf6f4c Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Thu, 25 Nov 2021 18:28:25 +0100 | Date: Thu, 25 Nov 2021 18:28:25 +0100 | ||||||
| Subject: [PATCH] unit: add jobs that were skipped because of ratelimit back to | Subject: [PATCH] unit: add jobs that were skipped because of ratelimit back to | ||||||
| @ -15,16 +15,16 @@ Fixes #21458 | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit c29e6a9530316823b0455cd83eb6d0bb8dd664f4) | (cherry picked from commit c29e6a9530316823b0455cd83eb6d0bb8dd664f4) | ||||||
| 
 | 
 | ||||||
| Related: #2037395 | Related: #2036608 | ||||||
| ---
 | ---
 | ||||||
|  src/core/mount.c | 10 ++++++++++ |  src/core/mount.c | 10 ++++++++++ | ||||||
|  1 file changed, 10 insertions(+) |  1 file changed, 10 insertions(+) | ||||||
| 
 | 
 | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index 9ff7c71edd..4e0a4f238a 100644
 | index c17154cde1..691b23ca74 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1708,9 +1708,19 @@ static bool mount_is_mounted(Mount *m) {
 | @@ -1712,9 +1712,19 @@ static bool mount_is_mounted(Mount *m) {
 | ||||||
|   |   | ||||||
|  static int mount_on_ratelimit_expire(sd_event_source *s, void *userdata) { |  static int mount_on_ratelimit_expire(sd_event_source *s, void *userdata) { | ||||||
|          Manager *m = userdata; |          Manager *m = userdata; | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | From 54faef034bb2062ed8afa72e2c1be40ef7cc41c5 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Fri, 26 Jul 2019 09:25:09 +0200 | ||||||
|  | Subject: [PATCH] Revert "Revert "sysctl: Enable ping(8) inside rootless Podman | ||||||
|  |  containers"" | ||||||
|  | 
 | ||||||
|  | This reverts commit be74f51605b4c7cb74fec3a50cd13b67598a8ac1. | ||||||
|  | 
 | ||||||
|  | Let's add this again. With the new sysctl "-" thing we can make this | ||||||
|  | work. | ||||||
|  | 
 | ||||||
|  | Resolves: #2037807 | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 0338934f4bcda6a96a5342449ae96b003de3378d) | ||||||
|  | ---
 | ||||||
|  |  sysctl.d/50-default.conf | 8 ++++++++ | ||||||
|  |  1 file changed, 8 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
 | ||||||
|  | index e0afc9c702..21ae1df13d 100644
 | ||||||
|  | --- a/sysctl.d/50-default.conf
 | ||||||
|  | +++ b/sysctl.d/50-default.conf
 | ||||||
|  | @@ -33,6 +33,14 @@ net.ipv4.conf.all.accept_source_route = 0
 | ||||||
|  |  # Promote secondary addresses when the primary address is removed | ||||||
|  |  net.ipv4.conf.all.promote_secondaries = 1 | ||||||
|  |   | ||||||
|  | +# ping(8) without CAP_NET_ADMIN and CAP_NET_RAW
 | ||||||
|  | +# The upper limit is set to 2^31-1. Values greater than that get rejected by
 | ||||||
|  | +# the kernel because of this definition in linux/include/net/ping.h:
 | ||||||
|  | +#   #define GID_T_MAX (((gid_t)~0U) >> 1)
 | ||||||
|  | +# That's not so bad because values between 2^31 and 2^32-1 are reserved on
 | ||||||
|  | +# systemd-based systems anyway: https://systemd.io/UIDS-GIDS.html#summary
 | ||||||
|  | +net.ipv4.ping_group_range = 0 2147483647
 | ||||||
|  | +
 | ||||||
|  |  # Fair Queue CoDel packet scheduler to fight bufferbloat | ||||||
|  |  net.core.default_qdisc = fq_codel | ||||||
|  |   | ||||||
| @ -0,0 +1,27 @@ | |||||||
|  | From 41a32aeaf5d33f253f48bfbe8d00de9d160985f7 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Fri, 26 Jul 2019 09:26:07 +0200 | ||||||
|  | Subject: [PATCH] sysctl: prefix ping port range setting with a dash | ||||||
|  | 
 | ||||||
|  | Fixes: #13177 | ||||||
|  | 
 | ||||||
|  | Resolves: #2037807 | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 000500c9d6347e0e2cdb92ec48fa10c0bb3ceca8) | ||||||
|  | ---
 | ||||||
|  |  sysctl.d/50-default.conf | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/sysctl.d/50-default.conf b/sysctl.d/50-default.conf
 | ||||||
|  | index 21ae1df13d..5156d55ca9 100644
 | ||||||
|  | --- a/sysctl.d/50-default.conf
 | ||||||
|  | +++ b/sysctl.d/50-default.conf
 | ||||||
|  | @@ -39,7 +39,7 @@ net.ipv4.conf.all.promote_secondaries = 1
 | ||||||
|  |  #   #define GID_T_MAX (((gid_t)~0U) >> 1) | ||||||
|  |  # That's not so bad because values between 2^31 and 2^32-1 are reserved on | ||||||
|  |  # systemd-based systems anyway: https://systemd.io/UIDS-GIDS.html#summary | ||||||
|  | -net.ipv4.ping_group_range = 0 2147483647
 | ||||||
|  | +-net.ipv4.ping_group_range = 0 2147483647
 | ||||||
|  |   | ||||||
|  |  # Fair Queue CoDel packet scheduler to fight bufferbloat | ||||||
|  |  net.core.default_qdisc = fq_codel | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 4662575605089b38d611a911c03c60ec260fde05 Mon Sep 17 00:00:00 2001 | From c236734f95550747c4979fe318e3a890adaa0a94 Mon Sep 17 00:00:00 2001 | ||||||
| From: Lennart Poettering <lennart@poettering.net> | From: Lennart Poettering <lennart@poettering.net> | ||||||
| Date: Wed, 28 Nov 2018 12:41:44 +0100 | Date: Wed, 28 Nov 2018 12:41:44 +0100 | ||||||
| Subject: [PATCH] mount: don't propagate errors from mount_setup_unit() further | Subject: [PATCH] mount: don't propagate errors from mount_setup_unit() further | ||||||
| @ -10,18 +10,23 @@ further processing of mount units. Let's keep these failures local. | |||||||
| 
 | 
 | ||||||
| Fixes: #10874 | Fixes: #10874 | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit ba0d56f55f2073164799be714b5bd1aad94d059a) | Cherry picked from commit ba0d56f55f2073164799be714b5bd1aad94d059a. | ||||||
|  | Trivial conflict in src/core/mount.c, function mount_load_proc_self_mountinfo, | ||||||
|  | due to local commit ca634baa10e. Also, due to the same commit, int k | ||||||
|  | is no longer used and is thus removed. | ||||||
| 
 | 
 | ||||||
| Resolves: #2039327 | Resolves: #2036853 | ||||||
|  | 
 | ||||||
|  | Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com> | ||||||
| ---
 | ---
 | ||||||
|  src/core/mount.c | 8 ++------ |  src/core/mount.c | 8 ++------ | ||||||
|  1 file changed, 2 insertions(+), 6 deletions(-) |  1 file changed, 2 insertions(+), 6 deletions(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/src/core/mount.c b/src/core/mount.c
 | diff --git a/src/core/mount.c b/src/core/mount.c
 | ||||||
| index 7e80a0c974..9b1c59b1c3 100644
 | index 691b23ca74..4e0a4f238a 100644
 | ||||||
| --- a/src/core/mount.c
 | --- a/src/core/mount.c
 | ||||||
| +++ b/src/core/mount.c
 | +++ b/src/core/mount.c
 | ||||||
| @@ -1621,12 +1621,10 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
 | @@ -1615,12 +1615,10 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
 | ||||||
|          if (r < 0) |          if (r < 0) | ||||||
|                  return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m"); |                  return log_error_errno(r, "Failed to parse /proc/self/mountinfo: %m"); | ||||||
|   |   | ||||||
| @ -34,7 +39,7 @@ index 7e80a0c974..9b1c59b1c3 100644 | |||||||
|   |   | ||||||
|                  r = mnt_table_next_fs(table, iter, &fs); |                  r = mnt_table_next_fs(table, iter, &fs); | ||||||
|                  if (r == 1) |                  if (r == 1) | ||||||
| @@ -1650,12 +1648,10 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
 | @@ -1644,12 +1642,10 @@ static int mount_load_proc_self_mountinfo(Manager *m, bool set_flags) {
 | ||||||
|   |   | ||||||
|                  device_found_node(m, d, DEVICE_FOUND_MOUNT, DEVICE_FOUND_MOUNT); |                  device_found_node(m, d, DEVICE_FOUND_MOUNT, DEVICE_FOUND_MOUNT); | ||||||
|   |   | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From 6882d94ae68468b414597696727108d588402f43 Mon Sep 17 00:00:00 2001 | From d45e0cc7a64648dc3ad082b512ff488537d3ebef Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Wed, 12 Jan 2022 15:35:19 +0100 | Date: Wed, 12 Jan 2022 15:35:19 +0100 | ||||||
| Subject: [PATCH] udev/net_id: introduce naming scheme for RHEL-8.5 | Subject: [PATCH] udev/net_id: introduce naming scheme for RHEL-8.5 | ||||||
| 
 | 
 | ||||||
| RHEL-only | RHEL-only | ||||||
| 
 | 
 | ||||||
| Related: #2040244 | Related: #2039797 | ||||||
| ---
 | ---
 | ||||||
|  man/systemd.net-naming-scheme.xml | 6 ++++++ |  man/systemd.net-naming-scheme.xml | 6 ++++++ | ||||||
|  src/udev/udev-builtin-net_id.c    | 2 ++ |  src/udev/udev-builtin-net_id.c    | 2 ++ | ||||||
| @ -29,10 +29,10 @@ index 10e71dcb15..be969bc8d0 100644 | |||||||
|          particular version of systemd.</para> |          particular version of systemd.</para> | ||||||
|      </variablelist> |      </variablelist> | ||||||
| diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
 | diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
 | ||||||
| index 0611c08234..3a0b3b1eae 100644
 | index 7c153f0aef..81139e666b 100644
 | ||||||
| --- a/src/udev/udev-builtin-net_id.c
 | --- a/src/udev/udev-builtin-net_id.c
 | ||||||
| +++ b/src/udev/udev-builtin-net_id.c
 | +++ b/src/udev/udev-builtin-net_id.c
 | ||||||
| @@ -135,6 +135,7 @@ typedef enum NamingSchemeFlags {
 | @@ -134,6 +134,7 @@ typedef enum NamingSchemeFlags {
 | ||||||
|          NAMING_RHEL_8_2 = NAMING_V239, |          NAMING_RHEL_8_2 = NAMING_V239, | ||||||
|          NAMING_RHEL_8_3 = NAMING_V239, |          NAMING_RHEL_8_3 = NAMING_V239, | ||||||
|          NAMING_RHEL_8_4 = NAMING_V239|NAMING_BRIDGE_NO_SLOT, |          NAMING_RHEL_8_4 = NAMING_V239|NAMING_BRIDGE_NO_SLOT, | ||||||
| @ -40,7 +40,7 @@ index 0611c08234..3a0b3b1eae 100644 | |||||||
|   |   | ||||||
|          _NAMING_SCHEME_FLAGS_INVALID = -1, |          _NAMING_SCHEME_FLAGS_INVALID = -1, | ||||||
|  } NamingSchemeFlags; |  } NamingSchemeFlags; | ||||||
| @@ -152,6 +153,7 @@ static const NamingScheme naming_schemes[] = {
 | @@ -151,6 +152,7 @@ static const NamingScheme naming_schemes[] = {
 | ||||||
|          { "rhel-8.2", NAMING_RHEL_8_2 }, |          { "rhel-8.2", NAMING_RHEL_8_2 }, | ||||||
|          { "rhel-8.3", NAMING_RHEL_8_3 }, |          { "rhel-8.3", NAMING_RHEL_8_3 }, | ||||||
|          { "rhel-8.4", NAMING_RHEL_8_4 }, |          { "rhel-8.4", NAMING_RHEL_8_4 }, | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From d5d728d24b34194438e74580c1a58f5727b59444 Mon Sep 17 00:00:00 2001 | From a967622c58e1ae76bb7e22e83389295c77d560df Mon Sep 17 00:00:00 2001 | ||||||
| From: Michal Sekletar <msekleta@redhat.com> | From: Michal Sekletar <msekleta@redhat.com> | ||||||
| Date: Wed, 12 Jan 2022 15:35:54 +0100 | Date: Wed, 12 Jan 2022 15:35:54 +0100 | ||||||
| Subject: [PATCH] udev/net_id: remove extraneous bracket | Subject: [PATCH] udev/net_id: remove extraneous bracket | ||||||
| 
 | 
 | ||||||
| RHEL-only | RHEL-only | ||||||
| 
 | 
 | ||||||
| Related: #2040244 | Related: #2039797 | ||||||
| ---
 | ---
 | ||||||
|  man/systemd.net-naming-scheme.xml | 2 +- |  man/systemd.net-naming-scheme.xml | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
| @ -0,0 +1,50 @@ | |||||||
|  | From 7ee6542c64103205d6520c1165894b3b6a40f2c9 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Michal Sekletar <msekleta@redhat.com> | ||||||
|  | Date: Wed, 12 Jan 2022 15:38:38 +0100 | ||||||
|  | Subject: [PATCH] udev/net_id: introduce naming scheme for RHEL-8.6 | ||||||
|  | 
 | ||||||
|  | RHEL-only | ||||||
|  | 
 | ||||||
|  | Related: #2039797 | ||||||
|  | ---
 | ||||||
|  |  man/systemd.net-naming-scheme.xml | 6 ++++++ | ||||||
|  |  src/udev/udev-builtin-net_id.c    | 2 ++ | ||||||
|  |  2 files changed, 8 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/man/systemd.net-naming-scheme.xml b/man/systemd.net-naming-scheme.xml
 | ||||||
|  | index a65da5c6c1..fe1aa4b654 100644
 | ||||||
|  | --- a/man/systemd.net-naming-scheme.xml
 | ||||||
|  | +++ b/man/systemd.net-naming-scheme.xml
 | ||||||
|  | @@ -307,6 +307,12 @@
 | ||||||
|  |            <para>Same as naming scheme <constant>rhel-8.4</constant>.</para> | ||||||
|  |          </varlistentry> | ||||||
|  |   | ||||||
|  | +        <varlistentry>
 | ||||||
|  | +          <term><constant>rhel-8.6</constant></term>
 | ||||||
|  | +
 | ||||||
|  | +          <para>Same as naming scheme <constant>rhel-8.4</constant>.</para>
 | ||||||
|  | +        </varlistentry>
 | ||||||
|  | +
 | ||||||
|  |          <para>Note that <constant>latest</constant> may be used to denote the latest scheme known to this | ||||||
|  |          particular version of systemd.</para> | ||||||
|  |      </variablelist> | ||||||
|  | diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
 | ||||||
|  | index 81139e666b..eafcbb64c5 100644
 | ||||||
|  | --- a/src/udev/udev-builtin-net_id.c
 | ||||||
|  | +++ b/src/udev/udev-builtin-net_id.c
 | ||||||
|  | @@ -135,6 +135,7 @@ typedef enum NamingSchemeFlags {
 | ||||||
|  |          NAMING_RHEL_8_3 = NAMING_V239, | ||||||
|  |          NAMING_RHEL_8_4 = NAMING_V239|NAMING_BRIDGE_NO_SLOT, | ||||||
|  |          NAMING_RHEL_8_5 = NAMING_RHEL_8_4, | ||||||
|  | +        NAMING_RHEL_8_6 = NAMING_RHEL_8_4,
 | ||||||
|  |   | ||||||
|  |          _NAMING_SCHEME_FLAGS_INVALID = -1, | ||||||
|  |  } NamingSchemeFlags; | ||||||
|  | @@ -153,6 +154,7 @@ static const NamingScheme naming_schemes[] = {
 | ||||||
|  |          { "rhel-8.3", NAMING_RHEL_8_3 }, | ||||||
|  |          { "rhel-8.4", NAMING_RHEL_8_4 }, | ||||||
|  |          { "rhel-8.5", NAMING_RHEL_8_5 }, | ||||||
|  | +        { "rhel-8.6", NAMING_RHEL_8_6 },
 | ||||||
|  |          /* … add more schemes here, as the logic to name devices is updated … */ | ||||||
|  |  }; | ||||||
|  |   | ||||||
| @ -1,9 +1,9 @@ | |||||||
| From 81b23f487eeffbc0e217c4e57567cfb70842f668 Mon Sep 17 00:00:00 2001 | From 08c1e6e304108e8bc8beca126f50888be7575bd0 Mon Sep 17 00:00:00 2001 | ||||||
| From: David Tardon <dtardon@redhat.com> | From: David Tardon <dtardon@redhat.com> | ||||||
| Date: Thu, 26 Nov 2020 16:29:10 +0100 | Date: Thu, 26 Nov 2020 16:29:10 +0100 | ||||||
| Subject: [PATCH] define newly needed constants | Subject: [PATCH] define newly needed constants | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/basic/missing.h | 23 +++++++++++++++++++++-- |  src/basic/missing.h | 23 +++++++++++++++++++++-- | ||||||
|  1 file changed, 21 insertions(+), 2 deletions(-) |  1 file changed, 21 insertions(+), 2 deletions(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From b0b98085bb0b95395b686efca43980d463749f3d Mon Sep 17 00:00:00 2001 | From 32e39fd249737c77248c32d064021426a2ec7a52 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 15 Dec 2019 20:57:51 +0900 | Date: Sun, 15 Dec 2019 20:57:51 +0900 | ||||||
| Subject: [PATCH] sd-netlink: support IFLA_PROP_LIST and IFLA_ALT_IFNAME | Subject: [PATCH] sd-netlink: support IFLA_PROP_LIST and IFLA_ALT_IFNAME | ||||||
| @ -6,7 +6,7 @@ Subject: [PATCH] sd-netlink: support IFLA_PROP_LIST and IFLA_ALT_IFNAME | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit ffeb16f5d832b1c65b8c8a1dd9bdd028bd76fc72) | (cherry picked from commit ffeb16f5d832b1c65b8c8a1dd9bdd028bd76fc72) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-netlink/netlink-message.c |  2 +- |  src/libsystemd/sd-netlink/netlink-message.c |  2 +- | ||||||
|  src/libsystemd/sd-netlink/netlink-types.c   | 13 +++++++++++++ |  src/libsystemd/sd-netlink/netlink-types.c   | 13 +++++++++++++ | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 3c31ef05ba732e3ab5d23761c5f84768ca8de68e Mon Sep 17 00:00:00 2001 | From cd3b4c5345a3500f190941454fff03fc143c6f2e Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 15 Dec 2019 21:32:25 +0900 | Date: Sun, 15 Dec 2019 21:32:25 +0900 | ||||||
| Subject: [PATCH] sd-netlink: introduce sd_netlink_message_read_strv() | Subject: [PATCH] sd-netlink: introduce sd_netlink_message_read_strv() | ||||||
| @ -10,7 +10,7 @@ The function introduced here reads all matched attributes. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 8f3c1859669230c2c8458675f41de13e369b47e7) | (cherry picked from commit 8f3c1859669230c2c8458675f41de13e369b47e7) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-netlink/netlink-message.c | 58 +++++++++++++++++++++ |  src/libsystemd/sd-netlink/netlink-message.c | 58 +++++++++++++++++++++ | ||||||
|  src/systemd/sd-netlink.h                    |  1 + |  src/systemd/sd-netlink.h                    |  1 + | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From 7888c8796197357f0214ea5fe17b11a8814fc313 Mon Sep 17 00:00:00 2001 | From bbfebb42c9023e36fb66f0e3b0bad132ab2fba55 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 15 Dec 2019 21:47:21 +0900 | Date: Sun, 15 Dec 2019 21:47:21 +0900 | ||||||
| Subject: [PATCH] sd-netlink: introduce sd_netlink_message_append_strv() | Subject: [PATCH] sd-netlink: introduce sd_netlink_message_append_strv() | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 6d725977c4f98a8f5effc33f44aa646cc2b6a0b7) | (cherry picked from commit 6d725977c4f98a8f5effc33f44aa646cc2b6a0b7) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-netlink/netlink-message.c | 29 +++++++++++++++++++++ |  src/libsystemd/sd-netlink/netlink-message.c | 29 +++++++++++++++++++++ | ||||||
|  src/systemd/sd-netlink.h                    |  1 + |  src/systemd/sd-netlink.h                    |  1 + | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From aff5197c5f06617b1ca0291614a0fb02c0c2e948 Mon Sep 17 00:00:00 2001 | From 58d0d77ddda4c02943d1f03e4c142aec9c4930f5 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 15 Dec 2019 21:48:12 +0900 | Date: Sun, 15 Dec 2019 21:48:12 +0900 | ||||||
| Subject: [PATCH] test: add a test for sd_netlink_message_{append,read}_strv() | Subject: [PATCH] test: add a test for sd_netlink_message_{append,read}_strv() | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit d08d92d5ee508a80e35d6b95b962bd09527fb5f2) | (cherry picked from commit d08d92d5ee508a80e35d6b95b962bd09527fb5f2) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-netlink/test-netlink.c | 33 ++++++++++++++++++++++++ |  src/libsystemd/sd-netlink/test-netlink.c | 33 ++++++++++++++++++++++++ | ||||||
|  1 file changed, 33 insertions(+) |  1 file changed, 33 insertions(+) | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From c50aab5f23535ea7f3ef004910465e7054931199 Mon Sep 17 00:00:00 2001 | From 1b12b8e9c0f6f230e12ca13bd70f27ef0a2fcfdd Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 15 Dec 2019 23:01:54 +0900 | Date: Sun, 15 Dec 2019 23:01:54 +0900 | ||||||
| Subject: [PATCH] util: introduce ifname_valid_full() | Subject: [PATCH] util: introduce ifname_valid_full() | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 4252696aec9ec038ff312a164e25f039da25126f) | (cherry picked from commit 4252696aec9ec038ff312a164e25f039da25126f) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/basic/socket-util.c     | 12 +++++++++--- |  src/basic/socket-util.c     | 12 +++++++++--- | ||||||
|  src/basic/socket-util.h     |  5 ++++- |  src/basic/socket-util.h     |  5 ++++- | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 7fc7c2774e0836ace524215ced5c60db405a154a Mon Sep 17 00:00:00 2001 | From 3275093305c1305d163f26cb4e4d614a87f8ff43 Mon Sep 17 00:00:00 2001 | ||||||
| From: David Tardon <dtardon@redhat.com> | From: David Tardon <dtardon@redhat.com> | ||||||
| Date: Fri, 27 Nov 2020 10:25:12 +0100 | Date: Fri, 27 Nov 2020 10:25:12 +0100 | ||||||
| Subject: [PATCH] rename function | Subject: [PATCH] rename function | ||||||
| @ -7,7 +7,7 @@ This happened upstream in commit | |||||||
| 54a8423788ec3cc6240959ab9f5cdac40baf047a, but I don't want to backport | 54a8423788ec3cc6240959ab9f5cdac40baf047a, but I don't want to backport | ||||||
| the whole commit... | the whole commit... | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd-network/network-internal.c | 2 +- |  src/libsystemd-network/network-internal.c | 2 +- | ||||||
|  src/libsystemd-network/network-internal.h | 2 +- |  src/libsystemd-network/network-internal.h | 2 +- | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From b99b055ba975c1663beaf94dbfe8f5c5c7398996 Mon Sep 17 00:00:00 2001 | From a29790ac578540ccb4264367603aba9bc41d1bf7 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 15 Dec 2019 23:21:18 +0900 | Date: Sun, 15 Dec 2019 23:21:18 +0900 | ||||||
| Subject: [PATCH] udev: support AlternativeName= setting in .link file | Subject: [PATCH] udev: support AlternativeName= setting in .link file | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit a5053a158b43c5ddee90f4915b9fc603e0191d6d) | (cherry picked from commit a5053a158b43c5ddee90f4915b9fc603e0191d6d) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  man/systemd.link.xml                     |  8 ++++ |  man/systemd.link.xml                     |  8 ++++ | ||||||
|  src/libsystemd/sd-netlink/netlink-util.c | 40 ++++++++++++++++ |  src/libsystemd/sd-netlink/netlink-util.c | 40 ++++++++++++++++ | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From c76d050d8d61b4a63d4407bd03bd3f49cd9915ce Mon Sep 17 00:00:00 2001 | From 0c178bf442aebcd2b42f10a0e4d2382a15505bb6 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 15 Dec 2019 22:46:19 +0900 | Date: Sun, 15 Dec 2019 22:46:19 +0900 | ||||||
| Subject: [PATCH] network: make Name= in [Match] support alternative names of | Subject: [PATCH] network: make Name= in [Match] support alternative names of | ||||||
| @ -7,13 +7,15 @@ Subject: [PATCH] network: make Name= in [Match] support alternative names of | |||||||
| (cherry picked from commit 572b21d96cabd5860b0670e98440b6cb99a4b749 | (cherry picked from commit 572b21d96cabd5860b0670e98440b6cb99a4b749 | ||||||
| src/network bits have been left out.) | src/network bits have been left out.) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  man/systemd.network.xml                   |  7 +++---- |  man/systemd.network.xml                   |  7 +++---- | ||||||
|  src/libsystemd-network/network-internal.c | 20 ++++++++++++++++++-- |  src/libsystemd-network/network-internal.c | 20 ++++++++++++++++++-- | ||||||
|  src/libsystemd-network/network-internal.h |  3 ++- |  src/libsystemd-network/network-internal.h |  3 ++- | ||||||
|  |  src/network/netdev/netdev.c               |  2 +- | ||||||
|  |  src/network/networkd-network.c            |  2 +- | ||||||
|  src/udev/net/link-config.c                |  3 ++- |  src/udev/net/link-config.c                |  3 ++- | ||||||
|  4 files changed, 25 insertions(+), 8 deletions(-) |  6 files changed, 27 insertions(+), 10 deletions(-) | ||||||
| 
 | 
 | ||||||
| diff --git a/man/systemd.network.xml b/man/systemd.network.xml
 | diff --git a/man/systemd.network.xml b/man/systemd.network.xml
 | ||||||
| index fc8e0aea68..8300540096 100644
 | index fc8e0aea68..8300540096 100644
 | ||||||
| @ -99,6 +101,32 @@ index 9074758bbb..e1d098f3fe 100644 | |||||||
|   |   | ||||||
|  CONFIG_PARSER_PROTOTYPE(config_parse_net_condition); |  CONFIG_PARSER_PROTOTYPE(config_parse_net_condition); | ||||||
|  CONFIG_PARSER_PROTOTYPE(config_parse_hwaddr); |  CONFIG_PARSER_PROTOTYPE(config_parse_hwaddr); | ||||||
|  | diff --git a/src/network/netdev/netdev.c b/src/network/netdev/netdev.c
 | ||||||
|  | index 82ce88402f..e97cc07028 100644
 | ||||||
|  | --- a/src/network/netdev/netdev.c
 | ||||||
|  | +++ b/src/network/netdev/netdev.c
 | ||||||
|  | @@ -640,7 +640,7 @@ static int netdev_load_one(Manager *manager, const char *filename) {
 | ||||||
|  |                               netdev_raw->match_host, netdev_raw->match_virt, | ||||||
|  |                               netdev_raw->match_kernel_cmdline, netdev_raw->match_kernel_version, | ||||||
|  |                               netdev_raw->match_arch, | ||||||
|  | -                             NULL, NULL, NULL, NULL, NULL, NULL) <= 0)
 | ||||||
|  | +                             NULL, NULL, NULL, NULL, NULL, NULL, NULL) <= 0)
 | ||||||
|  |                  return 0; | ||||||
|  |   | ||||||
|  |          if (netdev_raw->kind == _NETDEV_KIND_INVALID) { | ||||||
|  | diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c
 | ||||||
|  | index 429aac5e6c..7637d135a4 100644
 | ||||||
|  | --- a/src/network/networkd-network.c
 | ||||||
|  | +++ b/src/network/networkd-network.c
 | ||||||
|  | @@ -479,7 +479,7 @@ int network_get(Manager *manager, struct udev_device *device,
 | ||||||
|  |                                       network->match_virt, network->match_kernel_cmdline, | ||||||
|  |                                       network->match_kernel_version, network->match_arch, | ||||||
|  |                                       address, path, parent_driver, driver, | ||||||
|  | -                                     devtype, ifname)) {
 | ||||||
|  | +                                     devtype, ifname, NULL)) {
 | ||||||
|  |                          if (network->match_name && device) { | ||||||
|  |                                  const char *attr; | ||||||
|  |                                  uint8_t name_assign_type = NET_NAME_UNKNOWN; | ||||||
| diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
 | diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c
 | ||||||
| index d07a1a1874..e5052f8f29 100644
 | index d07a1a1874..e5052f8f29 100644
 | ||||||
| --- a/src/udev/net/link-config.c
 | --- a/src/udev/net/link-config.c
 | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From 22dd44ae3cfd66e622e0b672af96728b6f505ad1 Mon Sep 17 00:00:00 2001 | From 9f59dca3868b1e934a2aac2d811c55ab33cca0eb Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Tue, 17 Dec 2019 11:01:35 +0900 | Date: Tue, 17 Dec 2019 11:01:35 +0900 | ||||||
| Subject: [PATCH] udev: extend the length of ID_NET_NAME_XXX= to ALTIFNAMSIZ | Subject: [PATCH] udev: extend the length of ID_NET_NAME_XXX= to ALTIFNAMSIZ | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 78f8849f84ca0939796edb840e878a9d2e124a4d) | (cherry picked from commit 78f8849f84ca0939796edb840e878a9d2e124a4d) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/udev/net/link-config.c     |  5 ++++- |  src/udev/net/link-config.c     |  5 ++++- | ||||||
|  src/udev/udev-builtin-net_id.c | 33 +++++++++++++++++---------------- |  src/udev/udev-builtin-net_id.c | 33 +++++++++++++++++---------------- | ||||||
| @ -43,7 +43,7 @@ index e5052f8f29..4de8ee7d7e 100644 | |||||||
|          } |          } | ||||||
|   |   | ||||||
| diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
 | diff --git a/src/udev/udev-builtin-net_id.c b/src/udev/udev-builtin-net_id.c
 | ||||||
| index 7c153f0aef..0611c08234 100644
 | index eafcbb64c5..386d74ca5e 100644
 | ||||||
| --- a/src/udev/udev-builtin-net_id.c
 | --- a/src/udev/udev-builtin-net_id.c
 | ||||||
| +++ b/src/udev/udev-builtin-net_id.c
 | +++ b/src/udev/udev-builtin-net_id.c
 | ||||||
| @@ -90,6 +90,7 @@
 | @@ -90,6 +90,7 @@
 | ||||||
| @ -54,7 +54,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|  #include <linux/pci_regs.h> |  #include <linux/pci_regs.h> | ||||||
|   |   | ||||||
|  #include "dirent-util.h" |  #include "dirent-util.h" | ||||||
| @@ -172,21 +173,21 @@ struct netnames {
 | @@ -176,21 +177,21 @@ struct netnames {
 | ||||||
|          bool mac_valid; |          bool mac_valid; | ||||||
|   |   | ||||||
|          struct udev_device *pcidev; |          struct udev_device *pcidev; | ||||||
| @ -85,7 +85,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|  }; |  }; | ||||||
|   |   | ||||||
|  static const NamingScheme* naming_scheme_from_name(const char *name) { |  static const NamingScheme* naming_scheme_from_name(const char *name) { | ||||||
| @@ -883,7 +884,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | @@ -887,7 +888,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | ||||||
|   |   | ||||||
|          err = names_mac(dev, &names); |          err = names_mac(dev, &names); | ||||||
|          if (err >= 0 && names.mac_valid) { |          if (err >= 0 && names.mac_valid) { | ||||||
| @ -94,7 +94,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|   |   | ||||||
|                  xsprintf(str, "%sx%02x%02x%02x%02x%02x%02x", prefix, |                  xsprintf(str, "%sx%02x%02x%02x%02x%02x%02x", prefix, | ||||||
|                           names.mac[0], names.mac[1], names.mac[2], |                           names.mac[0], names.mac[1], names.mac[2], | ||||||
| @@ -896,7 +897,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | @@ -900,7 +901,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | ||||||
|          /* get path names for Linux on System z network devices */ |          /* get path names for Linux on System z network devices */ | ||||||
|          err = names_ccw(dev, &names); |          err = names_ccw(dev, &names); | ||||||
|          if (err >= 0 && names.type == NET_CCW) { |          if (err >= 0 && names.type == NET_CCW) { | ||||||
| @ -103,7 +103,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|   |   | ||||||
|                  if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.ccw_busid)) |                  if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.ccw_busid)) | ||||||
|                          udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str); |                          udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str); | ||||||
| @@ -906,7 +907,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | @@ -910,7 +911,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | ||||||
|          /* get ibmveth/ibmvnic slot-based names. */ |          /* get ibmveth/ibmvnic slot-based names. */ | ||||||
|          err = names_vio(dev, &names); |          err = names_vio(dev, &names); | ||||||
|          if (err >= 0 && names.type == NET_VIO) { |          if (err >= 0 && names.type == NET_VIO) { | ||||||
| @ -112,7 +112,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|   |   | ||||||
|                  if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.vio_slot)) |                  if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.vio_slot)) | ||||||
|                          udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str); |                          udev_builtin_add_property(dev, test, "ID_NET_NAME_SLOT", str); | ||||||
| @@ -916,7 +917,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | @@ -920,7 +921,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | ||||||
|          /* get ACPI path names for ARM64 platform devices */ |          /* get ACPI path names for ARM64 platform devices */ | ||||||
|          err = names_platform(dev, &names, test); |          err = names_platform(dev, &names, test); | ||||||
|          if (err >= 0 && names.type == NET_PLATFORM) { |          if (err >= 0 && names.type == NET_PLATFORM) { | ||||||
| @ -121,7 +121,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|   |   | ||||||
|                  if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.platform_path)) |                  if (snprintf_ok(str, sizeof str, "%s%s", prefix, names.platform_path)) | ||||||
|                          udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str); |                          udev_builtin_add_property(dev, test, "ID_NET_NAME_PATH", str); | ||||||
| @@ -930,7 +931,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | @@ -934,7 +935,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | ||||||
|   |   | ||||||
|          /* plain PCI device */ |          /* plain PCI device */ | ||||||
|          if (names.type == NET_PCI) { |          if (names.type == NET_PCI) { | ||||||
| @ -130,7 +130,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|   |   | ||||||
|                  if (names.pci_onboard[0] && |                  if (names.pci_onboard[0] && | ||||||
|                      snprintf_ok(str, sizeof str, "%s%s", prefix, names.pci_onboard)) |                      snprintf_ok(str, sizeof str, "%s%s", prefix, names.pci_onboard)) | ||||||
| @@ -953,7 +954,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | @@ -957,7 +958,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | ||||||
|          /* USB device */ |          /* USB device */ | ||||||
|          err = names_usb(dev, &names); |          err = names_usb(dev, &names); | ||||||
|          if (err >= 0 && names.type == NET_USB) { |          if (err >= 0 && names.type == NET_USB) { | ||||||
| @ -139,7 +139,7 @@ index 7c153f0aef..0611c08234 100644 | |||||||
|   |   | ||||||
|                  if (names.pci_path[0] && |                  if (names.pci_path[0] && | ||||||
|                      snprintf_ok(str, sizeof str, "%s%s%s", prefix, names.pci_path, names.usb_ports)) |                      snprintf_ok(str, sizeof str, "%s%s%s", prefix, names.pci_path, names.usb_ports)) | ||||||
| @@ -968,7 +969,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | @@ -972,7 +973,7 @@ static int builtin_net_id(struct udev_device *dev, int argc, char *argv[], bool
 | ||||||
|          /* Broadcom bus */ |          /* Broadcom bus */ | ||||||
|          err = names_bcma(dev, &names); |          err = names_bcma(dev, &names); | ||||||
|          if (err >= 0 && names.type == NET_BCMA) { |          if (err >= 0 && names.type == NET_BCMA) { | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 42894fc33ae88f3be49aa01ac24dd1c3e96770f6 Mon Sep 17 00:00:00 2001 | From f0b11f5042489c85d5016eceff06647bb49d486a Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Tue, 17 Dec 2019 15:32:22 +0900 | Date: Tue, 17 Dec 2019 15:32:22 +0900 | ||||||
| Subject: [PATCH] udev: do not fail if kernel does not support alternative | Subject: [PATCH] udev: do not fail if kernel does not support alternative | ||||||
| @ -6,7 +6,7 @@ Subject: [PATCH] udev: do not fail if kernel does not support alternative | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit bb181dd4a664ca8e82a8f7194261fd6531e861d8) | (cherry picked from commit bb181dd4a664ca8e82a8f7194261fd6531e861d8) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  man/systemd.link.xml       | 3 ++- |  man/systemd.link.xml       | 3 ++- | ||||||
|  src/udev/net/link-config.c | 4 +++- |  src/udev/net/link-config.c | 4 +++- | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From 4f47e35ee4026f24ee99a0bfa7ba5b2f24a92a02 Mon Sep 17 00:00:00 2001 | From 2faf160d0b8122e0dca603a441db68dc38c1bab6 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Mon, 16 Dec 2019 23:44:42 +0900 | Date: Mon, 16 Dec 2019 23:44:42 +0900 | ||||||
| Subject: [PATCH] udev: introduce AlternativeNamesPolicy= setting | Subject: [PATCH] udev: introduce AlternativeNamesPolicy= setting | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit ef1d2c07f9567dfea8a4e012d8779a4ded2d9ae6) | (cherry picked from commit ef1d2c07f9567dfea8a4e012d8779a4ded2d9ae6) | ||||||
| 
 | 
 | ||||||
| Resolves: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  man/systemd.link.xml                 | 11 +++++ |  man/systemd.link.xml                 | 11 +++++ | ||||||
|  src/udev/net/link-config-gperf.gperf |  1 + |  src/udev/net/link-config-gperf.gperf |  1 + | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From 433d85ac89baa0683290cf8b5a913e7c6d666ef1 Mon Sep 17 00:00:00 2001 | From 9a224b9480d218b782ac7bbacb3732672d0dad3f Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Tue, 17 Dec 2019 00:30:38 +0900 | Date: Tue, 17 Dec 2019 00:30:38 +0900 | ||||||
| Subject: [PATCH] network: set AlternativeNamesPolicy= in 99-default.link | Subject: [PATCH] network: set AlternativeNamesPolicy= in 99-default.link | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 49f5cbe92484a6661bccc0ae6c547bc5767c83bf) | (cherry picked from commit 49f5cbe92484a6661bccc0ae6c547bc5767c83bf) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  network/99-default.link | 1 + |  network/99-default.link | 1 + | ||||||
|  1 file changed, 1 insertion(+) |  1 file changed, 1 insertion(+) | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From c4c771f2dc5c590990d1f9105886b833afa59852 Mon Sep 17 00:00:00 2001 | From 58cdc09af08e065c85b2f8834ee9848c010f5afe Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Mon, 16 Dec 2019 19:47:48 +0900 | Date: Mon, 16 Dec 2019 19:47:48 +0900 | ||||||
| Subject: [PATCH] random-util: call initialize_srand() after fork() | Subject: [PATCH] random-util: call initialize_srand() after fork() | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit a0f11d1d11a546f791855ec9c47c2ff830e6a5aa) | (cherry picked from commit a0f11d1d11a546f791855ec9c47c2ff830e6a5aa) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/basic/random-util.c | 14 +++++++++++++- |  src/basic/random-util.c | 14 +++++++++++++- | ||||||
|  1 file changed, 13 insertions(+), 1 deletion(-) |  1 file changed, 13 insertions(+), 1 deletion(-) | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From 8db22aec9bfd140855b64f2879b7ca6d1cba69c6 Mon Sep 17 00:00:00 2001 | From bb7c49cc95e9de877fafc5c2be06932bc21aa762 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Tue, 17 Dec 2019 18:28:36 +0900 | Date: Tue, 17 Dec 2019 18:28:36 +0900 | ||||||
| Subject: [PATCH] sd-netlink: introduce rtnl_resolve_link_alternative_names() | Subject: [PATCH] sd-netlink: introduce rtnl_resolve_link_alternative_names() | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit b04c5e51da7a61d41d564e73a1e92bd8b29b0223) | (cherry picked from commit b04c5e51da7a61d41d564e73a1e92bd8b29b0223) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-netlink/netlink-types.c |  1 + |  src/libsystemd/sd-netlink/netlink-types.c |  1 + | ||||||
|  src/libsystemd/sd-netlink/netlink-util.c  | 29 +++++++++++++++++++++++ |  src/libsystemd/sd-netlink/netlink-util.c  | 29 +++++++++++++++++++++++ | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From eeea9a2f94b5defb97c20c62a23345a367a734aa Mon Sep 17 00:00:00 2001 | From f5d149095f95704fe7660069a493c0329ddbb5aa Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Tue, 17 Dec 2019 20:41:21 +0900 | Date: Tue, 17 Dec 2019 20:41:21 +0900 | ||||||
| Subject: [PATCH] udev: sort alternative names | Subject: [PATCH] udev: sort alternative names | ||||||
| @ -8,7 +8,7 @@ visibility, let's sort the alternative names. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 4d016e965b13883cccc963a34a1299a0c4f900ca) | (cherry picked from commit 4d016e965b13883cccc963a34a1299a0c4f900ca) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/udev/net/link-config.c | 1 + |  src/udev/net/link-config.c | 1 + | ||||||
|  1 file changed, 1 insertion(+) |  1 file changed, 1 insertion(+) | ||||||
| @ -1,11 +1,11 @@ | |||||||
| From 8f946da7ee9bbb6e52e99b452c1f4f6f76e7b3c2 Mon Sep 17 00:00:00 2001 | From c6b2c2fb577d20879b5b4c610c4c29bac259beab Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Fri, 17 Jul 2020 21:29:13 +0900 | Date: Fri, 17 Jul 2020 21:29:13 +0900 | ||||||
| Subject: [PATCH] netlink: introduce rtnl_get/delete_link_alternative_names() | Subject: [PATCH] netlink: introduce rtnl_get/delete_link_alternative_names() | ||||||
| 
 | 
 | ||||||
| (cherry picked from commit 14982526145de84201c7e3b4fc6be6aa5e9a08f7) | (cherry picked from commit 14982526145de84201c7e3b4fc6be6aa5e9a08f7) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-netlink/netlink-util.c | 45 ++++++++++++++++++++++-- |  src/libsystemd/sd-netlink/netlink-util.c | 45 ++++++++++++++++++++++-- | ||||||
|  src/libsystemd/sd-netlink/netlink-util.h |  2 ++ |  src/libsystemd/sd-netlink/netlink-util.h |  2 ++ | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 6db267672de69d6bf4809f433cde106e11145ca8 Mon Sep 17 00:00:00 2001 | From 73ff88cdb6bd1991d75323c6c364bcc9bce7efda Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Fri, 17 Jul 2020 21:31:24 +0900 | Date: Fri, 17 Jul 2020 21:31:24 +0900 | ||||||
| Subject: [PATCH] netlink: do not fail when new interface name is already used | Subject: [PATCH] netlink: do not fail when new interface name is already used | ||||||
| @ -12,7 +12,7 @@ as an alternative name. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 434a34838034347f45fb9a47df55b1a36e5addfd) | (cherry picked from commit 434a34838034347f45fb9a47df55b1a36e5addfd) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/libsystemd/sd-netlink/netlink-util.c | 30 +++++++++++++++++++++--- |  src/libsystemd/sd-netlink/netlink-util.c | 30 +++++++++++++++++++++--- | ||||||
|  1 file changed, 27 insertions(+), 3 deletions(-) |  1 file changed, 27 insertions(+), 3 deletions(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 817a707daf1e9fa4f20eba04ce1c52af7518e355 Mon Sep 17 00:00:00 2001 | From aec8473f69877c353b9e788b2a7329e290ae14f9 Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Fri, 17 Jul 2020 21:36:05 +0900 | Date: Fri, 17 Jul 2020 21:36:05 +0900 | ||||||
| Subject: [PATCH] udev: do not try to reassign alternative names | Subject: [PATCH] udev: do not try to reassign alternative names | ||||||
| @ -7,7 +7,7 @@ Setting alternative names may fail if some of them are already assigned. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit 97fdae33dfe8e7e0a4e5230564f6cdebc4450eec) | (cherry picked from commit 97fdae33dfe8e7e0a4e5230564f6cdebc4450eec) | ||||||
| 
 | 
 | ||||||
| Related: #1850986 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/udev/net/link-config.c | 12 ++++++++++-- |  src/udev/net/link-config.c | 12 ++++++++++-- | ||||||
|  1 file changed, 10 insertions(+), 2 deletions(-) |  1 file changed, 10 insertions(+), 2 deletions(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 21c071fbd05d112ccd92b7a49e53bf8d38cdbd06 Mon Sep 17 00:00:00 2001 | From 270e3f46d1fe474eb3b4cd6789520b36a740ef32 Mon Sep 17 00:00:00 2001 | ||||||
| From: David Tardon <dtardon@redhat.com> | From: David Tardon <dtardon@redhat.com> | ||||||
| Date: Wed, 8 Dec 2021 09:49:24 +0100 | Date: Wed, 8 Dec 2021 09:49:24 +0100 | ||||||
| Subject: [PATCH] Do not fail if the same alt. name is set again | Subject: [PATCH] Do not fail if the same alt. name is set again | ||||||
| @ -7,7 +7,7 @@ This is a workaround for a kernel bug. | |||||||
| 
 | 
 | ||||||
| RHEL-only | RHEL-only | ||||||
| 
 | 
 | ||||||
| Resolves: #2030027 | Related: #2005008 | ||||||
| ---
 | ---
 | ||||||
|  src/udev/net/link-config.c | 2 +- |  src/udev/net/link-config.c | 2 +- | ||||||
|  1 file changed, 1 insertion(+), 1 deletion(-) |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From 9807f473b1b3e2aaf86bcbc6e6b9ad1328548b22 Mon Sep 17 00:00:00 2001 | From 21e4d155ac04bf3b999834cd42e4773ae01bf3b3 Mon Sep 17 00:00:00 2001 | ||||||
| From: Lennart Poettering <lennart@poettering.net> | From: Lennart Poettering <lennart@poettering.net> | ||||||
| Date: Fri, 15 Nov 2019 14:00:54 +0100 | Date: Fri, 15 Nov 2019 14:00:54 +0100 | ||||||
| Subject: [PATCH] mount: do not update exec deps on mountinfo changes | Subject: [PATCH] mount: do not update exec deps on mountinfo changes | ||||||
| @ -6,7 +6,7 @@ Subject: [PATCH] mount: do not update exec deps on mountinfo changes | |||||||
| Fixes: #13978 | Fixes: #13978 | ||||||
| (cherry picked from commit bf7eedbf8f8c83d9e775c80275f98f506ec963c6) | (cherry picked from commit bf7eedbf8f8c83d9e775c80275f98f506ec963c6) | ||||||
| 
 | 
 | ||||||
| Related: #2038878 | Related: #2008825 | ||||||
| ---
 | ---
 | ||||||
|  src/core/mount.c | 42 ++++++++++++++++++++++++++++-------------- |  src/core/mount.c | 42 ++++++++++++++++++++++++++++-------------- | ||||||
|  1 file changed, 28 insertions(+), 14 deletions(-) |  1 file changed, 28 insertions(+), 14 deletions(-) | ||||||
| @ -1,4 +1,4 @@ | |||||||
| From f68eeaf2809d6866f9cca3d7746795ffc3e71f46 Mon Sep 17 00:00:00 2001 | From 1fb992c50f7fc6a5c399e302ba79097d36a0cedf Mon Sep 17 00:00:00 2001 | ||||||
| From: Yu Watanabe <watanabe.yu+github@gmail.com> | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
| Date: Sun, 29 Aug 2021 21:20:43 +0900 | Date: Sun, 29 Aug 2021 21:20:43 +0900 | ||||||
| Subject: [PATCH] core/mount: add implicit unit dependencies even if when mount | Subject: [PATCH] core/mount: add implicit unit dependencies even if when mount | ||||||
| @ -8,7 +8,7 @@ Hopefully fixes #20566. | |||||||
| 
 | 
 | ||||||
| (cherry picked from commit aebff2e7ce209fc2d75b894a3ae8b80f6f36ec11) | (cherry picked from commit aebff2e7ce209fc2d75b894a3ae8b80f6f36ec11) | ||||||
| 
 | 
 | ||||||
| Resolves: #2038878 | Resolves: #2008825 | ||||||
| ---
 | ---
 | ||||||
|  src/core/mount.c | 6 +++++- |  src/core/mount.c | 6 +++++- | ||||||
|  1 file changed, 5 insertions(+), 1 deletion(-) |  1 file changed, 5 insertions(+), 1 deletion(-) | ||||||
| @ -0,0 +1,27 @@ | |||||||
|  | From 7b9b641a7721f013fb12ab4e2a03423b5ede08c6 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Tue, 9 Oct 2018 22:23:14 +0200 | ||||||
|  | Subject: [PATCH] core: fix unfortunate typo in unit_is_unneeded() | ||||||
|  | 
 | ||||||
|  | Follow-up for a3c1168ac293f16d9343d248795bb4c246aaff4a. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 93d4cb09d56e670b0c203dd6ec6939e391a0df59) | ||||||
|  | 
 | ||||||
|  | Resolves: #2040147 | ||||||
|  | ---
 | ||||||
|  |  src/core/unit.c | 2 +- | ||||||
|  |  1 file changed, 1 insertion(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/unit.c b/src/core/unit.c
 | ||||||
|  | index 4de218feac..e2c61ce866 100644
 | ||||||
|  | --- a/src/core/unit.c
 | ||||||
|  | +++ b/src/core/unit.c
 | ||||||
|  | @@ -1956,7 +1956,7 @@ bool unit_is_unneeded(Unit *u) {
 | ||||||
|  |                   * restart, then don't clean this one up. */ | ||||||
|  |   | ||||||
|  |                  HASHMAP_FOREACH_KEY(v, other, u->dependencies[deps[j]], i) { | ||||||
|  | -                        if (u->job)
 | ||||||
|  | +                        if (other->job)
 | ||||||
|  |                                  return false; | ||||||
|  |   | ||||||
|  |                          if (!UNIT_IS_INACTIVE_OR_FAILED(unit_active_state(other))) | ||||||
| @ -0,0 +1,27 @@ | |||||||
|  | From 8cb38e1557b81740f49dff43a297aef7bd676424 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Tue, 9 Oct 2018 22:22:52 +0200 | ||||||
|  | Subject: [PATCH] core: make destructive transaction error a bit more useful | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit cf99f8eacf1c864b19a6a02edea78c43f3185cb7) | ||||||
|  | 
 | ||||||
|  | Related: #2040147 | ||||||
|  | ---
 | ||||||
|  |  src/core/transaction.c | 4 +++- | ||||||
|  |  1 file changed, 3 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/transaction.c b/src/core/transaction.c
 | ||||||
|  | index cdaaff4f55..ee5b39fef4 100644
 | ||||||
|  | --- a/src/core/transaction.c
 | ||||||
|  | +++ b/src/core/transaction.c
 | ||||||
|  | @@ -526,7 +526,9 @@ static int transaction_is_destructive(Transaction *tr, JobMode mode, sd_bus_erro
 | ||||||
|  |                  if (j->unit->job && (mode == JOB_FAIL || j->unit->job->irreversible) && | ||||||
|  |                      job_type_is_conflicting(j->unit->job->type, j->type)) | ||||||
|  |                          return sd_bus_error_setf(e, BUS_ERROR_TRANSACTION_IS_DESTRUCTIVE, | ||||||
|  | -                                                 "Transaction is destructive.");
 | ||||||
|  | +                                                 "Transaction for %s/%s is destructive (%s has '%s' job queued, but '%s' is included in transaction).",
 | ||||||
|  | +                                                 tr->anchor_job->unit->id, job_type_to_string(tr->anchor_job->type),
 | ||||||
|  | +                                                 j->unit->id, job_type_to_string(j->unit->job->type), job_type_to_string(j->type));
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          return 0; | ||||||
| @ -0,0 +1,89 @@ | |||||||
|  | From 81b967279f6e23474b1e7a0ea9b4ecf9405f87bb Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Masahiro Matsuya <mmatsuya@redhat.com> | ||||||
|  | Date: Wed, 31 Mar 2021 11:44:24 +0900 | ||||||
|  | Subject: [PATCH] tmpfiles: use a entry in hashmap as ItemArray in | ||||||
|  |  read_config_file() | ||||||
|  | 
 | ||||||
|  | [zjs: squash commits and use size_t as appropriate. | ||||||
|  | 
 | ||||||
|  | Bug seems to have been introduced in 811a15877825da9e53f9a2a8603da34589af6bbb. | ||||||
|  | Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1944468.] | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit bec890e3cd6dac249cb12ce9430fdb78b6cf546b) | ||||||
|  | 
 | ||||||
|  | Resolves: #1944468 | ||||||
|  | ---
 | ||||||
|  |  src/tmpfiles/tmpfiles.c | 47 +++++++++++++++++++++++------------------ | ||||||
|  |  1 file changed, 26 insertions(+), 21 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
 | ||||||
|  | index 927de35f32..1aeeed0d2e 100644
 | ||||||
|  | --- a/src/tmpfiles/tmpfiles.c
 | ||||||
|  | +++ b/src/tmpfiles/tmpfiles.c
 | ||||||
|  | @@ -2646,7 +2646,7 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe
 | ||||||
|  |          char line[LINE_MAX]; | ||||||
|  |          Iterator iterator; | ||||||
|  |          unsigned v = 0; | ||||||
|  | -        Item *i;
 | ||||||
|  | +        ItemArray *ia;
 | ||||||
|  |          int r = 0; | ||||||
|  |   | ||||||
|  |          assert(fn); | ||||||
|  | @@ -2692,32 +2692,37 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          /* we have to determine age parameter for each entry of type X */ | ||||||
|  | -        ORDERED_HASHMAP_FOREACH(i, globs, iterator) {
 | ||||||
|  | -                Iterator iter;
 | ||||||
|  | -                Item *j, *candidate_item = NULL;
 | ||||||
|  | +        ORDERED_HASHMAP_FOREACH(ia, globs, iterator)
 | ||||||
|  | +                for (size_t ni = 0; ni < ia->count; ni++) {
 | ||||||
|  | +                        Iterator iter;
 | ||||||
|  | +                        ItemArray *ja;
 | ||||||
|  | +                        Item *i = ia->items + ni, *candidate_item = NULL;
 | ||||||
|  |   | ||||||
|  | -                if (i->type != IGNORE_DIRECTORY_PATH)
 | ||||||
|  | -                        continue;
 | ||||||
|  | -
 | ||||||
|  | -                ORDERED_HASHMAP_FOREACH(j, items, iter) {
 | ||||||
|  | -                        if (!IN_SET(j->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY, CREATE_SUBVOLUME, CREATE_SUBVOLUME_INHERIT_QUOTA, CREATE_SUBVOLUME_NEW_QUOTA))
 | ||||||
|  | +                        if (i->type != IGNORE_DIRECTORY_PATH)
 | ||||||
|  |                                  continue; | ||||||
|  |   | ||||||
|  | -                        if (path_equal(j->path, i->path)) {
 | ||||||
|  | -                                candidate_item = j;
 | ||||||
|  | -                                break;
 | ||||||
|  | -                        }
 | ||||||
|  | +                        ORDERED_HASHMAP_FOREACH(ja, items, iter)
 | ||||||
|  | +                                for (size_t nj = 0; nj < ja->count; nj++) {
 | ||||||
|  | +                                        Item *j = ja->items + nj;
 | ||||||
|  |   | ||||||
|  | -                        if ((!candidate_item && path_startswith(i->path, j->path)) ||
 | ||||||
|  | -                            (candidate_item && path_startswith(j->path, candidate_item->path) && (fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0)))
 | ||||||
|  | -                                candidate_item = j;
 | ||||||
|  | -                }
 | ||||||
|  | +                                        if (!IN_SET(j->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY, CREATE_SUBVOLUME, CREATE_SUBVOLUME_INHERIT_QUOTA, CREATE_SUBVOLUME_NEW_QUOTA))
 | ||||||
|  | +                                                continue;
 | ||||||
|  |   | ||||||
|  | -                if (candidate_item && candidate_item->age_set) {
 | ||||||
|  | -                        i->age = candidate_item->age;
 | ||||||
|  | -                        i->age_set = true;
 | ||||||
|  | +                                        if (path_equal(j->path, i->path)) {
 | ||||||
|  | +                                                candidate_item = j;
 | ||||||
|  | +                                                break;
 | ||||||
|  | +                                        }
 | ||||||
|  | +
 | ||||||
|  | +                                        if ((!candidate_item && path_startswith(i->path, j->path)) ||
 | ||||||
|  | +                                            (candidate_item && path_startswith(j->path, candidate_item->path) && (fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0)))
 | ||||||
|  | +                                                candidate_item = j;
 | ||||||
|  | +                                }
 | ||||||
|  | +
 | ||||||
|  | +                        if (candidate_item && candidate_item->age_set) {
 | ||||||
|  | +                                i->age = candidate_item->age;
 | ||||||
|  | +                                i->age_set = true;
 | ||||||
|  | +                        }
 | ||||||
|  |                  } | ||||||
|  | -        }
 | ||||||
|  |   | ||||||
|  |          if (ferror(f)) { | ||||||
|  |                  log_error_errno(errno, "Failed to read from file %s: %m", fn); | ||||||
							
								
								
									
										45
									
								
								SOURCES/0730-tmpfiles-rework-condition-check.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								SOURCES/0730-tmpfiles-rework-condition-check.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | |||||||
|  | From 520ff5394187a0d6cb0cb40251f6e8e997ccdd0e Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Wed, 7 Apr 2021 17:54:49 +0200 | ||||||
|  | Subject: [PATCH] tmpfiles: rework condition check | ||||||
|  | 
 | ||||||
|  | (!a && b) || (a && c) is replaced by (a ? c : b). | ||||||
|  | 
 | ||||||
|  | path_startswith() != NULL is need to avoid type warning. | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 875e7b25d84a111755dab79241c9e64e44836910) | ||||||
|  | 
 | ||||||
|  | Related: #1944468 | ||||||
|  | ---
 | ||||||
|  |  src/tmpfiles/tmpfiles.c | 11 ++++++++--- | ||||||
|  |  1 file changed, 8 insertions(+), 3 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/tmpfiles/tmpfiles.c b/src/tmpfiles/tmpfiles.c
 | ||||||
|  | index 1aeeed0d2e..50fada99dd 100644
 | ||||||
|  | --- a/src/tmpfiles/tmpfiles.c
 | ||||||
|  | +++ b/src/tmpfiles/tmpfiles.c
 | ||||||
|  | @@ -2705,7 +2705,11 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe
 | ||||||
|  |                                  for (size_t nj = 0; nj < ja->count; nj++) { | ||||||
|  |                                          Item *j = ja->items + nj; | ||||||
|  |   | ||||||
|  | -                                        if (!IN_SET(j->type, CREATE_DIRECTORY, TRUNCATE_DIRECTORY, CREATE_SUBVOLUME, CREATE_SUBVOLUME_INHERIT_QUOTA, CREATE_SUBVOLUME_NEW_QUOTA))
 | ||||||
|  | +                                        if (!IN_SET(j->type, CREATE_DIRECTORY,
 | ||||||
|  | +                                                             TRUNCATE_DIRECTORY,
 | ||||||
|  | +                                                             CREATE_SUBVOLUME,
 | ||||||
|  | +                                                             CREATE_SUBVOLUME_INHERIT_QUOTA,
 | ||||||
|  | +                                                             CREATE_SUBVOLUME_NEW_QUOTA))
 | ||||||
|  |                                                  continue; | ||||||
|  |   | ||||||
|  |                                          if (path_equal(j->path, i->path)) { | ||||||
|  | @@ -2713,8 +2717,9 @@ static int read_config_file(char **config_dirs, const char *fn, bool ignore_enoe
 | ||||||
|  |                                                  break; | ||||||
|  |                                          } | ||||||
|  |   | ||||||
|  | -                                        if ((!candidate_item && path_startswith(i->path, j->path)) ||
 | ||||||
|  | -                                            (candidate_item && path_startswith(j->path, candidate_item->path) && (fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0)))
 | ||||||
|  | +                                        if (candidate_item
 | ||||||
|  | +                                            ? (path_startswith(j->path, candidate_item->path) && fnmatch(i->path, j->path, FNM_PATHNAME | FNM_PERIOD) == 0)
 | ||||||
|  | +                                            : path_startswith(i->path, j->path) != NULL)
 | ||||||
|  |                                                  candidate_item = j; | ||||||
|  |                                  } | ||||||
|  |   | ||||||
| @ -0,0 +1,160 @@ | |||||||
|  | From 4871d0807e4add56258633d3c3452b0ee5cc8f99 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl> | ||||||
|  | Date: Wed, 7 Apr 2021 22:35:19 +0200 | ||||||
|  | Subject: [PATCH] TEST-22-TMPFILES: add reproducer for bug with X | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 1672be86021b5ae8e80d095409a4fffcba7cbb75) | ||||||
|  | 
 | ||||||
|  | Related: #1944468 | ||||||
|  | ---
 | ||||||
|  |  test/TEST-22-TMPFILES/test-11.sh | 141 +++++++++++++++++++++++++++++++ | ||||||
|  |  1 file changed, 141 insertions(+) | ||||||
|  |  create mode 100755 test/TEST-22-TMPFILES/test-11.sh | ||||||
|  | 
 | ||||||
|  | diff --git a/test/TEST-22-TMPFILES/test-11.sh b/test/TEST-22-TMPFILES/test-11.sh
 | ||||||
|  | new file mode 100755 | ||||||
|  | index 0000000000..21ef210cd1
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/test/TEST-22-TMPFILES/test-11.sh
 | ||||||
|  | @@ -0,0 +1,141 @@
 | ||||||
|  | +#! /bin/bash
 | ||||||
|  | +
 | ||||||
|  | +set -e
 | ||||||
|  | +set -x
 | ||||||
|  | +
 | ||||||
|  | +rm -fr /tmp/x
 | ||||||
|  | +mkdir  /tmp/x
 | ||||||
|  | +
 | ||||||
|  | +#
 | ||||||
|  | +# 'x'
 | ||||||
|  | +#
 | ||||||
|  | +mkdir -p /tmp/x/{1,2}
 | ||||||
|  | +touch /tmp/x/1/{x1,x2} /tmp/x/2/{y1,y2} /tmp/x/{z1,z2}
 | ||||||
|  | +
 | ||||||
|  | +systemd-tmpfiles --clean - <<EOF
 | ||||||
|  | +d /tmp/x - - - 0
 | ||||||
|  | +x /tmp/x/1
 | ||||||
|  | +EOF
 | ||||||
|  | +
 | ||||||
|  | +find /tmp/x | sort
 | ||||||
|  | +test -d /tmp/x/1
 | ||||||
|  | +test -f /tmp/x/1/x1
 | ||||||
|  | +test -f /tmp/x/1/x2
 | ||||||
|  | +test ! -d /tmp/x/2
 | ||||||
|  | +test ! -f /tmp/x/2/x1
 | ||||||
|  | +test ! -f /tmp/x/2/x2
 | ||||||
|  | +test ! -f /tmp/x/z1
 | ||||||
|  | +test ! -f /tmp/x/z2
 | ||||||
|  | +
 | ||||||
|  | +#
 | ||||||
|  | +# 'X'
 | ||||||
|  | +#
 | ||||||
|  | +
 | ||||||
|  | +mkdir -p /tmp/x/{1,2}
 | ||||||
|  | +touch /tmp/x/1/{x1,x2} /tmp/x/2/{y1,y2} /tmp/x/{z1,z2}
 | ||||||
|  | +
 | ||||||
|  | +systemd-tmpfiles --clean - <<EOF
 | ||||||
|  | +d /tmp/x - - - 0
 | ||||||
|  | +X /tmp/x/1
 | ||||||
|  | +EOF
 | ||||||
|  | +
 | ||||||
|  | +find /tmp/x | sort
 | ||||||
|  | +test -d /tmp/x/1
 | ||||||
|  | +test ! -f /tmp/x/1/x1
 | ||||||
|  | +test ! -f /tmp/x/1/x2
 | ||||||
|  | +test ! -d /tmp/x/2
 | ||||||
|  | +test ! -f /tmp/x/2/x1
 | ||||||
|  | +test ! -f /tmp/x/2/x2
 | ||||||
|  | +test ! -f /tmp/x/z1
 | ||||||
|  | +test ! -f /tmp/x/z2
 | ||||||
|  | +
 | ||||||
|  | +#
 | ||||||
|  | +# 'x' with glob
 | ||||||
|  | +#
 | ||||||
|  | +
 | ||||||
|  | +mkdir -p /tmp/x/{1,2}
 | ||||||
|  | +touch /tmp/x/1/{x1,x2} /tmp/x/2/{y1,y2} /tmp/x/{z1,z2}
 | ||||||
|  | +
 | ||||||
|  | +systemd-tmpfiles --clean - <<EOF
 | ||||||
|  | +d /tmp/x - - - 0
 | ||||||
|  | +x /tmp/x/[1345]
 | ||||||
|  | +x /tmp/x/z*
 | ||||||
|  | +EOF
 | ||||||
|  | +
 | ||||||
|  | +find /tmp/x | sort
 | ||||||
|  | +test -d /tmp/x/1
 | ||||||
|  | +test -f /tmp/x/1/x1
 | ||||||
|  | +test -f /tmp/x/1/x2
 | ||||||
|  | +test ! -d /tmp/x/2
 | ||||||
|  | +test ! -f /tmp/x/2/x1
 | ||||||
|  | +test ! -f /tmp/x/2/x2
 | ||||||
|  | +test -f /tmp/x/z1
 | ||||||
|  | +test -f /tmp/x/z2
 | ||||||
|  | +
 | ||||||
|  | +#
 | ||||||
|  | +# 'X' with glob
 | ||||||
|  | +#
 | ||||||
|  | +
 | ||||||
|  | +mkdir -p /tmp/x/{1,2}
 | ||||||
|  | +touch /tmp/x/1/{x1,x2} /tmp/x/2/{y1,y2} /tmp/x/{z1,z2}
 | ||||||
|  | +
 | ||||||
|  | +systemd-tmpfiles --clean - <<EOF
 | ||||||
|  | +d /tmp/x - - - 0
 | ||||||
|  | +X /tmp/x/[1345]
 | ||||||
|  | +X /tmp/x/?[12]
 | ||||||
|  | +EOF
 | ||||||
|  | +
 | ||||||
|  | +find /tmp/x | sort
 | ||||||
|  | +test -d /tmp/x/1
 | ||||||
|  | +test ! -f /tmp/x/1/x1
 | ||||||
|  | +test ! -f /tmp/x/1/x2
 | ||||||
|  | +test ! -d /tmp/x/2
 | ||||||
|  | +test ! -f /tmp/x/2/x1
 | ||||||
|  | +test ! -f /tmp/x/2/x2
 | ||||||
|  | +test -f /tmp/x/z1
 | ||||||
|  | +test -f /tmp/x/z2
 | ||||||
|  | +
 | ||||||
|  | +#
 | ||||||
|  | +# 'x' with 'r'
 | ||||||
|  | +#
 | ||||||
|  | +
 | ||||||
|  | +mkdir -p /tmp/x/{1,2}/a
 | ||||||
|  | +touch /tmp/x/1/a/{x1,x2} /tmp/x/2/a/{y1,y2}
 | ||||||
|  | +
 | ||||||
|  | +systemd-tmpfiles --clean - <<EOF
 | ||||||
|  | +# x/X is not supposed to influence r
 | ||||||
|  | +x /tmp/x/1/a
 | ||||||
|  | +X /tmp/x/2/a
 | ||||||
|  | +r /tmp/x/1
 | ||||||
|  | +r /tmp/x/2
 | ||||||
|  | +EOF
 | ||||||
|  | +
 | ||||||
|  | +find /tmp/x | sort
 | ||||||
|  | +test -d /tmp/x/1
 | ||||||
|  | +test -d /tmp/x/1/a
 | ||||||
|  | +test -f /tmp/x/1/a/x1
 | ||||||
|  | +test -f /tmp/x/1/a/x2
 | ||||||
|  | +test -f /tmp/x/2/a/y1
 | ||||||
|  | +test -f /tmp/x/2/a/y2
 | ||||||
|  | +
 | ||||||
|  | +#
 | ||||||
|  | +# 'x' with 'R'
 | ||||||
|  | +#
 | ||||||
|  | +
 | ||||||
|  | +mkdir -p /tmp/x/{1,2}/a
 | ||||||
|  | +touch /tmp/x/1/a/{x1,x2} /tmp/x/2/a/{y1,y2}
 | ||||||
|  | +
 | ||||||
|  | +systemd-tmpfiles --remove - <<EOF
 | ||||||
|  | +# X is not supposed to influence R
 | ||||||
|  | +X /tmp/x/1/a
 | ||||||
|  | +X /tmp/x/2/a
 | ||||||
|  | +R /tmp/x/1
 | ||||||
|  | +EOF
 | ||||||
|  | +
 | ||||||
|  | +find /tmp/x | sort
 | ||||||
|  | +test ! -d /tmp/x/1
 | ||||||
|  | +test ! -d /tmp/x/1/a
 | ||||||
|  | +test ! -f /tmp/x/1/a/x1
 | ||||||
|  | +test ! -f /tmp/x/1/a/x2
 | ||||||
|  | +test -f /tmp/x/2/a/y1
 | ||||||
|  | +test -f /tmp/x/2/a/y2
 | ||||||
| @ -0,0 +1,36 @@ | |||||||
|  | From 858519383fec2b3fadc1b8423214f703d69d6a6c Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Lennart Poettering <lennart@poettering.net> | ||||||
|  | Date: Wed, 22 Apr 2020 21:52:22 +0200 | ||||||
|  | Subject: [PATCH] core: make sure we don't get confused when setting TERM for a | ||||||
|  |  tty fd | ||||||
|  | 
 | ||||||
|  | Fixes: #15344 | ||||||
|  | (cherry picked from commit e8cf09b2a2ad0d48e5493050d54251d5f512d9b6) | ||||||
|  | 
 | ||||||
|  | Resolves: #2045307 | ||||||
|  | ---
 | ||||||
|  |  src/core/execute.c | 9 +++++---- | ||||||
|  |  1 file changed, 5 insertions(+), 4 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/core/execute.c b/src/core/execute.c
 | ||||||
|  | index d528d08830..a104294966 100644
 | ||||||
|  | --- a/src/core/execute.c
 | ||||||
|  | +++ b/src/core/execute.c
 | ||||||
|  | @@ -1709,12 +1709,13 @@ static int build_environment(
 | ||||||
|  |   | ||||||
|  |                  tty_path = exec_context_tty_path(c); | ||||||
|  |   | ||||||
|  | -                /* If we are forked off PID 1 and we are supposed to operate on /dev/console, then let's try to inherit
 | ||||||
|  | -                 * the $TERM set for PID 1. This is useful for containers so that the $TERM the container manager
 | ||||||
|  | -                 * passes to PID 1 ends up all the way in the console login shown. */
 | ||||||
|  | +                /* If we are forked off PID 1 and we are supposed to operate on /dev/console, then let's try
 | ||||||
|  | +                 * to inherit the $TERM set for PID 1. This is useful for containers so that the $TERM the
 | ||||||
|  | +                 * container manager passes to PID 1 ends up all the way in the console login shown. */
 | ||||||
|  |   | ||||||
|  | -                if (path_equal(tty_path, "/dev/console") && getppid() == 1)
 | ||||||
|  | +                if (path_equal_ptr(tty_path, "/dev/console") && getppid() == 1)
 | ||||||
|  |                          term = getenv("TERM"); | ||||||
|  | +
 | ||||||
|  |                  if (!term) | ||||||
|  |                          term = default_term_for_tty(tty_path); | ||||||
|  |   | ||||||
| @ -0,0 +1,37 @@ | |||||||
|  | From cfa7b3d0a1900b725e5489dfec2c39abb8569c29 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
|  | Date: Wed, 28 Nov 2018 14:10:04 +0900 | ||||||
|  | Subject: [PATCH] hash-funcs: introduce macro to create typesafe hash_ops | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit d1005d1c0050d3dc3a24c054bac4c4916073cbba) | ||||||
|  | 
 | ||||||
|  | Resolves: #2037807 | ||||||
|  | ---
 | ||||||
|  |  src/basic/hash-funcs.h | 14 ++++++++++++++ | ||||||
|  |  1 file changed, 14 insertions(+) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/hash-funcs.h b/src/basic/hash-funcs.h
 | ||||||
|  | index 5e5989f021..2ff687e5f9 100644
 | ||||||
|  | --- a/src/basic/hash-funcs.h
 | ||||||
|  | +++ b/src/basic/hash-funcs.h
 | ||||||
|  | @@ -13,6 +13,20 @@ struct hash_ops {
 | ||||||
|  |          compare_func_t compare; | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | +#define _DEFINE_HASH_OPS(uq, name, type, hash_func, compare_func, scope) \
 | ||||||
|  | +        _unused_ static void (* UNIQ_T(static_hash_wrapper, uq))(const type *, struct siphash *) = hash_func; \
 | ||||||
|  | +        _unused_ static int (* UNIQ_T(static_compare_wrapper, uq))(const type *, const type *) = compare_func; \
 | ||||||
|  | +        scope const struct hash_ops name = {                            \
 | ||||||
|  | +                .hash = (hash_func_t) hash_func,                        \
 | ||||||
|  | +                .compare = (compare_func_t) compare_func,               \
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_HASH_OPS(name, type, hash_func, compare_func)            \
 | ||||||
|  | +        _DEFINE_HASH_OPS(UNIQ, name, type, hash_func, compare_func,)
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_PRIVATE_HASH_OPS(name, type, hash_func, compare_func)    \
 | ||||||
|  | +        _DEFINE_HASH_OPS(UNIQ, name, type, hash_func, compare_func, static)
 | ||||||
|  | +
 | ||||||
|  |  void string_hash_func(const void *p, struct siphash *state); | ||||||
|  |  int string_compare_func(const void *a, const void *b) _pure_; | ||||||
|  |  extern const struct hash_ops string_hash_ops; | ||||||
							
								
								
									
										369
									
								
								SOURCES/0734-hash-func-add-destructors-for-key-and-value.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										369
									
								
								SOURCES/0734-hash-func-add-destructors-for-key-and-value.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,369 @@ | |||||||
|  | From 3bee193141bdf3106732a2c925ffaf5ce48f0ecb Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Yu Watanabe <watanabe.yu+github@gmail.com> | ||||||
|  | Date: Tue, 27 Nov 2018 22:25:40 +0900 | ||||||
|  | Subject: [PATCH] hash-func: add destructors for key and value | ||||||
|  | 
 | ||||||
|  | If they are set, then they are called in hashmap_clear() or | ||||||
|  | hashmap_free(). | ||||||
|  | 
 | ||||||
|  | (cherry picked from commit 59a5cda7b904cd7ef9853bda15b498bbc0577524) | ||||||
|  | 
 | ||||||
|  | Resolves: #2037807 | ||||||
|  | ---
 | ||||||
|  |  src/basic/hash-funcs.h  | 54 ++++++++++++++++++++++++++--- | ||||||
|  |  src/basic/hashmap.c     | 76 +++++++++++------------------------------ | ||||||
|  |  src/basic/hashmap.h     | 50 ++++++++++++++++++--------- | ||||||
|  |  src/basic/ordered-set.h |  6 ++-- | ||||||
|  |  src/basic/set.h         | 10 +++--- | ||||||
|  |  5 files changed, 109 insertions(+), 87 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/basic/hash-funcs.h b/src/basic/hash-funcs.h
 | ||||||
|  | index 2ff687e5f9..2d3125d0f9 100644
 | ||||||
|  | --- a/src/basic/hash-funcs.h
 | ||||||
|  | +++ b/src/basic/hash-funcs.h
 | ||||||
|  | @@ -1,7 +1,7 @@
 | ||||||
|  |  /* SPDX-License-Identifier: LGPL-2.1+ */ | ||||||
|  |  #pragma once | ||||||
|  |   | ||||||
|  | -
 | ||||||
|  | +#include "alloc-util.h"
 | ||||||
|  |  #include "macro.h" | ||||||
|  |  #include "siphash24.h" | ||||||
|  |   | ||||||
|  | @@ -11,21 +11,67 @@ typedef int (*compare_func_t)(const void *a, const void *b);
 | ||||||
|  |  struct hash_ops { | ||||||
|  |          hash_func_t hash; | ||||||
|  |          compare_func_t compare; | ||||||
|  | +        free_func_t free_key;
 | ||||||
|  | +        free_func_t free_value;
 | ||||||
|  |  }; | ||||||
|  |   | ||||||
|  | -#define _DEFINE_HASH_OPS(uq, name, type, hash_func, compare_func, scope) \
 | ||||||
|  | +#define _DEFINE_HASH_OPS(uq, name, type, hash_func, compare_func, free_key_func, free_value_func, scope) \
 | ||||||
|  |          _unused_ static void (* UNIQ_T(static_hash_wrapper, uq))(const type *, struct siphash *) = hash_func; \ | ||||||
|  |          _unused_ static int (* UNIQ_T(static_compare_wrapper, uq))(const type *, const type *) = compare_func; \ | ||||||
|  |          scope const struct hash_ops name = {                            \ | ||||||
|  |                  .hash = (hash_func_t) hash_func,                        \ | ||||||
|  |                  .compare = (compare_func_t) compare_func,               \ | ||||||
|  | +                .free_key = free_key_func,                              \
 | ||||||
|  | +                .free_value = free_value_func,                          \
 | ||||||
|  | +        }
 | ||||||
|  | +
 | ||||||
|  | +#define _DEFINE_FREE_FUNC(uq, type, wrapper_name, func)                 \
 | ||||||
|  | +        /* Type-safe free function */                                   \
 | ||||||
|  | +        static void UNIQ_T(wrapper_name, uq)(void *a) {                 \
 | ||||||
|  | +                type *_a = a;                                           \
 | ||||||
|  | +                func(_a);                                               \
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | +#define _DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(uq, name, type, hash_func, compare_func, free_func, scope) \
 | ||||||
|  | +        _DEFINE_FREE_FUNC(uq, type, static_free_wrapper, free_func);    \
 | ||||||
|  | +        _DEFINE_HASH_OPS(uq, name, type, hash_func, compare_func,       \
 | ||||||
|  | +                         UNIQ_T(static_free_wrapper, uq), NULL, scope)
 | ||||||
|  | +
 | ||||||
|  | +#define _DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(uq, name, type, hash_func, compare_func, type_value, free_func, scope) \
 | ||||||
|  | +        _DEFINE_FREE_FUNC(uq, type_value, static_free_wrapper, free_func); \
 | ||||||
|  | +        _DEFINE_HASH_OPS(uq, name, type, hash_func, compare_func,       \
 | ||||||
|  | +                         NULL, UNIQ_T(static_free_wrapper, uq), scope)
 | ||||||
|  | +
 | ||||||
|  | +#define _DEFINE_HASH_OPS_FULL(uq, name, type, hash_func, compare_func, free_key_func, type_value, free_value_func, scope) \
 | ||||||
|  | +        _DEFINE_FREE_FUNC(uq, type, static_free_key_wrapper, free_key_func); \
 | ||||||
|  | +        _DEFINE_FREE_FUNC(uq, type_value, static_free_value_wrapper, free_value_func); \
 | ||||||
|  | +        _DEFINE_HASH_OPS(uq, name, type, hash_func, compare_func,       \
 | ||||||
|  | +                         UNIQ_T(static_free_key_wrapper, uq),           \
 | ||||||
|  | +                         UNIQ_T(static_free_value_wrapper, uq), scope)
 | ||||||
|  | +
 | ||||||
|  |  #define DEFINE_HASH_OPS(name, type, hash_func, compare_func)            \ | ||||||
|  | -        _DEFINE_HASH_OPS(UNIQ, name, type, hash_func, compare_func,)
 | ||||||
|  | +        _DEFINE_HASH_OPS(UNIQ, name, type, hash_func, compare_func, NULL, NULL,)
 | ||||||
|  |   | ||||||
|  |  #define DEFINE_PRIVATE_HASH_OPS(name, type, hash_func, compare_func)    \ | ||||||
|  | -        _DEFINE_HASH_OPS(UNIQ, name, type, hash_func, compare_func, static)
 | ||||||
|  | +        _DEFINE_HASH_OPS(UNIQ, name, type, hash_func, compare_func, NULL, NULL, static)
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(name, type, hash_func, compare_func, free_func) \
 | ||||||
|  | +        _DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(UNIQ, name, type, hash_func, compare_func, free_func,)
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(name, type, hash_func, compare_func, free_func) \
 | ||||||
|  | +        _DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(UNIQ, name, type, hash_func, compare_func, free_func, static)
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(name, type, hash_func, compare_func, value_type, free_func) \
 | ||||||
|  | +        _DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(UNIQ, name, type, hash_func, compare_func, value_type, free_func,)
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(name, type, hash_func, compare_func, value_type, free_func) \
 | ||||||
|  | +        _DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(UNIQ, name, type, hash_func, compare_func, value_type, free_func, static)
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_HASH_OPS_FULL(name, type, hash_func, compare_func, free_key_func, value_type, free_value_func) \
 | ||||||
|  | +        _DEFINE_HASH_OPS_FULL(UNIQ, name, type, hash_func, compare_func, free_key_func, value_type, free_value_func,)
 | ||||||
|  | +
 | ||||||
|  | +#define DEFINE_PRIVATE_HASH_OPS_FULL(name, type, hash_func, compare_func, free_key_func, value_type, free_value_func) \
 | ||||||
|  | +        _DEFINE_HASH_OPS_FULL(UNIQ, name, type, hash_func, compare_func, free_key_func, value_type, free_value_func, static)
 | ||||||
|  |   | ||||||
|  |  void string_hash_func(const void *p, struct siphash *state); | ||||||
|  |  int string_compare_func(const void *a, const void *b) _pure_; | ||||||
|  | diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c
 | ||||||
|  | index 69a7d70b04..7c508086f0 100644
 | ||||||
|  | --- a/src/basic/hashmap.c
 | ||||||
|  | +++ b/src/basic/hashmap.c
 | ||||||
|  | @@ -863,47 +863,38 @@ static void hashmap_free_no_clear(HashmapBase *h) {
 | ||||||
|  |                  free(h); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -HashmapBase *internal_hashmap_free(HashmapBase *h) {
 | ||||||
|  | -
 | ||||||
|  | -        /* Free the hashmap, but nothing in it */
 | ||||||
|  | -
 | ||||||
|  | +HashmapBase *internal_hashmap_free(HashmapBase *h, free_func_t default_free_key, free_func_t default_free_value) {
 | ||||||
|  |          if (h) { | ||||||
|  | -                internal_hashmap_clear(h);
 | ||||||
|  | +                internal_hashmap_clear(h, default_free_key, default_free_value);
 | ||||||
|  |                  hashmap_free_no_clear(h); | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          return NULL; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -HashmapBase *internal_hashmap_free_free(HashmapBase *h) {
 | ||||||
|  | +void internal_hashmap_clear(HashmapBase *h, free_func_t default_free_key, free_func_t default_free_value) {
 | ||||||
|  | +        free_func_t free_key, free_value;
 | ||||||
|  | +        if (!h)
 | ||||||
|  | +                return;
 | ||||||
|  |   | ||||||
|  | -        /* Free the hashmap and all data objects in it, but not the
 | ||||||
|  | -         * keys */
 | ||||||
|  | +        free_key = h->hash_ops->free_key ?: default_free_key;
 | ||||||
|  | +        free_value = h->hash_ops->free_value ?: default_free_value;
 | ||||||
|  |   | ||||||
|  | -        if (h) {
 | ||||||
|  | -                internal_hashmap_clear_free(h);
 | ||||||
|  | -                hashmap_free_no_clear(h);
 | ||||||
|  | -        }
 | ||||||
|  | -
 | ||||||
|  | -        return NULL;
 | ||||||
|  | -}
 | ||||||
|  | +        if (free_key || free_value) {
 | ||||||
|  | +                unsigned idx;
 | ||||||
|  |   | ||||||
|  | -Hashmap *hashmap_free_free_free(Hashmap *h) {
 | ||||||
|  | +                for (idx = skip_free_buckets(h, 0); idx != IDX_NIL;
 | ||||||
|  | +                     idx = skip_free_buckets(h, idx + 1)) {
 | ||||||
|  | +                        struct hashmap_base_entry *e = bucket_at(h, idx);
 | ||||||
|  |   | ||||||
|  | -        /* Free the hashmap and all data and key objects in it */
 | ||||||
|  | +                        if (free_key)
 | ||||||
|  | +                                free_key((void *) e->key);
 | ||||||
|  |   | ||||||
|  | -        if (h) {
 | ||||||
|  | -                hashmap_clear_free_free(h);
 | ||||||
|  | -                hashmap_free_no_clear(HASHMAP_BASE(h));
 | ||||||
|  | +                        if (free_value)
 | ||||||
|  | +                                free_value(entry_value(h, e));
 | ||||||
|  | +                }
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | -        return NULL;
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  | -void internal_hashmap_clear(HashmapBase *h) {
 | ||||||
|  | -        if (!h)
 | ||||||
|  | -                return;
 | ||||||
|  | -
 | ||||||
|  |          if (h->has_indirect) { | ||||||
|  |                  free(h->indirect.storage); | ||||||
|  |                  h->has_indirect = false; | ||||||
|  | @@ -920,35 +911,6 @@ void internal_hashmap_clear(HashmapBase *h) {
 | ||||||
|  |          base_set_dirty(h); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -void internal_hashmap_clear_free(HashmapBase *h) {
 | ||||||
|  | -        unsigned idx;
 | ||||||
|  | -
 | ||||||
|  | -        if (!h)
 | ||||||
|  | -                return;
 | ||||||
|  | -
 | ||||||
|  | -        for (idx = skip_free_buckets(h, 0); idx != IDX_NIL;
 | ||||||
|  | -             idx = skip_free_buckets(h, idx + 1))
 | ||||||
|  | -                free(entry_value(h, bucket_at(h, idx)));
 | ||||||
|  | -
 | ||||||
|  | -        internal_hashmap_clear(h);
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  | -void hashmap_clear_free_free(Hashmap *h) {
 | ||||||
|  | -        unsigned idx;
 | ||||||
|  | -
 | ||||||
|  | -        if (!h)
 | ||||||
|  | -                return;
 | ||||||
|  | -
 | ||||||
|  | -        for (idx = skip_free_buckets(HASHMAP_BASE(h), 0); idx != IDX_NIL;
 | ||||||
|  | -             idx = skip_free_buckets(HASHMAP_BASE(h), idx + 1)) {
 | ||||||
|  | -                struct plain_hashmap_entry *e = plain_bucket_at(h, idx);
 | ||||||
|  | -                free((void*)e->b.key);
 | ||||||
|  | -                free(e->value);
 | ||||||
|  | -        }
 | ||||||
|  | -
 | ||||||
|  | -        internal_hashmap_clear(HASHMAP_BASE(h));
 | ||||||
|  | -}
 | ||||||
|  | -
 | ||||||
|  |  static int resize_buckets(HashmapBase *h, unsigned entries_add); | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  | @@ -1771,7 +1733,7 @@ HashmapBase *internal_hashmap_copy(HashmapBase *h) {
 | ||||||
|  |          } | ||||||
|  |   | ||||||
|  |          if (r < 0) { | ||||||
|  | -                internal_hashmap_free(copy);
 | ||||||
|  | +                internal_hashmap_free(copy, false, false);
 | ||||||
|  |                  return NULL; | ||||||
|  |          } | ||||||
|  |   | ||||||
|  | diff --git a/src/basic/hashmap.h b/src/basic/hashmap.h
 | ||||||
|  | index 5c70c102d7..9e4772b497 100644
 | ||||||
|  | --- a/src/basic/hashmap.h
 | ||||||
|  | +++ b/src/basic/hashmap.h
 | ||||||
|  | @@ -23,6 +23,8 @@
 | ||||||
|  |   | ||||||
|  |  #define HASH_KEY_SIZE 16 | ||||||
|  |   | ||||||
|  | +typedef void* (*hashmap_destroy_t)(void *p);
 | ||||||
|  | +
 | ||||||
|  |  /* The base type for all hashmap and set types. Many functions in the | ||||||
|  |   * implementation take (HashmapBase*) parameters and are run-time polymorphic, | ||||||
|  |   * though the API is not meant to be polymorphic (do not call functions | ||||||
|  | @@ -88,25 +90,33 @@ OrderedHashmap *internal_ordered_hashmap_new(const struct hash_ops *hash_ops  HA
 | ||||||
|  |  #define hashmap_new(ops) internal_hashmap_new(ops  HASHMAP_DEBUG_SRC_ARGS) | ||||||
|  |  #define ordered_hashmap_new(ops) internal_ordered_hashmap_new(ops  HASHMAP_DEBUG_SRC_ARGS) | ||||||
|  |   | ||||||
|  | -HashmapBase *internal_hashmap_free(HashmapBase *h);
 | ||||||
|  | +HashmapBase *internal_hashmap_free(HashmapBase *h, free_func_t default_free_key, free_func_t default_free_value);
 | ||||||
|  |  static inline Hashmap *hashmap_free(Hashmap *h) { | ||||||
|  | -        return (void*)internal_hashmap_free(HASHMAP_BASE(h));
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), NULL, NULL);
 | ||||||
|  |  } | ||||||
|  |  static inline OrderedHashmap *ordered_hashmap_free(OrderedHashmap *h) { | ||||||
|  | -        return (void*)internal_hashmap_free(HASHMAP_BASE(h));
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), NULL, NULL);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -HashmapBase *internal_hashmap_free_free(HashmapBase *h);
 | ||||||
|  |  static inline Hashmap *hashmap_free_free(Hashmap *h) { | ||||||
|  | -        return (void*)internal_hashmap_free_free(HASHMAP_BASE(h));
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), NULL, free);
 | ||||||
|  |  } | ||||||
|  |  static inline OrderedHashmap *ordered_hashmap_free_free(OrderedHashmap *h) { | ||||||
|  | -        return (void*)internal_hashmap_free_free(HASHMAP_BASE(h));
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), NULL, free);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -Hashmap *hashmap_free_free_free(Hashmap *h);
 | ||||||
|  | +static inline Hashmap *hashmap_free_free_key(Hashmap *h) {
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), free, NULL);
 | ||||||
|  | +}
 | ||||||
|  | +static inline OrderedHashmap *ordered_hashmap_free_free_key(OrderedHashmap *h) {
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), free, NULL);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +static inline Hashmap *hashmap_free_free_free(Hashmap *h) {
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), free, free);
 | ||||||
|  | +}
 | ||||||
|  |  static inline OrderedHashmap *ordered_hashmap_free_free_free(OrderedHashmap *h) { | ||||||
|  | -        return (void*)hashmap_free_free_free(PLAIN_HASHMAP(h));
 | ||||||
|  | +        return (void*) internal_hashmap_free(HASHMAP_BASE(h), free, free);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  IteratedCache *iterated_cache_free(IteratedCache *cache); | ||||||
|  | @@ -259,25 +269,33 @@ static inline bool ordered_hashmap_iterate(OrderedHashmap *h, Iterator *i, void
 | ||||||
|  |          return internal_hashmap_iterate(HASHMAP_BASE(h), i, value, key); | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -void internal_hashmap_clear(HashmapBase *h);
 | ||||||
|  | +void internal_hashmap_clear(HashmapBase *h, free_func_t default_free_key, free_func_t default_free_value);
 | ||||||
|  |  static inline void hashmap_clear(Hashmap *h) { | ||||||
|  | -        internal_hashmap_clear(HASHMAP_BASE(h));
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), NULL, NULL);
 | ||||||
|  |  } | ||||||
|  |  static inline void ordered_hashmap_clear(OrderedHashmap *h) { | ||||||
|  | -        internal_hashmap_clear(HASHMAP_BASE(h));
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), NULL, NULL);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -void internal_hashmap_clear_free(HashmapBase *h);
 | ||||||
|  |  static inline void hashmap_clear_free(Hashmap *h) { | ||||||
|  | -        internal_hashmap_clear_free(HASHMAP_BASE(h));
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), NULL, free);
 | ||||||
|  |  } | ||||||
|  |  static inline void ordered_hashmap_clear_free(OrderedHashmap *h) { | ||||||
|  | -        internal_hashmap_clear_free(HASHMAP_BASE(h));
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), NULL, free);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -void hashmap_clear_free_free(Hashmap *h);
 | ||||||
|  | +static inline void hashmap_clear_free_key(Hashmap *h) {
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), free, NULL);
 | ||||||
|  | +}
 | ||||||
|  | +static inline void ordered_hashmap_clear_free_key(OrderedHashmap *h) {
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), free, NULL);
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +static inline void hashmap_clear_free_free(Hashmap *h) {
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), free, free);
 | ||||||
|  | +}
 | ||||||
|  |  static inline void ordered_hashmap_clear_free_free(OrderedHashmap *h) { | ||||||
|  | -        hashmap_clear_free_free(PLAIN_HASHMAP(h));
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(h), free, free);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* | ||||||
|  | diff --git a/src/basic/ordered-set.h b/src/basic/ordered-set.h
 | ||||||
|  | index e7c054d8e4..7cbb71819b 100644
 | ||||||
|  | --- a/src/basic/ordered-set.h
 | ||||||
|  | +++ b/src/basic/ordered-set.h
 | ||||||
|  | @@ -21,13 +21,11 @@ static inline int ordered_set_ensure_allocated(OrderedSet **s, const struct hash
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static inline OrderedSet* ordered_set_free(OrderedSet *s) { | ||||||
|  | -        ordered_hashmap_free((OrderedHashmap*) s);
 | ||||||
|  | -        return NULL;
 | ||||||
|  | +        return (OrderedSet*) ordered_hashmap_free((OrderedHashmap*) s);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static inline OrderedSet* ordered_set_free_free(OrderedSet *s) { | ||||||
|  | -        ordered_hashmap_free_free((OrderedHashmap*) s);
 | ||||||
|  | -        return NULL;
 | ||||||
|  | +        return (OrderedSet*) ordered_hashmap_free_free((OrderedHashmap*) s);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static inline int ordered_set_put(OrderedSet *s, void *p) { | ||||||
|  | diff --git a/src/basic/set.h b/src/basic/set.h
 | ||||||
|  | index 664713810d..8e12670a6e 100644
 | ||||||
|  | --- a/src/basic/set.h
 | ||||||
|  | +++ b/src/basic/set.h
 | ||||||
|  | @@ -9,13 +9,11 @@ Set *internal_set_new(const struct hash_ops *hash_ops HASHMAP_DEBUG_PARAMS);
 | ||||||
|  |  #define set_new(ops) internal_set_new(ops HASHMAP_DEBUG_SRC_ARGS) | ||||||
|  |   | ||||||
|  |  static inline Set *set_free(Set *s) { | ||||||
|  | -        internal_hashmap_free(HASHMAP_BASE(s));
 | ||||||
|  | -        return NULL;
 | ||||||
|  | +        return (Set*) internal_hashmap_free(HASHMAP_BASE(s), NULL, NULL);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static inline Set *set_free_free(Set *s) { | ||||||
|  | -        internal_hashmap_free_free(HASHMAP_BASE(s));
 | ||||||
|  | -        return NULL;
 | ||||||
|  | +        return (Set*) internal_hashmap_free(HASHMAP_BASE(s), free, NULL);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* no set_free_free_free */ | ||||||
|  | @@ -76,11 +74,11 @@ static inline unsigned set_buckets(Set *s) {
 | ||||||
|  |  bool set_iterate(Set *s, Iterator *i, void **value); | ||||||
|  |   | ||||||
|  |  static inline void set_clear(Set *s) { | ||||||
|  | -        internal_hashmap_clear(HASHMAP_BASE(s));
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(s), NULL, NULL);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  static inline void set_clear_free(Set *s) { | ||||||
|  | -        internal_hashmap_clear_free(HASHMAP_BASE(s));
 | ||||||
|  | +        internal_hashmap_clear(HASHMAP_BASE(s), free, NULL);
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  |  /* no set_clear_free_free */ | ||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue
	
	Block a user