diff options
| author | Lennart Poettering <lennart@poettering.net> | 2008-07-27 23:22:14 +0200 | 
|---|---|---|
| committer | Lennart Poettering <lennart@poettering.net> | 2008-07-27 23:22:14 +0200 | 
| commit | 82bc2476ef8bd1f2cbc172729e9704469e27222a (patch) | |
| tree | 8b55e623da23c1cf7bbfede07338182f887292ed | |
| parent | 5af3d46ef47187ae0e2b18d48a9b56c92c4909eb (diff) | |
fix potential memory alignment bug
| -rw-r--r-- | libasyncns/asyncns.c | 24 | 
1 files changed, 13 insertions, 11 deletions
| diff --git a/libasyncns/asyncns.c b/libasyncns/asyncns.c index 11826ca..458b093 100644 --- a/libasyncns/asyncns.c +++ b/libasyncns/asyncns.c @@ -906,7 +906,7 @@ static void complete_query(asyncns_t *asyncns, asyncns_query_t *q) {  }  static void *unserialize_addrinfo(void *p, struct addrinfo **ret_ai, size_t *length) { -    addrinfo_serialization_t *s = p; +    addrinfo_serialization_t s;      size_t l;      struct addrinfo *ai;      assert(p); @@ -916,7 +916,9 @@ static void *unserialize_addrinfo(void *p, struct addrinfo **ret_ai, size_t *len      if (*length < sizeof(addrinfo_serialization_t))          return NULL; -    l = sizeof(addrinfo_serialization_t) + s->ai_addrlen + s->canonname_len; +    memcpy(&s, p, sizeof(s)); + +    l = sizeof(addrinfo_serialization_t) + s.ai_addrlen + s.canonname_len;      if (*length < l)          return NULL; @@ -927,23 +929,23 @@ static void *unserialize_addrinfo(void *p, struct addrinfo **ret_ai, size_t *len      ai->ai_canonname = NULL;      ai->ai_next = NULL; -    if (s->ai_addrlen && !(ai->ai_addr = malloc(s->ai_addrlen))) +    if (s.ai_addrlen && !(ai->ai_addr = malloc(s.ai_addrlen)))          goto fail; -    if (s->canonname_len && !(ai->ai_canonname = malloc(s->canonname_len))) +    if (s.canonname_len && !(ai->ai_canonname = malloc(s.canonname_len)))          goto fail; -    ai->ai_flags = s->ai_flags; -    ai->ai_family = s->ai_family; -    ai->ai_socktype = s->ai_socktype; -    ai->ai_protocol = s->ai_protocol; -    ai->ai_addrlen = s->ai_addrlen; +    ai->ai_flags = s.ai_flags; +    ai->ai_family = s.ai_family; +    ai->ai_socktype = s.ai_socktype; +    ai->ai_protocol = s.ai_protocol; +    ai->ai_addrlen = s.ai_addrlen;      if (ai->ai_addr) -        memcpy(ai->ai_addr, (uint8_t*) p + sizeof(addrinfo_serialization_t), s->ai_addrlen); +        memcpy(ai->ai_addr, (uint8_t*) p + sizeof(addrinfo_serialization_t), s.ai_addrlen);      if (ai->ai_canonname) -        memcpy(ai->ai_canonname, (uint8_t*) p + sizeof(addrinfo_serialization_t) + s->ai_addrlen, s->canonname_len); +        memcpy(ai->ai_canonname, (uint8_t*) p + sizeof(addrinfo_serialization_t) + s.ai_addrlen, s.canonname_len);      *length -= l;      *ret_ai = ai; | 
