Package: dbus
Version: 1.2.1-3
Severity: normal
Tags: patch
dbus and libdbus-1 generate unaligned traps on the Alpha architecture.
The traps are due to misaligned accesses. On Alpha they generate a
kernel trap and the kernel simulates the memory access with an
"unaligned trap" entry in the kernel log. This is not a show-stopper on
Alpha but the frequency of the reports in the system log is quite
annoying. As the misaligned memory access is also in libdbus-1 it
pollutes other programs that use libdbus-1 (see bug #368863 for the hal
package where the unaligned trap is, in fact, due to libdbus-1).
The offending line of code is line 518 of dbus_marshal_basic.c and I
attach a patch (assuming this reportbug thingy works as I expect) recently
posted by Jay Estabrook of HP to the debian-alpha mail list. I have
been running dbus 1.2.1-3 with the patch applied for the last few days
with no unaligned traps and no problems.
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (500, 'testing')
Architecture: alpha
Kernel: Linux 2.6.26.2-dp264
Locale: LANG=en_NZ, LC_CTYPE=en_NZ (charmap=ISO-8859-1)
Shell: /bin/sh linked to /bin/bash
Versions of packages dbus depends on:
ii adduser 3.110 add and remove users and groups
ii debianutils 2.30 Miscellaneous utilities specific t
ii libc6.1 2.7-13 GNU C Library: Shared libraries
ii libdbus-1-3 1.2.1-3 simple interprocess messaging syst
ii libexpat1 2.0.1-4 XML parsing C library - runtime li
ii libselinux1 2.0.65-5 SELinux shared libraries
ii lsb-base 3.2-20 Linux Standard Base 3.2 init scrip
Versions of packages dbus recommends:
ii dbus-x11 1.2.1-3 simple interprocess messaging syst
dbus suggests no packages.
-- no debconf information
--- a/dbus/dbus-marshal-basic.c.ORIG 2008-04-23 17:54:58.000000000 -0400
+++ b/dbus/dbus-marshal-basic.c 2008-04-23 18:00:06.000000000 -0400
@@ -518,7 +518,7 @@ _dbus_marshal_read_basic (const DBusStri
switch (type)
{
case DBUS_TYPE_BYTE:
- vp->byt = _dbus_string_get_byte (str, pos);
+ *((volatile char *)&vp->byt) = _dbus_string_get_byte (str, pos);
(pos)++;
break;
case DBUS_TYPE_INT16: