]> git.ipfire.org Git - thirdparty/kmod.git/commitdiff
index-mm: fix memory access.
authorGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Sat, 10 Dec 2011 13:36:35 +0000 (11:36 -0200)
committerGustavo Sverzut Barbieri <barbieri@profusion.mobi>
Sat, 10 Dec 2011 13:36:35 +0000 (11:36 -0200)
uint32_t reads must be aligned, they're not then use memcpy().

read_alloc_chars_mm() and read_chars_mm() were wrong, normalize all
address calculation using single byte pointer "addr" that is
incremented by the amount read, this will avoid further errors.

libkmod/libkmod-index.c

index ce4ad6aad6c6f01de224d496a8c1c2f81e7b7ca5..f8d63274aa058db33839eca02fcfbe46822910fe 100644 (file)
@@ -557,36 +557,38 @@ struct index_mm_node {
 
 static inline uint32_t read_long_mm(void **p)
 {
-       uint32_t v = **((uint32_t **)p);
+       uint8_t *addr = *(uint8_t **)p;
+       uint32_t v;
 
-       *p = *((uint8_t **)p) + sizeof(uint32_t);
+       /* addr may be unalined to uint32_t */
+       memcpy(&v, addr, sizeof(uint32_t));
 
+       *p = addr + sizeof(uint32_t);
        return ntohl(v);
 }
 
 static inline uint8_t read_char_mm(void **p)
 {
-       uint8_t *v = *((uint8_t **)p);
-       *p = v + 1;
-       return *v;
+       uint8_t *addr = *(uint8_t **)p;
+       uint8_t v = *addr;
+       *p = addr + sizeof(uint8_t);
+       return v;
 }
 
 static inline char *read_alloc_chars_mm(void **p)
 {
-       char *s = *((char **)p);
-       size_t len = strlen(s) + 1;
-       *p = ((char *)p) + len;
-
-       return memdup(s, len);
+       char *addr = *(char **)p;
+       size_t len = strlen(addr) + 1;
+       *p = addr + len;
+       return memdup(addr, len);
 }
 
 static inline char *read_chars_mm(void **p, unsigned *rlen)
 {
-       char *s = *((char **)p);
-       size_t len = *rlen = strlen(s);
-       *p = ((char *)p) + len + 1;
-
-       return s;
+       char *addr = *(char **)p;
+       size_t len = *rlen = strlen(addr);
+       *p = addr + len + 1;
+       return addr;
 }
 
 static struct index_mm_node *index_mm_read_node(struct index_mm *idx,