tag 641488 patch upstream kthxbye On Tue, Sep 13, 2011 at 20:56:13 +0200, Julien Cristau wrote:
> Package: bup > Version: 0.24b-1.1 > Severity: serious > > Hi, > > bup FTBFS on sparc: > https://buildd.debian.org/status/fetch.php?pkg=bup&arch=sparc&ver=0.24b-1.1&stamp=1313905299 > > The failure is reproducible on smetana.d.o. From what I can tell, it > crashes in lib/bup/t/tbloom.py:test_bloom, line 18 (b.add_idx(ix)), > specifically in the call to bloom_add(). > 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) Cheers, Julien -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org