Package: dpkg
Version: 1.15.5.6ubuntu2
Severity: normal

While looking at a ubuntu upgrade failure report I noticed that dpkg
does not report deferred trigger failures as real errors via the
status-fd or via the terminal output. Here is a example:

apt-term.log
...
Processing triggers for libc-bin ...
ldconfig deferred processing now taking place
Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-2.6.24-27-generic
cpio: ./etc/modprobe.d/arch-aliases: Cannot stat: No such file or directory
update-initramfs: failed for /boot/initrd.img-2.6.24-27-generic
dpkg: subprocess installed post-installation script returned error exit status 1
....

This error was not reported on the status-fd, instead much later in
the chain dmsetup failed because initramfs-tools goes into
half-configured state. 

This error is reported on the status-fd because initramfs-tools is now
in half-configured state because the trigger failed earlier. This is
misleading when looking a bugs and conceptually it should be the same
kind of error as a normal postinst failure because it has the same
consequences. I report this problem from a Ubuntu machine, but Debian
has the same code.

Attached is a possible patch. I have tested it and it works for me,
but my knowledge of the dpkg error handling code is not great, so a
review is appreciated.

Cheers,
 Michael

-- System Information:
Debian Release: squeeze/sid
  APT prefers lucid
  APT policy: (500, 'lucid')
Architecture: i386 (i686)

Kernel: Linux 2.6.32-16-generic (SMP w/2 CPU cores)
Locale: LANG=en_DK.UTF-8, LC_CTYPE=en_DK.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash

Versions of packages dpkg depends on:
ii  coreutils                7.4-2ubuntu2    The GNU core utilities
ii  libc6                    2.11.1-0ubuntu4 Embedded GNU C Library: Shared lib
ii  lzma                     4.43-14ubuntu2  Compression method of 7z format in

dpkg recommends no packages.

Versions of packages dpkg suggests:
hi  apt                      0.7.25.4ubuntu1 Advanced front-end for dpkg

-- no debconf information
diff -Nru dpkg-1.15.5.6ubuntu3/src/trigproc.c dpkg-1.15.5.6ubuntu4/src/trigproc.c
--- dpkg-1.15.5.6ubuntu3/src/trigproc.c	2010-03-16 11:29:49.000000000 +0100
+++ dpkg-1.15.5.6ubuntu4/src/trigproc.c	2010-03-18 10:22:21.000000000 +0100
@@ -103,6 +103,7 @@
 {
 	struct pkg_list *node;
 	struct pkginfo *pkg;
+	jmp_buf ejbuf;	
 
 	debug(dbg_triggers, "trigproc_run_deferred");
 	while ((node = remove_from_some_queue(&deferred))) {
@@ -110,8 +111,18 @@
 		free(node);
 		if (!pkg)
 			continue;
+
+		if (setjmp(ejbuf)) {
+		   error_unwind(ehflag_bombout);
+		}
+		push_error_handler(&ejbuf,print_error_perpackage, pkg->name);
+
 		pkg->clientdata->trigprocdeferred = NULL;
 		trigproc(pkg);
+
+		set_error_display(NULL, NULL);
+		error_unwind(ehflag_normaltidy);
+
 	}
 }
 

Reply via email to