summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/getaddrinfo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libc/net/getaddrinfo.c')
-rw-r--r--src/lib/libc/net/getaddrinfo.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/lib/libc/net/getaddrinfo.c b/src/lib/libc/net/getaddrinfo.c
index d16900b4a0..3f4d916486 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.33 2002/02/17 19:42:23 millert Exp $ */ 1/* $OpenBSD: getaddrinfo.c,v 1.34 2002/06/26 06:01:16 itojun 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/*
@@ -1031,8 +1031,8 @@ getanswer(answer, anslen, qname, qtype, pai)
1031 const u_char *cp; 1031 const u_char *cp;
1032 int n; 1032 int n;
1033 const u_char *eom; 1033 const u_char *eom;
1034 char *bp; 1034 char *bp, *ep;
1035 int type, class, buflen, ancount, qdcount; 1035 int type, class, ancount, qdcount;
1036 int haveanswer, had_error; 1036 int haveanswer, had_error;
1037 char tbuf[MAXDNAME]; 1037 char tbuf[MAXDNAME];
1038 int (*name_ok)(const char *); 1038 int (*name_ok)(const char *);
@@ -1059,13 +1059,13 @@ getanswer(answer, anslen, qname, qtype, pai)
1059 ancount = ntohs(hp->ancount); 1059 ancount = ntohs(hp->ancount);
1060 qdcount = ntohs(hp->qdcount); 1060 qdcount = ntohs(hp->qdcount);
1061 bp = hostbuf; 1061 bp = hostbuf;
1062 buflen = sizeof hostbuf; 1062 ep = hostbuf + sizeof hostbuf;
1063 cp = answer->buf + HFIXEDSZ; 1063 cp = answer->buf + HFIXEDSZ;
1064 if (qdcount != 1) { 1064 if (qdcount != 1) {
1065 h_errno = NO_RECOVERY; 1065 h_errno = NO_RECOVERY;
1066 return (NULL); 1066 return (NULL);
1067 } 1067 }
1068 n = dn_expand(answer->buf, eom, cp, bp, buflen); 1068 n = dn_expand(answer->buf, eom, cp, bp, ep - bp);
1069 if ((n < 0) || !(*name_ok)(bp)) { 1069 if ((n < 0) || !(*name_ok)(bp)) {
1070 h_errno = NO_RECOVERY; 1070 h_errno = NO_RECOVERY;
1071 return (NULL); 1071 return (NULL);
@@ -1083,14 +1083,13 @@ getanswer(answer, anslen, qname, qtype, pai)
1083 } 1083 }
1084 canonname = bp; 1084 canonname = bp;
1085 bp += n; 1085 bp += n;
1086 buflen -= n;
1087 /* The qname can be abbreviated, but h_name is now absolute. */ 1086 /* The qname can be abbreviated, but h_name is now absolute. */
1088 qname = canonname; 1087 qname = canonname;
1089 } 1088 }
1090 haveanswer = 0; 1089 haveanswer = 0;
1091 had_error = 0; 1090 had_error = 0;
1092 while (ancount-- > 0 && cp < eom && !had_error) { 1091 while (ancount-- > 0 && cp < eom && !had_error) {
1093 n = dn_expand(answer->buf, eom, cp, bp, buflen); 1092 n = dn_expand(answer->buf, eom, cp, bp, ep - bp);
1094 if ((n < 0) || !(*name_ok)(bp)) { 1093 if ((n < 0) || !(*name_ok)(bp)) {
1095 had_error++; 1094 had_error++;
1096 continue; 1095 continue;
@@ -1117,14 +1116,13 @@ getanswer(answer, anslen, qname, qtype, pai)
1117 cp += n; 1116 cp += n;
1118 /* Get canonical name. */ 1117 /* Get canonical name. */
1119 n = strlen(tbuf) + 1; /* for the \0 */ 1118 n = strlen(tbuf) + 1; /* for the \0 */
1120 if (n > buflen || n >= MAXHOSTNAMELEN) { 1119 if (n > ep - bp || n >= MAXHOSTNAMELEN) {
1121 had_error++; 1120 had_error++;
1122 continue; 1121 continue;
1123 } 1122 }
1124 strcpy(bp, tbuf); 1123 strcpy(bp, tbuf);
1125 canonname = bp; 1124 canonname = bp;
1126 bp += n; 1125 bp += n;
1127 buflen -= n;
1128 continue; 1126 continue;
1129 } 1127 }
1130 if (qtype == T_ANY) { 1128 if (qtype == T_ANY) {
@@ -1164,7 +1162,6 @@ getanswer(answer, anslen, qname, qtype, pai)
1164 canonname = bp; 1162 canonname = bp;
1165 nn = strlen(bp) + 1; /* for the \0 */ 1163 nn = strlen(bp) + 1; /* for the \0 */
1166 bp += nn; 1164 bp += nn;
1167 buflen -= nn;
1168 } 1165 }
1169 1166
1170 /* don't overwrite pai */ 1167 /* don't overwrite pai */