diff options
-rw-r--r-- | src/apk_defines.h | 10 | ||||
-rw-r--r-- | src/blob.c | 10 | ||||
-rw-r--r-- | src/database.c | 4 |
3 files changed, 13 insertions, 11 deletions
diff --git a/src/apk_defines.h b/src/apk_defines.h index 5373725..00e9ea8 100644 --- a/src/apk_defines.h +++ b/src/apk_defines.h @@ -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; diff --git a/src/database.c b/src/database.c index 2ca1286..06d1619 100644 --- a/src/database.c +++ b/src/database.c @@ -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 = { |