--- musl/src/network/getaddrinfo.c.orig +++ musl/src/network/getaddrinfo.c @@ -100,23 +100,31 @@ } if (!host) { - if (family == AF_UNSPEC) family = AF_INET; - buf = calloc(sizeof *buf, 1+EXTRA); + int unspec = 0, idx = 0; + if (family == AF_UNSPEC) { unspec = 1; family = AF_INET; } + buf = calloc(sizeof *buf, (unspec ? 2 : 1)+EXTRA); if (!buf) return EAI_MEMORY; - buf->ai.ai_protocol = proto; - buf->ai.ai_socktype = type; - buf->ai.ai_addr = (void *)&buf->sa; - buf->ai.ai_addrlen = family==AF_INET6 ? sizeof sa.sin6 : sizeof sa.sin; - buf->ai.ai_family = family; - buf->sa.sin.sin_family = family; - buf->sa.sin.sin_port = port; +_next6: + (buf+idx)->ai.ai_protocol = proto; + (buf+idx)->ai.ai_socktype = type; + (buf+idx)->ai.ai_addr = (void *)&(buf+idx)->sa; + (buf+idx)->ai.ai_addrlen = family==AF_INET6 ? sizeof sa.sin6 : sizeof sa.sin; + (buf+idx)->ai.ai_family = family; + (buf+idx)->sa.sin.sin_family = family; + (buf+idx)->sa.sin.sin_port = port; + if (unspec) (buf+idx)->ai.ai_next = &(buf+1)->ai; if (!(flags & AI_PASSIVE)) { if (family == AF_INET) { - 0[(uint8_t*)&buf->sa.sin.sin_addr.s_addr]=127; - 3[(uint8_t*)&buf->sa.sin.sin_addr.s_addr]=1; - } else buf[0].sa.sin6.sin6_addr.s6_addr[15] = 1; + 0[(uint8_t*)&(buf+idx)->sa.sin.sin_addr.s_addr]=127; + 3[(uint8_t*)&(buf+idx)->sa.sin.sin_addr.s_addr]=1; + } else (buf+idx)[0].sa.sin6.sin6_addr.s6_addr[15] = 1; } *res = &buf->ai; + if (unspec) { + idx = 1; unspec = 0; + family = AF_INET6; + goto _next6; + } return 0; }