]> git.michaelhowe.org Git - packages/b/bup.git/commitdiff
fix unaligned access on SPARC
authorJon Dowland <jmtd@debian.org>
Mon, 5 Dec 2011 16:00:54 +0000 (16:00 +0000)
committerJon Dowland <jmtd@debian.org>
Mon, 5 Dec 2011 16:06:49 +0000 (16:06 +0000)
Thanks Julien Cristau

debian/patches/bloom-unaligned-bufs [new file with mode: 0644]

diff --git a/debian/patches/bloom-unaligned-bufs b/debian/patches/bloom-unaligned-bufs
new file mode 100644 (file)
index 0000000..db0fe4d
--- /dev/null
@@ -0,0 +1,88 @@
+Date: Wed, 14 Sep 2011 21:10:53 +0200
+From: Julien Cristau <jcristau@debian.org>
+Subject: Re: Bug#641488: bup: FTBFS on sparc (bus error in bloom test)
+
+With the following patch, the package builds fine on smetana.  This
+avoids 4-byte accesses to unaligned buffers:
+
+--- bup-0.24b.orig/lib/bup/_helpers.c
++++ bup-0.24b/lib/bup/_helpers.c
+@@ -137,59 +137,58 @@ static PyObject *firstword(PyObject *sel
+ #define BLOOM2_HEADERLEN 16
+-typedef struct {
+-    uint32_t high;
+-    unsigned char low;
+-} bits40_t;
+-
+-static void to_bloom_address_bitmask4(const bits40_t *buf,
++static void to_bloom_address_bitmask4(const unsigned char *buf,
+       const int nbits, uint64_t *v, unsigned char *bitmask)
+ {
+     int bit;
++    uint32_t high;
+     uint64_t raw, mask;
++    memcpy(&high, buf, 4);
+     mask = (1<<nbits) - 1;
+-    raw = (((uint64_t)ntohl(buf->high)) << 8) | buf->low;
++    raw = (((uint64_t)ntohl(high) << 8) | buf[4]);
+     bit = (raw >> (37-nbits)) & 0x7;
+     *v = (raw >> (40-nbits)) & mask;
+     *bitmask = 1 << bit;
+ }
+-static void to_bloom_address_bitmask5(const uint32_t *buf,
++static void to_bloom_address_bitmask5(const unsigned char *buf,
+       const int nbits, uint32_t *v, unsigned char *bitmask)
+ {
+     int bit;
++    uint32_t high;
+     uint32_t raw, mask;
++    memcpy(&high, buf, 4);
+     mask = (1<<nbits) - 1;
+-    raw = ntohl(*buf);
++    raw = ntohl(high);
+     bit = (raw >> (29-nbits)) & 0x7;
+     *v = (raw >> (32-nbits)) & mask;
+     *bitmask = 1 << bit;
+ }
+-#define BLOOM_SET_BIT(name, address, itype, otype) \
+-static void name(unsigned char *bloom, const void *buf, const int nbits)\
++#define BLOOM_SET_BIT(name, address, otype) \
++static void name(unsigned char *bloom, const unsigned char *buf, const int nbits)\
+ {\
+     unsigned char bitmask;\
+     otype v;\
+-    address((itype *)buf, nbits, &v, &bitmask);\
++    address(buf, nbits, &v, &bitmask);\
+     bloom[BLOOM2_HEADERLEN+v] |= bitmask;\
+ }
+-BLOOM_SET_BIT(bloom_set_bit4, to_bloom_address_bitmask4, bits40_t, uint64_t)
+-BLOOM_SET_BIT(bloom_set_bit5, to_bloom_address_bitmask5, uint32_t, uint32_t)
++BLOOM_SET_BIT(bloom_set_bit4, to_bloom_address_bitmask4, uint64_t)
++BLOOM_SET_BIT(bloom_set_bit5, to_bloom_address_bitmask5, uint32_t)
+-#define BLOOM_GET_BIT(name, address, itype, otype) \
+-static int name(const unsigned char *bloom, const void *buf, const int nbits)\
++#define BLOOM_GET_BIT(name, address, otype) \
++static int name(const unsigned char *bloom, const unsigned char *buf, const int nbits)\
+ {\
+     unsigned char bitmask;\
+     otype v;\
+-    address((itype *)buf, nbits, &v, &bitmask);\
++    address(buf, nbits, &v, &bitmask);\
+     return bloom[BLOOM2_HEADERLEN+v] & bitmask;\
+ }
+-BLOOM_GET_BIT(bloom_get_bit4, to_bloom_address_bitmask4, bits40_t, uint64_t)
+-BLOOM_GET_BIT(bloom_get_bit5, to_bloom_address_bitmask5, uint32_t, uint32_t)
++BLOOM_GET_BIT(bloom_get_bit4, to_bloom_address_bitmask4, uint64_t)
++BLOOM_GET_BIT(bloom_get_bit5, to_bloom_address_bitmask5, uint32_t)
+ static PyObject *bloom_add(PyObject *self, PyObject *args)
+