Fixed using wrong sockaddr type in lwip_getaddrinfo when IPv6 is enabled

This commit is contained in:
Dirk Ziegelmeier 2015-09-17 20:55:44 +02:00 committed by sg
parent 52a4ca99a8
commit cca758d332
3 changed files with 7 additions and 3 deletions

View File

@ -346,7 +346,7 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
} }
} }
total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_in); total_size = sizeof(struct addrinfo) + sizeof(struct sockaddr_storage);
if (nodename != NULL) { if (nodename != NULL) {
namelen = strlen(nodename); namelen = strlen(nodename);
if (namelen > DNS_MAX_NAME_LENGTH) { if (namelen > DNS_MAX_NAME_LENGTH) {
@ -395,11 +395,11 @@ lwip_getaddrinfo(const char *nodename, const char *servname,
} }
if (nodename != NULL) { if (nodename != NULL) {
/* copy nodename to canonname if specified */ /* copy nodename to canonname if specified */
ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); ai->ai_canonname = ((char*)ai + sizeof(struct addrinfo) + sizeof(struct sockaddr_storage));
MEMCPY(ai->ai_canonname, nodename, namelen); MEMCPY(ai->ai_canonname, nodename, namelen);
ai->ai_canonname[namelen] = 0; ai->ai_canonname[namelen] = 0;
} }
ai->ai_addrlen = sizeof(struct sockaddr_in); ai->ai_addrlen = sizeof(struct sockaddr_storage);
ai->ai_addr = (struct sockaddr*)sa; ai->ai_addr = (struct sockaddr*)sa;
*res = ai; *res = ai;

View File

@ -246,7 +246,9 @@ union sockaddr_aligned {
#if LWIP_IPV6 #if LWIP_IPV6
struct sockaddr_in6 sin6; struct sockaddr_in6 sin6;
#endif /* LWIP_IPV6 */ #endif /* LWIP_IPV6 */
#if LWIP_IPV4
struct sockaddr_in sin; struct sockaddr_in sin;
#endif /* LWIP_IPV4 */
}; };
#if LWIP_IGMP #if LWIP_IGMP

View File

@ -59,6 +59,7 @@ typedef u8_t sa_family_t;
typedef u16_t in_port_t; typedef u16_t in_port_t;
#endif #endif
#if LWIP_IPV4
/* members are in network byte order */ /* members are in network byte order */
struct sockaddr_in { struct sockaddr_in {
u8_t sin_len; u8_t sin_len;
@ -68,6 +69,7 @@ struct sockaddr_in {
#define SIN_ZERO_LEN 8 #define SIN_ZERO_LEN 8
char sin_zero[SIN_ZERO_LEN]; char sin_zero[SIN_ZERO_LEN];
}; };
#endif /* LWIP_IPV4 */
#if LWIP_IPV6 #if LWIP_IPV6
struct sockaddr_in6 { struct sockaddr_in6 {