From b492db99d60ac0f0403decb3d291d3ddcc435db6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Sun, 31 Jan 2021 14:24:46 +0100 Subject: rpm: simplify daemon-reload trigger The trigger was initially written to use %transfiletriggerun instead of %transfiletriggerpostun because the latter would not fire. It turned out to a buffer overread in rpm that since has been long fixed: https://bugzilla.redhat.com/show_bug.cgi?id=1284645 https://github.com/rpm-software-management/rpm/commit/f6521c50f6836374a0f7995f8f393aaf36e178ea --- src/rpm/triggers.systemd.in | 27 ++++----------------------- src/rpm/triggers.systemd.sh.in | 23 ++++------------------- 2 files changed, 8 insertions(+), 42 deletions(-) (limited to 'src/rpm') diff --git a/src/rpm/triggers.systemd.in b/src/rpm/triggers.systemd.in index 9391ed45a4..1e925cf974 100644 --- a/src/rpm/triggers.systemd.in +++ b/src/rpm/triggers.systemd.in @@ -6,14 +6,13 @@ # The contents of this are an example to be copied into systemd.spec. # -# Minimum rpm version supported: 4.13.0 +# Minimum rpm version supported: 4.14.0 %transfiletriggerin -P 900900 -p -- @systemunitdir@ /etc/systemd/system -- This script will run after any package is initially installed or -- upgraded. We care about the case where a package is initially -- installed, because other cases are covered by the *un scriptlets, -- so sometimes we will reload needlessly. - if posix.access("/run/systemd/system") then pid = posix.fork() if pid == 0 then @@ -23,31 +22,13 @@ if posix.access("/run/systemd/system") then end end -%transfiletriggerun -p -- @systemunitdir@ /etc/systemd/system +%transfiletriggerpostun -P 1000100 -p -- @systemunitdir@ /etc/systemd/system -- On removal, we need to run daemon-reload after any units have been --- removed. %transfiletriggerpostun would be ideal, but it does not get --- executed for some reason. +-- removed. -- On upgrade, we need to run daemon-reload after any new unit files -- have been installed, but before %postun scripts in packages get --- executed. %transfiletriggerun gets the right list of files --- but it is invoked too early (before changes happen). --- %filetriggerpostun happens at the right time, but it fires for --- every package. --- To execute the reload at the right time, we create a state --- file in %transfiletriggerun and execute the daemon-reload in --- the first %filetriggerpostun. - +-- executed. if posix.access("/run/systemd/system") then - posix.mkdir("%{_localstatedir}/lib") - posix.mkdir("%{_localstatedir}/lib/rpm-state") - posix.mkdir("%{_localstatedir}/lib/rpm-state/systemd") - io.open("%{_localstatedir}/lib/rpm-state/systemd/needs-reload", "w") -end - -%filetriggerpostun -P 1000100 -p -- @systemunitdir@ /etc/systemd/system -if posix.access("%{_localstatedir}/lib/rpm-state/systemd/needs-reload") then - posix.unlink("%{_localstatedir}/lib/rpm-state/systemd/needs-reload") - posix.rmdir("%{_localstatedir}/lib/rpm-state/systemd") pid = posix.fork() if pid == 0 then assert(posix.exec("%{_bindir}/systemctl", "daemon-reload")) diff --git a/src/rpm/triggers.systemd.sh.in b/src/rpm/triggers.systemd.sh.in index 13f7cb631d..641afd9ef7 100644 --- a/src/rpm/triggers.systemd.sh.in +++ b/src/rpm/triggers.systemd.sh.in @@ -7,7 +7,7 @@ # The contents of this are an example to be copied into systemd.spec. # -# Minimum rpm version supported: 4.13.0 +# Minimum rpm version supported: 4.14.0 %transfiletriggerin -P 900900 -- @systemunitdir@ /etc/systemd/system # This script will run after any package is initially installed or @@ -18,28 +18,13 @@ if test -d "/run/systemd/system"; then %{_bindir}/systemctl daemon-reload || : fi -%transfiletriggerun -- @systemunitdir@ /etc/systemd/system +%transfiletriggerpostun -P 1000100 -- @systemunitdir@ /etc/systemd/system # On removal, we need to run daemon-reload after any units have been -# removed. %transfiletriggerpostun would be ideal, but it does not get -# executed for some reason. +# removed. # On upgrade, we need to run daemon-reload after any new unit files # have been installed, but before %postun scripts in packages get -# executed. %transfiletriggerun gets the right list of files -# but it is invoked too early (before changes happen). -# %filetriggerpostun happens at the right time, but it fires for -# every package. -# To execute the reload at the right time, we create a state -# file in %transfiletriggerun and execute the daemon-reload in -# the first %filetriggerpostun. - +# executed. if test -d "/run/systemd/system"; then - mkdir -p "%{_localstatedir}/lib/rpm-state/systemd" - touch "%{_localstatedir}/lib/rpm-state/systemd/needs-reload" -fi - -%filetriggerpostun -P 1000100 -- @systemunitdir@ /etc/systemd/system -if test -f "%{_localstatedir}/lib/rpm-state/systemd/needs-reload"; then - rm -rf "%{_localstatedir}/lib/rpm-state/systemd" %{_bindir}/systemctl daemon-reload || : fi -- cgit v1.2.1