This is an automated email from the git hooks/post-receive script. guillem pushed a commit to branch main in repository dpkg.
View the commit online: https://git.dpkg.org/cgit/dpkg/dpkg.git/commit/?id=b7389d6fef8d27e1cabc76b3035db0d575d26b31 commit b7389d6fef8d27e1cabc76b3035db0d575d26b31 Author: Guillem Jover <guil...@debian.org> AuthorDate: Mon Jun 23 19:18:43 2025 +0200 libdpkg: Do not segfault when adding triggers in no-act mode When we activate a trigger by calling the dpkg-trigger command with deferred triggers in place in no-act mode, the code was not opening the deferred triggers file for writing, but continued with the processing, and then the subsequent attempt to write into it caused a segmentation fault. The root problem is that in no-act mode, we should not even attempt to write anything. So we make the print into the file conditional on whether the file handle is not-NULL. Closes: #1108192 Stable-Candidate: 1.20.x 1.21.x 1.22.x --- lib/dpkg/trigdeferred.c | 3 +++ src/Makefile.am | 1 + src/at/local.at | 6 ++++++ src/at/testsuite.at | 4 ++++ src/at/trigger.at | 22 ++++++++++++++++++++++ 5 files changed, 36 insertions(+) diff --git a/lib/dpkg/trigdeferred.c b/lib/dpkg/trigdeferred.c index ae31d6285..e04c673d4 100644 --- a/lib/dpkg/trigdeferred.c +++ b/lib/dpkg/trigdeferred.c @@ -153,6 +153,9 @@ trigdef_update_printf(const char *format, ...) { va_list ap; + if (trig_new_deferred == NULL) + return; + va_start(ap, format); vfprintf(trig_new_deferred, format, ap); va_end(ap); diff --git a/src/Makefile.am b/src/Makefile.am index f5152f83c..6d79078be 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -161,6 +161,7 @@ TESTSUITE_AT += $(srcdir)/at/deb-content.at TESTSUITE_AT += $(srcdir)/at/deb-split.at TESTSUITE_AT += $(srcdir)/at/realpath.at TESTSUITE_AT += $(srcdir)/at/divert.at +TESTSUITE_AT += $(srcdir)/at/trigger.at TESTSUITE_AT += $(srcdir)/at/chdir.at TESTSUITE_AT += $(srcdir)/at/dpkg-arch.at EXTRA_DIST += $(TESTSUITE_AT) diff --git a/src/at/local.at b/src/at/local.at index d5e941525..437209941 100644 --- a/src/at/local.at +++ b/src/at/local.at @@ -140,6 +140,12 @@ m4_define([DPKG_GEN_DB_DIVERSIONS], [ DPKG_GEN_DB_FILE([diversions], [$1]) ]) +# DPKG_GEN_DB_TRIGGERS_FILE([$file], [$contents]) +m4_define([DPKG_GEN_DB_TRIGGERS_FILE], [ + mkdir -p "DPKG_DIR_ADMIN/triggers" + AT_DATA([DPKG_DIR_ADMIN/triggers/$1], [$2]) +]) + # DPKG_GEN_DB_INFO_FILE([$pkg], [$file], [$contents]) m4_define([DPKG_GEN_DB_INFO_FILE], [ mkdir -p "DPKG_DIR_ADMIN/info" diff --git a/src/at/testsuite.at b/src/at/testsuite.at index f36c2f062..a6705d5b5 100644 --- a/src/at/testsuite.at +++ b/src/at/testsuite.at @@ -19,6 +19,10 @@ AT_TESTED([dpkg-divert]) AT_BANNER([Diversions]) m4_include([divert.at]) +AT_TESTED([dpkg-trigger]) +AT_BANNER([Triggers]) +m4_include([trigger.at]) + AT_TESTED([dpkg]) AT_BANNER([Change directory options]) m4_include([chdir.at]) diff --git a/src/at/trigger.at b/src/at/trigger.at new file mode 100644 index 000000000..692a92dd2 --- /dev/null +++ b/src/at/trigger.at @@ -0,0 +1,22 @@ +m4_define([DPKG_DB_TRIGGERS_DEFERRED], [DPKG_DIR_ADMIN/triggers/Unincorp]) +m4_define([DPKG_TRIGGER], [dnl + dpkg-trigger DPKG_OPTIONS_COMMON dnl +]) + +AT_SETUP([dpkg trigger no-act]) +AT_KEYWORDS([dpkg trigger]) + +AT_DATA([ref-deferred], [synthetic-trigger synthetic-package +]) + +DPKG_GEN_DB_TRIGGERS_FILE([Lock], []) +DPKG_GEN_DB_TRIGGERS_FILE([Unincorp], []) + +AT_CHECK([DPKG_TRIGGER --by-package synthetic-package synthetic-trigger], [], []) +DPKG_CHECK_DIFF([DPKG_DB_TRIGGERS_DEFERRED], [ref-deferred]) + +# Check whether we are really doing nothing. +AT_CHECK([DPKG_TRIGGER --by-package synthetic-package --no-act synthetic-trigger], [], []) +DPKG_CHECK_DIFF([DPKG_DB_TRIGGERS_DEFERRED], [ref-deferred]) + +AT_CLEANUP -- Dpkg.Org's dpkg