Fix getaddrinfo() loop

Commit b116d10f did the following change:
    Use switch, int and sa_family_t with AF_INET in uri.c.

This breaks when getaddrinfo() only returns a single record, as in that
case the "break" only exits the switch statement and the loop-step
"res=res->ai_next" is still executed. After that "res == NULL" is
wrongly interpreted as not having found an AF_INET or AF_INET6 address.

Signed-off-by: Marcelo Roberto Jimenez <mroberto@users.sourceforge.net>
(cherry picked from commit faaef39a3c)
This commit is contained in:
Fabrice Fontaine 2012-03-14 22:37:10 +01:00 committed by Marcelo Roberto Jimenez
parent 153d71f10b
commit 11f05dc09d

View File

@ -388,7 +388,7 @@ static int parse_hostport(
ret = getaddrinfo(srvname, NULL, &hints, &res0); ret = getaddrinfo(srvname, NULL, &hints, &res0);
if (ret == 0) { if (ret == 0) {
for (res = res0; res && !ret; res = res->ai_next) { for (res = res0; res; res = res->ai_next) {
switch (res->ai_family) { switch (res->ai_family) {
case AF_INET: case AF_INET:
case AF_INET6: case AF_INET6:
@ -396,12 +396,10 @@ static int parse_hostport(
memcpy(&out->IPaddress, memcpy(&out->IPaddress,
res->ai_addr, res->ai_addr,
res->ai_addrlen); res->ai_addrlen);
ret=1; goto found;
break;
default:
break;
} }
} }
found:
freeaddrinfo(res0); freeaddrinfo(res0);
if (res == NULL) if (res == NULL)
/* Didn't find an AF_INET or AF_INET6 address. */ /* Didn't find an AF_INET or AF_INET6 address. */