blob/blobmsg: use 32 bit load/store for 64 bit access, unaligned attributes cause data corruption on ARM

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
This commit is contained in:
Felix Fietkau 2013-01-23 02:41:16 +01:00
parent f15ceb8ced
commit 8a89e7f388
2 changed files with 8 additions and 3 deletions

6
blob.h
View file

@ -191,8 +191,10 @@ blob_get_u32(const struct blob_attr *attr)
static inline uint64_t static inline uint64_t
blob_get_u64(const struct blob_attr *attr) blob_get_u64(const struct blob_attr *attr)
{ {
uint64_t *tmp = (uint64_t*)attr->data; uint32_t *ptr = blob_data(attr);
return be64_to_cpu(*tmp); uint64_t tmp = ((uint64_t) be32_to_cpu(ptr[0])) << 32;
tmp |= be32_to_cpu(ptr[1]);
return tmp;
} }
static inline int8_t static inline int8_t

View file

@ -180,7 +180,10 @@ static inline uint32_t blobmsg_get_u32(struct blob_attr *attr)
static inline uint64_t blobmsg_get_u64(struct blob_attr *attr) static inline uint64_t blobmsg_get_u64(struct blob_attr *attr)
{ {
return be64_to_cpu(*(uint64_t *) blobmsg_data(attr)); uint32_t *ptr = blobmsg_data(attr);
uint64_t tmp = ((uint64_t) be32_to_cpu(ptr[0])) << 32;
tmp |= be32_to_cpu(ptr[1]);
return tmp;
} }
static inline char *blobmsg_get_string(struct blob_attr *attr) static inline char *blobmsg_get_string(struct blob_attr *attr)