summaryrefslogtreecommitdiff
path: root/src/lib/libc/net/getnetnamadr.c
diff options
context:
space:
mode:
authoritojun <>2002-06-26 06:00:54 +0000
committeritojun <>2002-06-26 06:00:54 +0000
commit2de6ddb6a22feedbcbc44271ca3841ddc526981b (patch)
tree524bd879d83e4a3a441b496c0122e8a2d30eee92 /src/lib/libc/net/getnetnamadr.c
parent403c6466072dcd35f27270cbae14d8ba3baa7a03 (diff)
downloadopenbsd-2de6ddb6a22feedbcbc44271ca3841ddc526981b.tar.gz
openbsd-2de6ddb6a22feedbcbc44271ca3841ddc526981b.tar.bz2
openbsd-2de6ddb6a22feedbcbc44271ca3841ddc526981b.zip
avoid remote buffer overrun on hostbuf[]. From: Joost Pol <joost@pine.nl>
correct bad practice in the code - it uses two changing variables to manage buffer (buf and buflen). we eliminate buflen and use fixed point (ep) as the ending pointer. this fix is critical.
Diffstat (limited to '')
-rw-r--r--src/lib/libc/net/getnetnamadr.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/lib/libc/net/getnetnamadr.c b/src/lib/libc/net/getnetnamadr.c
index 834ddf11ae..a5a4200acf 100644
--- a/src/lib/libc/net/getnetnamadr.c
+++ b/src/lib/libc/net/getnetnamadr.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: getnetnamadr.c,v 1.15 2002/02/16 21:27:23 millert Exp $ */ 1/* $OpenBSD: getnetnamadr.c,v 1.16 2002/06/26 06:00:54 itojun Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 1997, Jason Downs. All rights reserved. 4 * Copyright (c) 1997, Jason Downs. All rights reserved.
@@ -77,7 +77,7 @@ static char sccsid[] = "@(#)getnetbyaddr.c 8.1 (Berkeley) 6/4/93";
77static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03"; 77static char sccsid_[] = "from getnetnamadr.c 1.4 (Coimbra) 93/06/03";
78static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $"; 78static char rcsid[] = "$From: getnetnamadr.c,v 8.7 1996/08/05 08:31:35 vixie Exp $";
79#else 79#else
80static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.15 2002/02/16 21:27:23 millert Exp $"; 80static char rcsid[] = "$OpenBSD: getnetnamadr.c,v 1.16 2002/06/26 06:00:54 itojun Exp $";
81#endif 81#endif
82#endif /* LIBC_SCCS and not lint */ 82#endif /* LIBC_SCCS and not lint */
83 83
@@ -133,9 +133,9 @@ getnetanswer(answer, anslen, net_i)
133 register u_char *cp; 133 register u_char *cp;
134 register int n; 134 register int n;
135 u_char *eom; 135 u_char *eom;
136 int type, class, buflen, ancount, qdcount, haveanswer, i, nchar; 136 int type, class, ancount, qdcount, haveanswer, i, nchar;
137 char aux1[MAXHOSTNAMELEN], aux2[MAXHOSTNAMELEN], ans[MAXHOSTNAMELEN]; 137 char aux1[MAXHOSTNAMELEN], aux2[MAXHOSTNAMELEN], ans[MAXHOSTNAMELEN];
138 char *in, *st, *pauxt, *bp, **ap; 138 char *in, *st, *pauxt, *bp, **ap, *ep;
139 char *paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0; 139 char *paux1 = &aux1[0], *paux2 = &aux2[0], flag = 0;
140 static struct netent net_entry; 140 static struct netent net_entry;
141 static char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1]; 141 static char *net_aliases[MAXALIASES], netbuf[BUFSIZ+1];
@@ -159,7 +159,7 @@ getnetanswer(answer, anslen, net_i)
159 ancount = ntohs(hp->ancount); /* #/records in the answer section */ 159 ancount = ntohs(hp->ancount); /* #/records in the answer section */
160 qdcount = ntohs(hp->qdcount); /* #/entries in the question section */ 160 qdcount = ntohs(hp->qdcount); /* #/entries in the question section */
161 bp = netbuf; 161 bp = netbuf;
162 buflen = sizeof(netbuf); 162 ep = netbuf + sizeof(netbuf);
163 cp = answer->buf + HFIXEDSZ; 163 cp = answer->buf + HFIXEDSZ;
164 if (!qdcount) { 164 if (!qdcount) {
165 if (hp->aa) 165 if (hp->aa)
@@ -175,7 +175,7 @@ getnetanswer(answer, anslen, net_i)
175 net_entry.n_aliases = net_aliases; 175 net_entry.n_aliases = net_aliases;
176 haveanswer = 0; 176 haveanswer = 0;
177 while (--ancount >= 0 && cp < eom) { 177 while (--ancount >= 0 && cp < eom) {
178 n = dn_expand(answer->buf, eom, cp, bp, buflen); 178 n = dn_expand(answer->buf, eom, cp, bp, ep - bp);
179#ifdef USE_RESOLV_NAME_OK 179#ifdef USE_RESOLV_NAME_OK
180 if ((n < 0) || !res_dnok(bp)) 180 if ((n < 0) || !res_dnok(bp))
181#else 181#else
@@ -190,12 +190,13 @@ getnetanswer(answer, anslen, net_i)
190 cp += INT32SZ; /* TTL */ 190 cp += INT32SZ; /* TTL */
191 GETSHORT(n, cp); 191 GETSHORT(n, cp);
192 if (class == C_IN && type == T_PTR) { 192 if (class == C_IN && type == T_PTR) {
193 n = dn_expand(answer->buf, eom, cp, bp, buflen); 193 n = dn_expand(answer->buf, eom, cp, bp, ep - bp);
194#ifdef USE_RESOLV_NAME_OK 194#ifdef USE_RESOLV_NAME_OK
195 if ((n < 0) || !res_hnok(bp)) { 195 if ((n < 0) || !res_hnok(bp))
196#else 196#else
197 if ((n < 0) || !_hokchar(bp)) { 197 if ((n < 0) || !_hokchar(bp))
198#endif 198#endif
199 {
199 cp += n; 200 cp += n;
200 return (NULL); 201 return (NULL);
201 } 202 }