Commit c054fbc1 authored by Timo Teräs's avatar Timo Teräs

db: fix unaligned memory access in csum_hash()

parent 271047cc
Pipeline #7848 failed with stage
in 46 seconds
......@@ -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);
......
......@@ -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;
......
......@@ -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 = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment