diff options
Diffstat (limited to 'src/lib/libc/net/getaddrinfo.c')
| -rw-r--r-- | src/lib/libc/net/getaddrinfo.c | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/src/lib/libc/net/getaddrinfo.c b/src/lib/libc/net/getaddrinfo.c index 7040fa7c37..29cc1f463e 100644 --- a/src/lib/libc/net/getaddrinfo.c +++ b/src/lib/libc/net/getaddrinfo.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: getaddrinfo.c,v 1.71 2009/11/18 07:43:22 guenther Exp $ */ | 1 | /* $OpenBSD: getaddrinfo.c,v 1.72 2011/04/05 00:46:06 matthew Exp $ */ |
| 2 | /* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */ | 2 | /* $KAME: getaddrinfo.c,v 1.31 2000/08/31 17:36:43 itojun Exp $ */ |
| 3 | 3 | ||
| 4 | /* | 4 | /* |
| @@ -309,7 +309,9 @@ getaddrinfo(const char *hostname, const char *servname, | |||
| 309 | if (hints->ai_addrlen || hints->ai_canonname || | 309 | if (hints->ai_addrlen || hints->ai_canonname || |
| 310 | hints->ai_addr || hints->ai_next) | 310 | hints->ai_addr || hints->ai_next) |
| 311 | ERR(EAI_BADHINTS); /* xxx */ | 311 | ERR(EAI_BADHINTS); /* xxx */ |
| 312 | if (hints->ai_flags & ~AI_MASK) | 312 | if ((hints->ai_flags & ~AI_MASK) != 0 || |
| 313 | (hints->ai_flags & (AI_CANONNAME | AI_FQDN)) == | ||
| 314 | (AI_CANONNAME | AI_FQDN)) | ||
| 313 | ERR(EAI_BADFLAGS); | 315 | ERR(EAI_BADFLAGS); |
| 314 | switch (hints->ai_family) { | 316 | switch (hints->ai_family) { |
| 315 | case PF_UNSPEC: | 317 | case PF_UNSPEC: |
| @@ -671,14 +673,13 @@ explore_numeric(const struct addrinfo *pai, const char *hostname, | |||
| 671 | pai->ai_family == PF_UNSPEC /*?*/) { | 673 | pai->ai_family == PF_UNSPEC /*?*/) { |
| 672 | GET_AI(cur->ai_next, afd, pton); | 674 | GET_AI(cur->ai_next, afd, pton); |
| 673 | GET_PORT(cur->ai_next, servname); | 675 | GET_PORT(cur->ai_next, servname); |
| 674 | if ((pai->ai_flags & AI_CANONNAME)) { | 676 | /* |
| 675 | /* | 677 | * Set the numeric address itself as |
| 676 | * Set the numeric address itself as | 678 | * the canonical name, based on a |
| 677 | * the canonical name, based on a | 679 | * clarification in rfc2553bis-03. |
| 678 | * clarification in rfc2553bis-03. | 680 | */ |
| 679 | */ | 681 | GET_CANONNAME(cur->ai_next, canonname); |
| 680 | GET_CANONNAME(cur->ai_next, canonname); | 682 | |
| 681 | } | ||
| 682 | while (cur && cur->ai_next) | 683 | while (cur && cur->ai_next) |
| 683 | cur = cur->ai_next; | 684 | cur = cur->ai_next; |
| 684 | } else | 685 | } else |
| @@ -764,7 +765,7 @@ explore_numeric_scope(const struct addrinfo *pai, const char *hostname, | |||
| 764 | static int | 765 | static int |
| 765 | get_canonname(const struct addrinfo *pai, struct addrinfo *ai, const char *str) | 766 | get_canonname(const struct addrinfo *pai, struct addrinfo *ai, const char *str) |
| 766 | { | 767 | { |
| 767 | if ((pai->ai_flags & AI_CANONNAME) != 0) { | 768 | if ((pai->ai_flags & (AI_CANONNAME | AI_FQDN)) != 0) { |
| 768 | ai->ai_canonname = strdup(str); | 769 | ai->ai_canonname = strdup(str); |
| 769 | if (ai->ai_canonname == NULL) | 770 | if (ai->ai_canonname == NULL) |
| 770 | return EAI_MEMORY; | 771 | return EAI_MEMORY; |
| @@ -1129,7 +1130,7 @@ getanswer(const querybuf *answer, int anslen, const char *qname, int qtype, | |||
| 1129 | haveanswer++; | 1130 | haveanswer++; |
| 1130 | } | 1131 | } |
| 1131 | if (haveanswer) { | 1132 | if (haveanswer) { |
| 1132 | if (!canonname) | 1133 | if (!canonname || (pai->ai_flags & AI_FQDN) != 0) |
| 1133 | (void)get_canonname(pai, sentinel.ai_next, qname); | 1134 | (void)get_canonname(pai, sentinel.ai_next, qname); |
| 1134 | else | 1135 | else |
| 1135 | (void)get_canonname(pai, sentinel.ai_next, canonname); | 1136 | (void)get_canonname(pai, sentinel.ai_next, canonname); |
| @@ -1275,11 +1276,9 @@ found: | |||
| 1275 | /* cover it up */ | 1276 | /* cover it up */ |
| 1276 | res->ai_flags = pai->ai_flags; | 1277 | res->ai_flags = pai->ai_flags; |
| 1277 | 1278 | ||
| 1278 | if (pai->ai_flags & AI_CANONNAME) { | 1279 | if (get_canonname(pai, res, cname) != 0) { |
| 1279 | if (get_canonname(pai, res, cname) != 0) { | 1280 | freeaddrinfo(res0); |
| 1280 | freeaddrinfo(res0); | 1281 | goto again; |
| 1281 | goto again; | ||
| 1282 | } | ||
| 1283 | } | 1282 | } |
| 1284 | } | 1283 | } |
| 1285 | return res0; | 1284 | return res0; |
| @@ -1369,8 +1368,7 @@ nextline: | |||
| 1369 | /* cover it up */ | 1368 | /* cover it up */ |
| 1370 | res->ai_flags = pai->ai_flags; | 1369 | res->ai_flags = pai->ai_flags; |
| 1371 | 1370 | ||
| 1372 | if (pai->ai_flags & AI_CANONNAME) | 1371 | (void)get_canonname(pai, res, canonname); |
| 1373 | (void)get_canonname(pai, res, canonname); | ||
| 1374 | } | 1372 | } |
| 1375 | } else | 1373 | } else |
| 1376 | res0 = NULL; | 1374 | res0 = NULL; |
