summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/getaddrinfo.c
diff options
context:
space:
mode:
authormatthew <>2011-04-05 00:46:06 +0000
committermatthew <>2011-04-05 00:46:06 +0000
commitfdfda2c4a3a790b78f76218ca8a933bfd3944b84 (patch)
tree32474a7e93d1846732d6afba56dff16944ca0129 /src/lib/libc/net/getaddrinfo.c
parent515602fafdedd66b15c0d7c6a1902217acea3b8e (diff)
downloadopenbsd-fdfda2c4a3a790b78f76218ca8a933bfd3944b84.tar.gz
openbsd-fdfda2c4a3a790b78f76218ca8a933bfd3944b84.tar.bz2
openbsd-fdfda2c4a3a790b78f76218ca8a933bfd3944b84.zip
Add AI_FQDN flag to getaddrinfo(3). Prompted by discussions with djm@
about cert checking in OpenSSH. Man page wording tweaks thanks to jmc@. ok henning@, jmc@; positive feedback from djm@, ajacoutat@ Committing now to reuse guenther@'s libc minor bump instead of cranking it again, as suggested by deraadt@.
Diffstat (limited to 'src/lib/libc/net/getaddrinfo.c')
-rw-r--r--src/lib/libc/net/getaddrinfo.c36
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,
764static int 765static int
765get_canonname(const struct addrinfo *pai, struct addrinfo *ai, const char *str) 766get_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;