From: Jon Dowland Date: Mon, 5 Dec 2011 16:00:54 +0000 (+0000) Subject: fix unaligned access on SPARC X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=d12fb7e5b341528ce3fda5ad3ac9e2ab0aff682c;p=packages%2Fb%2Fbup.git fix unaligned access on SPARC Thanks Julien Cristau --- diff --git a/debian/patches/bloom-unaligned-bufs b/debian/patches/bloom-unaligned-bufs new file mode 100644 index 0000000..db0fe4d --- /dev/null +++ b/debian/patches/bloom-unaligned-bufs @@ -0,0 +1,88 @@ +Date: Wed, 14 Sep 2011 21:10:53 +0200 +From: Julien Cristau +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<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<> (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) +