Control: tags -1 + confirmed patch On Mon, Feb 07, 2022 at 08:57:22PM +0100, Guillem Jover wrote: > Package: linux-perf > Version: 5.16.3-1~exp1 > Severity: serious > > Hi! > > This package has code in its postrm maintscript, which unconditionally > removes the diversion, which breaks as the rename cannot be performed > due to linux-base owning the file, and dpkg-divert refusing to > overwrite it. This is the error shown: > > ,--- > # dpkg -i linux-perf_5.16.7-1_amd64.deb > (Reading database ... 280997 files and directories currently installed.) > Preparing to unpack linux-perf_5.16.7-1_amd64.deb ... > Leaving 'diversion of /usr/bin/perf to /usr/bin/perf.wrapper by linux-perf' > Leaving 'diversion of /usr/share/bash-completion/completions/perf to > /usr/share/bash-completion/completions/perf.wrapper by linux-perf' > Leaving 'diversion of /usr/share/man/man1/perf.1.gz to > /usr/share/man/man1/perf.wrapper.1.gz by linux-perf' > Unpacking linux-perf (5.16.7-1) over (5.16.7-1) ... > Removing 'diversion of /usr/bin/perf to /usr/bin/perf.wrapper by linux-perf' > dpkg-divert: error: rename involves overwriting '/usr/bin/perf' with > different file '/usr/bin/perf.wrapper', not allowed > dpkg: warning: old linux-perf package post-removal script subprocess > returned error exit status 2 > dpkg: trying script from the new package instead ... > Removing 'diversion of /usr/bin/perf to /usr/bin/perf.wrapper by linux-perf' > dpkg-divert: error: rename involves overwriting '/usr/bin/perf' with > different file '/usr/bin/perf.wrapper', not allowed > dpkg: error processing archive linux-perf_5.16.7-1_amd64.deb (--install): > new linux-perf package post-removal script subprocess returned error exit > status 2 > Leaving 'diversion of /usr/bin/perf to /usr/bin/perf.wrapper by linux-perf' > Leaving 'diversion of /usr/share/bash-completion/completions/perf to > /usr/share/bash-completion/completions/perf.wrapper by linux-perf' > Leaving 'diversion of /usr/share/man/man1/perf.1.gz to > /usr/share/man/man1/perf.wrapper.1.gz by linux-perf' > Removing 'diversion of /usr/bin/perf to /usr/bin/perf.wrapper by linux-perf' > dpkg-divert: error: rename involves overwriting '/usr/bin/perf' with > different file '/usr/bin/perf.wrapper', not allowed > dpkg: error while cleaning up: > new linux-perf package post-removal script subprocess returned error exit > status 2 > Processing triggers for man-db (2.10.0-2) ... > [main a8458e04] Commit dpkg db updates > 1 file changed, 2 insertions(+), 1 deletion(-) > Errors were encountered while processing: > linux-perf_5.16.7-1_amd64.deb > `--- > > The dpkg-divert calls should be protected to run only on the relevant > actions on all maintscripts.
Need to test it (if I have not done a thinko), but the following should do it. Regards, Salvatore
>From 669eb799ef017db2433511dfa737fad2585c31b0 Mon Sep 17 00:00:00 2001 From: Salvatore Bonaccorso <car...@debian.org> Date: Tue, 8 Feb 2022 13:09:31 +0100 Subject: [PATCH] linux-perf: Protect invocation of dpkg-divert to run only on relevant actions in maintscripts Thanks: Guillem Jover Closes: #1005141 --- debian/changelog | 7 +++++++ debian/templates/perf.postrm.in | 17 ++++++++++------- debian/templates/perf.preinst.in | 17 ++++++++++------- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/debian/changelog b/debian/changelog index 3c1b9aa5b5ef..bd6916c658ed 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,10 @@ +linux (5.16.7-2) UNRELEASED; urgency=medium + + * linux-perf: Protect invocation of dpkg-divert to run only on relevant + actions in maintscripts. Thanks to Guillem Jover (Closes: #1005141) + + -- Salvatore Bonaccorso <car...@debian.org> Tue, 08 Feb 2022 13:11:50 +0100 + linux (5.16.7-1) unstable; urgency=medium * New upstream stable update: diff --git a/debian/templates/perf.postrm.in b/debian/templates/perf.postrm.in index d33fdfef0cce..84a6e3df5ba4 100644 --- a/debian/templates/perf.postrm.in +++ b/debian/templates/perf.postrm.in @@ -8,12 +8,15 @@ if [ "$old_version_suffix" ]; then /usr/share/doc/linux-perf "linux-perf-${old_version_suffix}" 5.16\~rc8-1\~exp1 linux-perf -- "$@" fi -for wrapper in /usr/bin/perf \ - /usr/share/bash-completion/completions/perf \ - /usr/share/man/man1/perf.1.gz; do - diversion="${wrapper%/perf*}/perf.wrapper${wrapper#*/perf}" - dpkg-divert --package linux-perf --divert "$diversion" --rename \ - --remove "$wrapper" -done +if [ "$1" = remove ] +then + for wrapper in /usr/bin/perf \ + /usr/share/bash-completion/completions/perf \ + /usr/share/man/man1/perf.1.gz; do + diversion="${wrapper%/perf*}/perf.wrapper${wrapper#*/perf}" + dpkg-divert --package linux-perf --divert "$diversion" --rename \ + --remove "$wrapper" + done +fi #DEBHELPER# diff --git a/debian/templates/perf.preinst.in b/debian/templates/perf.preinst.in index 6a5ce7df164b..8965a322f2f9 100644 --- a/debian/templates/perf.preinst.in +++ b/debian/templates/perf.preinst.in @@ -8,12 +8,15 @@ if [ "$old_version_suffix" ]; then /usr/share/doc/linux-perf "linux-perf-${old_version_suffix}" 5.16\~rc8-1\~exp1 linux-perf -- "$@" fi -for wrapper in /usr/bin/perf \ - /usr/share/bash-completion/completions/perf \ - /usr/share/man/man1/perf.1.gz; do - diversion="${wrapper%/perf*}/perf.wrapper${wrapper#*/perf}" - dpkg-divert --package linux-perf --divert "$diversion" --rename \ - --add "$wrapper" -done +if [ "$1" = install ] || [ "$1" = upgrade ] +then + for wrapper in /usr/bin/perf \ + /usr/share/bash-completion/completions/perf \ + /usr/share/man/man1/perf.1.gz; do + diversion="${wrapper%/perf*}/perf.wrapper${wrapper#*/perf}" + dpkg-divert --package linux-perf --divert "$diversion" --rename \ + --add "$wrapper" + done +fi #DEBHELPER# -- 2.34.1