patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch
changeset 1 eeea35fbf182
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/patches/glibc/2.1.3/rh62-12-glibc-2.1.3-maxpacket.patch	Sat Feb 24 11:00:05 2007 +0000
     1.3 @@ -0,0 +1,512 @@
     1.4 +--- libc/resolv/nss_dns/dns-host.c.jj	Tue Sep 14 03:05:08 1999
     1.5 ++++ libc/resolv/nss_dns/dns-host.c	Thu Oct 10 13:07:33 2002
     1.6 +@@ -129,9 +129,10 @@ _nss_dns_gethostbyname2_r (const char *n
     1.7 + 			   char *buffer, size_t buflen, int *errnop,
     1.8 + 			   int *h_errnop)
     1.9 + {
    1.10 +-  querybuf host_buffer;
    1.11 ++  querybuf *host_buffer;
    1.12 +   int size, type, n;
    1.13 +   const char *cp;
    1.14 ++  enum nss_status status;
    1.15 + 
    1.16 +   switch (af) {
    1.17 +   case AF_INET:
    1.18 +@@ -159,16 +160,25 @@ _nss_dns_gethostbyname2_r (const char *n
    1.19 +   if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
    1.20 +     name = cp;
    1.21 + 
    1.22 +-  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
    1.23 ++  host_buffer = (querybuf *) malloc (sizeof (*host_buffer));
    1.24 ++  if (host_buffer == NULL) {
    1.25 ++    *errnop = ENOMEM;
    1.26 ++    return NSS_STATUS_UNAVAIL;
    1.27 ++  }
    1.28 ++
    1.29 ++  n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf));
    1.30 +   if (n < 0)
    1.31 +     {
    1.32 +       *h_errnop = h_errno;
    1.33 +       *errnop = *h_errnop == TRY_AGAIN ? EAGAIN : ENOENT;
    1.34 ++      free (host_buffer);
    1.35 +       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
    1.36 +     }
    1.37 + 
    1.38 +-  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
    1.39 +-		      errnop, h_errnop);
    1.40 ++  status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
    1.41 ++			errnop, h_errnop);
    1.42 ++  free (host_buffer);
    1.43 ++  return status; 
    1.44 + }
    1.45 + 
    1.46 + 
    1.47 +@@ -205,7 +215,7 @@ _nss_dns_gethostbyaddr_r (const char *ad
    1.48 +     char *h_addr_ptrs[MAX_NR_ADDRS + 1];
    1.49 +     char linebuffer[0];
    1.50 +   } *host_data = (struct host_data *) buffer;
    1.51 +-  querybuf host_buffer;
    1.52 ++  querybuf *host_buffer;
    1.53 +   char qbuf[MAXDNAME+1], *qp;
    1.54 +   size_t size;
    1.55 +   int n, status;
    1.56 +@@ -257,17 +267,25 @@ _nss_dns_gethostbyaddr_r (const char *ad
    1.57 +       /* Cannot happen.  */
    1.58 +     }
    1.59 + 
    1.60 +-  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
    1.61 +-		 sizeof host_buffer);
    1.62 ++  host_buffer = (querybuf *) malloc (sizeof (*host_buffer));
    1.63 ++  if (host_buffer == NULL) {
    1.64 ++    *errnop = ENOMEM;
    1.65 ++    return NSS_STATUS_UNAVAIL;
    1.66 ++  }
    1.67 ++
    1.68 ++  n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf,
    1.69 ++		 sizeof (host_buffer->buf));
    1.70 +   if (n < 0)
    1.71 +     {
    1.72 +       *h_errnop = h_errno;
    1.73 +       *errnop = errno;
    1.74 ++      free (host_buffer);
    1.75 +       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
    1.76 +     }
    1.77 + 
    1.78 +-  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
    1.79 ++  status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
    1.80 + 			errnop, h_errnop);
    1.81 ++  free (host_buffer);
    1.82 +   if (status != NSS_STATUS_SUCCESS)
    1.83 +     {
    1.84 +       *h_errnop = h_errno;
    1.85 +--- libc/resolv/nss_dns/dns-network.c.jj	Wed Jun 30 12:01:14 1999
    1.86 ++++ libc/resolv/nss_dns/dns-network.c	Thu Oct 10 13:09:49 2002
    1.87 +@@ -113,24 +113,36 @@ _nss_dns_getnetbyname_r (const char *nam
    1.88 + 			 char *buffer, size_t buflen, int *errnop)
    1.89 + {
    1.90 +   /* Return entry for network with NAME.  */
    1.91 +-  querybuf net_buffer;
    1.92 ++  querybuf *net_buffer;
    1.93 +   int anslen;
    1.94 +   char *qbuf;
    1.95 ++  enum nss_status status;
    1.96 + 
    1.97 +   qbuf = strdupa (name);
    1.98 +-  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
    1.99 +-		       sizeof (querybuf));
   1.100 ++
   1.101 ++  net_buffer = (querybuf *) malloc (sizeof (*net_buffer));
   1.102 ++  if (net_buffer == NULL)
   1.103 ++    {
   1.104 ++      *errnop = ENOMEM;
   1.105 ++      return NSS_STATUS_UNAVAIL;
   1.106 ++    }
   1.107 ++
   1.108 ++  anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf,
   1.109 ++		       sizeof (net_buffer->buf));
   1.110 +   if (anslen < 0)
   1.111 +     {
   1.112 +       /* Nothing found.  */
   1.113 +       *errnop = errno;
   1.114 ++      free (net_buffer);
   1.115 +       return (errno == ECONNREFUSED
   1.116 + 	      || errno == EPFNOSUPPORT
   1.117 + 	      || errno == EAFNOSUPPORT)
   1.118 + 	? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.119 +     }
   1.120 + 
   1.121 +-  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
   1.122 ++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
   1.123 ++  free (net_buffer);
   1.124 ++  return status;
   1.125 + }
   1.126 + 
   1.127 + 
   1.128 +@@ -140,7 +152,7 @@ _nss_dns_getnetbyaddr_r (long net, int t
   1.129 + {
   1.130 +   /* Return entry for network with NAME.  */
   1.131 +   enum nss_status status;
   1.132 +-  querybuf net_buffer;
   1.133 ++  querybuf *net_buffer;
   1.134 +   unsigned int net_bytes[4];
   1.135 +   char qbuf[MAXDNAME];
   1.136 +   int cnt, anslen;
   1.137 +@@ -176,19 +188,28 @@ _nss_dns_getnetbyaddr_r (long net, int t
   1.138 +       break;
   1.139 +     }
   1.140 + 
   1.141 +-  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
   1.142 +-		      sizeof (querybuf));
   1.143 ++  net_buffer = (querybuf *) malloc (sizeof (*net_buffer));
   1.144 ++  if (net_buffer == NULL)
   1.145 ++    {
   1.146 ++      *errnop = ENOMEM;
   1.147 ++      return NSS_STATUS_UNAVAIL;
   1.148 ++    }
   1.149 ++
   1.150 ++  anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf,
   1.151 ++		      sizeof (net_buffer->buf));
   1.152 +   if (anslen < 0)
   1.153 +     {
   1.154 +       /* Nothing found.  */
   1.155 +       *errnop = errno;
   1.156 ++      free (net_buffer);
   1.157 +       return (errno == ECONNREFUSED
   1.158 + 	      || errno == EPFNOSUPPORT
   1.159 + 	      || errno == EAFNOSUPPORT)
   1.160 + 	? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.161 +     }
   1.162 + 
   1.163 +-  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
   1.164 ++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
   1.165 ++  free (net_buffer);
   1.166 +   if (status == NSS_STATUS_SUCCESS)
   1.167 +     {
   1.168 +       /* Strip trailing zeros.  */
   1.169 +--- libc/resolv/res_query.c.jj	Wed Jun 30 12:01:06 1999
   1.170 ++++ libc/resolv/res_query.c	Thu Oct 10 13:01:12 2002
   1.171 +@@ -106,7 +106,7 @@ res_query(name, class, type, answer, ans
   1.172 + 	u_char *answer;		/* buffer to put answer */
   1.173 + 	int anslen;		/* size of answer buffer */
   1.174 + {
   1.175 +-	u_char buf[MAXPACKET];
   1.176 ++	u_char *buf;
   1.177 + 	register HEADER *hp = (HEADER *) answer;
   1.178 + 	int n;
   1.179 + 
   1.180 +@@ -121,17 +121,25 @@ res_query(name, class, type, answer, ans
   1.181 + 		printf(";; res_query(%s, %d, %d)\n", name, class, type);
   1.182 + #endif
   1.183 + 
   1.184 ++	buf = malloc (MAXPACKET);
   1.185 ++	if (buf == NULL) {
   1.186 ++		__set_h_errno (NETDB_INTERNAL);
   1.187 ++		return -1;
   1.188 ++	}
   1.189 ++
   1.190 + 	n = res_mkquery(QUERY, name, class, type, NULL, 0, NULL,
   1.191 +-			buf, sizeof(buf));
   1.192 ++			buf, MAXPACKET);
   1.193 + 	if (n <= 0) {
   1.194 + #ifdef DEBUG
   1.195 + 		if (_res.options & RES_DEBUG)
   1.196 + 			printf(";; res_query: mkquery failed\n");
   1.197 + #endif
   1.198 + 		__set_h_errno (NO_RECOVERY);
   1.199 ++		free (buf);
   1.200 + 		return (n);
   1.201 + 	}
   1.202 + 	n = res_send(buf, n, answer, anslen);
   1.203 ++	free (buf);
   1.204 + 	if (n < 0) {
   1.205 + #ifdef DEBUG
   1.206 + 		if (_res.options & RES_DEBUG)
   1.207 +--- libc/resolv/gethnamaddr.c.jj	Tue Dec  7 11:50:36 1999
   1.208 ++++ libc/resolv/gethnamaddr.c	Thu Oct 10 15:05:50 2002
   1.209 +@@ -512,10 +512,11 @@ gethostbyname2(name, af)
   1.210 + 	const char *name;
   1.211 + 	int af;
   1.212 + {
   1.213 +-	querybuf buf;
   1.214 ++	querybuf *buf;
   1.215 + 	register const char *cp;
   1.216 + 	char *bp;
   1.217 + 	int n, size, type, len;
   1.218 ++	struct hostent *ret;
   1.219 + 	extern struct hostent *_gethtbyname2();
   1.220 + 
   1.221 + 	if ((_res.options & RES_INIT) == 0 && res_init() == -1) {
   1.222 +@@ -617,13 +618,22 @@ gethostbyname2(name, af)
   1.223 + 				break;
   1.224 + 		}
   1.225 + 
   1.226 +-	if ((n = res_search(name, C_IN, type, buf.buf, sizeof(buf.buf))) < 0) {
   1.227 ++	buf = (querybuf *) malloc (sizeof (*buf));
   1.228 ++	if (buf == NULL) {
   1.229 ++		__set_h_errno (NETDB_INTERNAL);
   1.230 ++		return NULL;
   1.231 ++	}
   1.232 ++
   1.233 ++	if ((n = res_search(name, C_IN, type, buf->buf, sizeof(buf->buf))) < 0) {
   1.234 ++		free (buf);
   1.235 + 		dprintf("res_search failed (%d)\n", n);
   1.236 + 		if (errno == ECONNREFUSED)
   1.237 + 			return (_gethtbyname2(name, af));
   1.238 + 		return (NULL);
   1.239 + 	}
   1.240 +-	return (getanswer(&buf, n, name, type));
   1.241 ++	ret = getanswer(buf, n, name, type);
   1.242 ++	free (buf);
   1.243 ++	return ret;
   1.244 + }
   1.245 + 
   1.246 + struct hostent *
   1.247 +@@ -636,7 +646,7 @@ gethostbyaddr(addr, len, af)
   1.248 + 	static const u_char mapped[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0xff,0xff };
   1.249 + 	static const u_char tunnelled[] = { 0,0, 0,0, 0,0, 0,0, 0,0, 0,0 };
   1.250 + 	int n, size;
   1.251 +-	querybuf buf;
   1.252 ++	querybuf *buf;
   1.253 + 	register struct hostent *hp;
   1.254 + 	char qbuf[MAXDNAME+1], *qp;
   1.255 + #ifdef SUNSECURITY
   1.256 +@@ -697,14 +707,24 @@ gethostbyaddr(addr, len, af)
   1.257 + 	default:
   1.258 + 		abort();
   1.259 + 	}
   1.260 +-	n = res_query(qbuf, C_IN, T_PTR, (u_char *)buf.buf, sizeof buf.buf);
   1.261 ++
   1.262 ++	buf = (querybuf *) malloc (sizeof (*buf));
   1.263 ++	if (buf == NULL) {
   1.264 ++		__set_h_errno (NETDB_INTERNAL);
   1.265 ++		return NULL;
   1.266 ++	}
   1.267 ++
   1.268 ++	n = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof buf->buf);
   1.269 + 	if (n < 0) {
   1.270 ++		free (buf);
   1.271 + 		dprintf("res_query failed (%d)\n", n);
   1.272 + 		if (errno == ECONNREFUSED)
   1.273 + 			return (_gethtbyaddr(addr, len, af));
   1.274 + 		return (NULL);
   1.275 + 	}
   1.276 +-	if (!(hp = getanswer(&buf, n, qbuf, T_PTR)))
   1.277 ++	hp = getanswer(buf, n, qbuf, T_PTR);
   1.278 ++	free (buf);
   1.279 ++	if (!hp)
   1.280 + 		return (NULL);	/* h_errno was set by getanswer() */
   1.281 + #ifdef SUNSECURITY
   1.282 + 	if (af == AF_INET) {
   1.283 +--- libc/resolv/getnetnamadr.c.jj	Wed Jun 30 12:00:50 1999
   1.284 ++++ libc/resolv/getnetnamadr.c	Thu Oct 10 13:14:01 2002
   1.285 +@@ -210,7 +210,7 @@ getnetbyaddr(net, net_type)
   1.286 + {
   1.287 + 	unsigned int netbr[4];
   1.288 + 	int nn, anslen;
   1.289 +-	querybuf buf;
   1.290 ++	querybuf *buf;
   1.291 + 	char qbuf[MAXDNAME];
   1.292 + 	u_int32_t net2;		/* Changed from unsigned long --roland */
   1.293 + 	struct netent *net_entry;
   1.294 +@@ -236,8 +236,15 @@ getnetbyaddr(net, net_type)
   1.295 + 		    netbr[1], netbr[0]);
   1.296 + 		break;
   1.297 + 	}
   1.298 +-	anslen = res_query(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
   1.299 ++
   1.300 ++	buf = (querybuf *) malloc (sizeof (*buf));
   1.301 ++	if (buf == NULL) {
   1.302 ++		return NULL;
   1.303 ++	}
   1.304 ++
   1.305 ++	anslen = res_query(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf));
   1.306 + 	if (anslen < 0) {
   1.307 ++		free (buf);
   1.308 + #ifdef DEBUG
   1.309 + 		if (_res.options & RES_DEBUG)
   1.310 + 			printf("res_query failed\n");
   1.311 +@@ -246,7 +253,8 @@ getnetbyaddr(net, net_type)
   1.312 + 			return (_getnetbyaddr(net, net_type));
   1.313 + 		return (NULL);
   1.314 + 	}
   1.315 +-	net_entry = getnetanswer(&buf, anslen, BYADDR);
   1.316 ++	net_entry = getnetanswer(buf, anslen, BYADDR);
   1.317 ++	free (buf);
   1.318 + 	if (net_entry) {
   1.319 + 		unsigned u_net = net;	/* maybe net should be unsigned ? */
   1.320 + 
   1.321 +@@ -264,7 +272,7 @@ getnetbyname(net)
   1.322 + 	register const char *net;
   1.323 + {
   1.324 + 	int anslen;
   1.325 +-	querybuf buf;
   1.326 ++	querybuf *buf;
   1.327 + 	char qbuf[MAXDNAME];
   1.328 + 	struct netent *net_entry;
   1.329 + 
   1.330 +@@ -273,8 +281,13 @@ getnetbyname(net)
   1.331 + 		return (NULL);
   1.332 + 	}
   1.333 + 	strcpy(&qbuf[0], net);
   1.334 +-	anslen = res_search(qbuf, C_IN, T_PTR, (u_char *)&buf, sizeof(buf));
   1.335 ++	buf = (querybuf *) malloc (sizeof (*buf));
   1.336 ++	if (buf == NULL) {
   1.337 ++		return NULL;
   1.338 ++	}
   1.339 ++	anslen = res_search(qbuf, C_IN, T_PTR, buf->buf, sizeof(buf->buf));
   1.340 + 	if (anslen < 0) {
   1.341 ++		free (buf);
   1.342 + #ifdef DEBUG
   1.343 + 		if (_res.options & RES_DEBUG)
   1.344 + 			printf("res_query failed\n");
   1.345 +@@ -283,7 +296,8 @@ getnetbyname(net)
   1.346 + 			return (_getnetbyname(net));
   1.347 + 		return (_getnetbyname(net));
   1.348 + 	}
   1.349 +-	net_entry = getnetanswer(&buf, anslen, BYNAME);
   1.350 ++	net_entry = getnetanswer(buf, anslen, BYNAME);
   1.351 ++	free (buf);
   1.352 + 	if (net_entry)
   1.353 + 		return (net_entry);
   1.354 + 	return (_getnetbyname(net));
   1.355 +--- libc/glibc-compat/nss_dns/dns-host.c.jj	Mon Jan  3 20:07:08 2000
   1.356 ++++ libc/glibc-compat/nss_dns/dns-host.c	Thu Oct 10 12:46:24 2002
   1.357 +@@ -126,9 +126,10 @@ enum nss_status
   1.358 + _nss_dns_gethostbyname2_r (const char *name, int af, struct hostent *result,
   1.359 + 			   char *buffer, size_t buflen, int *h_errnop)
   1.360 + {
   1.361 +-  querybuf host_buffer;
   1.362 ++  querybuf *host_buffer;
   1.363 +   int size, type, n;
   1.364 +   const char *cp;
   1.365 ++  enum nss_status status;
   1.366 + 
   1.367 +   switch (af) {
   1.368 +   case AF_INET:
   1.369 +@@ -156,15 +157,22 @@ _nss_dns_gethostbyname2_r (const char *n
   1.370 +   if (strchr (name, '.') == NULL && (cp = __hostalias (name)) != NULL)
   1.371 +     name = cp;
   1.372 + 
   1.373 +-  n = res_search (name, C_IN, type, host_buffer.buf, sizeof (host_buffer.buf));
   1.374 ++  host_buffer = (querybuf *) malloc (sizeof (querybuf));
   1.375 ++  if (host_buffer == NULL)
   1.376 ++    return NSS_STATUS_UNAVAIL;
   1.377 ++
   1.378 ++  n = res_search (name, C_IN, type, host_buffer->buf, sizeof (host_buffer->buf));
   1.379 +   if (n < 0)
   1.380 +     {
   1.381 +       *h_errnop = h_errno;
   1.382 ++      free (host_buffer);
   1.383 +       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.384 +     }
   1.385 + 
   1.386 +-  return getanswer_r (&host_buffer, n, name, type, result, buffer, buflen,
   1.387 +-		      h_errnop);
   1.388 ++  status = getanswer_r (host_buffer, n, name, type, result, buffer, buflen,
   1.389 ++			h_errnop);
   1.390 ++  free (host_buffer);
   1.391 ++  return status;
   1.392 + }
   1.393 + 
   1.394 + 
   1.395 +@@ -200,7 +208,7 @@ _nss_dns_gethostbyaddr_r (const char *ad
   1.396 +     char *h_addr_ptrs[MAX_NR_ADDRS + 1];
   1.397 +     char linebuffer[0];
   1.398 +   } *host_data = (struct host_data *) buffer;
   1.399 +-  querybuf host_buffer;
   1.400 ++  querybuf *host_buffer;
   1.401 +   char qbuf[MAXDNAME+1], *qp;
   1.402 +   int size, n, status;
   1.403 + 
   1.404 +@@ -251,16 +259,22 @@ _nss_dns_gethostbyaddr_r (const char *ad
   1.405 +       /* Cannot happen.  */
   1.406 +     }
   1.407 + 
   1.408 +-  n = res_query (qbuf, C_IN, T_PTR, (u_char *)host_buffer.buf,
   1.409 +-		 sizeof host_buffer);
   1.410 ++  host_buffer = (querybuf *) malloc (sizeof (querybuf));
   1.411 ++  if (host_buffer == NULL)
   1.412 ++    return NSS_STATUS_UNAVAIL;
   1.413 ++
   1.414 ++  n = res_query (qbuf, C_IN, T_PTR, host_buffer->buf,
   1.415 ++		 sizeof (host_buffer->buf));
   1.416 +   if (n < 0)
   1.417 +     {
   1.418 +       *h_errnop = h_errno;
   1.419 ++      free (host_buffer);
   1.420 +       return errno == ECONNREFUSED ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.421 +     }
   1.422 + 
   1.423 +-  status = getanswer_r (&host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
   1.424 ++  status = getanswer_r (host_buffer, n, qbuf, T_PTR, result, buffer, buflen,
   1.425 + 			h_errnop);
   1.426 ++  free (host_buffer);
   1.427 +   if (status != NSS_STATUS_SUCCESS)
   1.428 +     {
   1.429 +       *h_errnop = h_errno;
   1.430 +--- libc/glibc-compat/nss_dns/dns-network.c.jj	Mon Jan  3 20:07:08 2000
   1.431 ++++ libc/glibc-compat/nss_dns/dns-network.c	Thu Oct 10 12:46:24 2002
   1.432 +@@ -107,21 +107,32 @@ _nss_dns_getnetbyname_r (const char *nam
   1.433 + 			 char *buffer, size_t buflen)
   1.434 + {
   1.435 +   /* Return entry for network with NAME.  */
   1.436 +-  querybuf net_buffer;
   1.437 ++  querybuf *net_buffer;
   1.438 +   int anslen;
   1.439 +   char *qbuf;
   1.440 ++  enum nss_status status;
   1.441 + 
   1.442 +   qbuf = strdupa (name);
   1.443 +-  anslen = res_search (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
   1.444 +-		       sizeof (querybuf));
   1.445 ++
   1.446 ++  net_buffer = (querybuf *) malloc (sizeof (querybuf));
   1.447 ++  if (net_buffer == NULL)
   1.448 ++    return NSS_STATUS_UNAVAIL;
   1.449 ++
   1.450 ++  anslen = res_search (qbuf, C_IN, T_PTR, net_buffer->buf,
   1.451 ++		       sizeof (net_buffer->buf));
   1.452 +   if (anslen < 0)
   1.453 +-    /* Nothing found.  */
   1.454 +-    return (errno == ECONNREFUSED
   1.455 +-	    || errno == EPFNOSUPPORT
   1.456 +-	    || errno == EAFNOSUPPORT)
   1.457 +-      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.458 ++    {
   1.459 ++      free (net_buffer);
   1.460 ++      /* Nothing found.  */
   1.461 ++      return (errno == ECONNREFUSED
   1.462 ++	      || errno == EPFNOSUPPORT
   1.463 ++	      || errno == EAFNOSUPPORT)
   1.464 ++	      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.465 ++    }
   1.466 + 
   1.467 +-  return getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYNAME);
   1.468 ++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYNAME);
   1.469 ++  free (net_buffer);
   1.470 ++  return status;
   1.471 + }
   1.472 + 
   1.473 + 
   1.474 +@@ -131,7 +142,7 @@ _nss_dns_getnetbyaddr_r (long net, int t
   1.475 + {
   1.476 +   /* Return entry for network with NAME.  */
   1.477 +   enum nss_status status;
   1.478 +-  querybuf net_buffer;
   1.479 ++  querybuf *net_buffer;
   1.480 +   unsigned int net_bytes[4];
   1.481 +   char qbuf[MAXDNAME];
   1.482 +   int cnt, anslen;
   1.483 +@@ -167,16 +178,24 @@ _nss_dns_getnetbyaddr_r (long net, int t
   1.484 +       break;
   1.485 +     }
   1.486 + 
   1.487 +-  anslen = res_query (qbuf, C_IN, T_PTR, (u_char *) &net_buffer,
   1.488 +-		      sizeof (querybuf));
   1.489 ++  net_buffer = (querybuf *) malloc (sizeof (querybuf));
   1.490 ++  if (net_buffer == NULL)
   1.491 ++    return NSS_STATUS_UNAVAIL;
   1.492 ++
   1.493 ++  anslen = res_query (qbuf, C_IN, T_PTR, net_buffer->buf,
   1.494 ++		      sizeof (net_buffer->buf));
   1.495 +   if (anslen < 0)
   1.496 +-    /* Nothing found.  */
   1.497 +-    return (errno == ECONNREFUSED
   1.498 +-	    || errno == EPFNOSUPPORT
   1.499 +-	    || errno == EAFNOSUPPORT)
   1.500 +-      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.501 ++    {
   1.502 ++      free (net_buffer);
   1.503 ++      /* Nothing found.  */
   1.504 ++      return (errno == ECONNREFUSED
   1.505 ++	      || errno == EPFNOSUPPORT
   1.506 ++	      || errno == EAFNOSUPPORT)
   1.507 ++	      ? NSS_STATUS_UNAVAIL : NSS_STATUS_NOTFOUND;
   1.508 ++    }
   1.509 + 
   1.510 +-  status = getanswer_r (&net_buffer, anslen, result, buffer, buflen, BYADDR);
   1.511 ++  status = getanswer_r (net_buffer, anslen, result, buffer, buflen, BYADDR);
   1.512 ++  free (net_buffer);
   1.513 +   if (status == NSS_STATUS_SUCCESS)
   1.514 +     {
   1.515 +       /* Strip trailing zeros.  */