db: fix unaligned memory access in csum_hash()

cute-signatures
Timo Teräs 2020-02-21 09:31:21 +02:00
parent 271047cc93
commit c054fbc11e
3 changed files with 13 additions and 11 deletions

View File

@ -149,6 +149,16 @@ static inline size_t mulmod(size_t a, size_t b, size_t c)
return (size_t) tmp;
}
static inline uint32_t get_unaligned32(const void *ptr)
{
#if defined(__x86_64__) || defined(__i386__)
return *(const uint32_t *)ptr;
#else
const uint8_t *p = ptr;
return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
#endif
}
typedef void (*apk_progress_cb)(void *cb_ctx, size_t);
void *apk_array_resize(void *array, size_t new_size, size_t elem_size);

View File

@ -204,16 +204,6 @@ static inline uint32_t rotl32(uint32_t x, int8_t r)
return (x << r) | (x >> (32 - r));
}
static inline uint32_t get_unaligned32(const void *ptr)
{
#if defined(__x86_64__) || defined(__i386__)
return *(const uint32_t *)ptr;
#else
const uint8_t *p = ptr;
return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
#endif
}
static uint32_t murmur3_32(const void *pkey, uint32_t len, uint32_t seed)
{
static const uint32_t c1 = 0xcc9e2d51;

View File

@ -128,7 +128,9 @@ static unsigned long csum_hash(apk_blob_t csum)
{
/* Checksum's highest bits have the most "randomness", use that
* directly as hash */
return *(unsigned long *) csum.ptr;
if (csum.len >= sizeof(uint32_t))
return get_unaligned32(csum.ptr);
return 0;
}
static const struct apk_hash_ops pkg_info_hash_ops = {