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

Reply via email to