getnameinfo: Use struct scratch_buffer instead of extend_alloca

This patch adjusts the internal function nrl_domainname, too.
This commit is contained in:
Florian Weimer 2015-04-08 20:56:35 +02:00
parent 794a74af4d
commit c6ee40da8b
2 changed files with 59 additions and 27 deletions

View File

@ -11,6 +11,7 @@
grp/compat-initgroups.c.
* nis/nss_compat/compat-initgroups.c (_nss_compat_initgroups_dyn):
Rewrite to use struct scratch_buffer instead of extend_alloca.
* inet/getnameinfo.c (nrl_domainname, getnameinfo): Likewise.
2015-04-08 Joseph Myers <joseph@codesourcery.com>

View File

@ -35,7 +35,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
/* This software is Copyright 1996 by Craig Metz, All Rights Reserved. */
#include <alloca.h>
#include <errno.h>
#include <netdb.h>
#include <stddef.h>
@ -53,6 +52,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <sys/un.h>
#include <sys/utsname.h>
#include <bits/libc-lock.h>
#include <scratch_buffer.h>
#ifdef HAVE_LIBIDN
# include <libidn/idna.h>
@ -82,17 +82,21 @@ nrl_domainname (void)
{
char *c;
struct hostent *h, th;
size_t tmpbuflen = 1024;
char *tmpbuf = alloca (tmpbuflen);
int herror;
struct scratch_buffer tmpbuf;
scratch_buffer_init (&tmpbuf);
not_first = 1;
while (__gethostbyname_r ("localhost", &th, tmpbuf, tmpbuflen, &h,
&herror))
while (__gethostbyname_r ("localhost", &th,
tmpbuf.data, tmpbuf.length,
&h, &herror))
{
if (herror == NETDB_INTERNAL && errno == ERANGE)
tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen);
{
if (!scratch_buffer_grow (&tmpbuf))
goto done;
}
else
break;
}
@ -103,22 +107,26 @@ nrl_domainname (void)
{
/* The name contains no domain information. Use the name
now to get more information. */
while (__gethostname (tmpbuf, tmpbuflen))
tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen);
while (__gethostname (tmpbuf.data, tmpbuf.length))
if (!scratch_buffer_grow (&tmpbuf))
goto done;
if ((c = strchr (tmpbuf, '.')))
if ((c = strchr (tmpbuf.data, '.')))
domain = __strdup (++c);
else
{
/* We need to preserve the hostname. */
const char *hstname = strdupa (tmpbuf);
const char *hstname = strdupa (tmpbuf.data);
while (__gethostbyname_r (hstname, &th, tmpbuf, tmpbuflen,
while (__gethostbyname_r (hstname, &th,
tmpbuf.data, tmpbuf.length,
&h, &herror))
{
if (herror == NETDB_INTERNAL && errno == ERANGE)
tmpbuf = extend_alloca (tmpbuf, tmpbuflen,
2 * tmpbuflen);
{
if (!scratch_buffer_grow (&tmpbuf))
goto done;
}
else
break;
}
@ -133,12 +141,15 @@ nrl_domainname (void)
while (__gethostbyaddr_r ((const char *) &in_addr,
sizeof (struct in_addr),
AF_INET, &th, tmpbuf,
tmpbuflen, &h, &herror))
AF_INET, &th,
tmpbuf.data, tmpbuf.length,
&h, &herror))
{
if (herror == NETDB_INTERNAL && errno == ERANGE)
tmpbuf = extend_alloca (tmpbuf, tmpbuflen,
2 * tmpbuflen);
{
if (!scratch_buffer_grow (&tmpbuf))
goto done;
}
else
break;
}
@ -148,6 +159,8 @@ nrl_domainname (void)
}
}
}
done:
scratch_buffer_free (&tmpbuf);
}
__libc_lock_unlock (lock);
@ -163,11 +176,12 @@ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host,
int flags)
{
int serrno = errno;
int tmpbuflen = 1024;
int herrno;
char *tmpbuf = alloca (tmpbuflen);
struct hostent th;
int ok = 0;
struct scratch_buffer tmpbuf;
scratch_buffer_init (&tmpbuf);
if (flags & ~(NI_NUMERICHOST|NI_NUMERICSERV|NI_NOFQDN|NI_NAMEREQD|NI_DGRAM
#ifdef HAVE_LIBIDN
@ -212,21 +226,35 @@ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host,
{
while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in6 *) sa)->sin6_addr),
sizeof(struct in6_addr),
AF_INET6, &th, tmpbuf, tmpbuflen,
AF_INET6, &th,
tmpbuf.data, tmpbuf.length,
&h, &herrno))
if (herrno == NETDB_INTERNAL && errno == ERANGE)
tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen);
{
if (!scratch_buffer_grow (&tmpbuf))
{
__set_h_errno (herrno);
return EAI_MEMORY;
}
}
else
break;
}
else
{
while (__gethostbyaddr_r ((const void *) &(((const struct sockaddr_in *)sa)->sin_addr),
sizeof(struct in_addr), AF_INET,
&th, tmpbuf, tmpbuflen,
sizeof(struct in_addr),
AF_INET, &th,
tmpbuf.data, tmpbuf.length,
&h, &herrno))
if (herrno == NETDB_INTERNAL && errno == ERANGE)
tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen);
{
if (!scratch_buffer_grow (&tmpbuf))
{
__set_h_errno (herrno);
return EAI_MEMORY;
}
}
else
break;
}
@ -401,11 +429,14 @@ getnameinfo (const struct sockaddr *sa, socklen_t addrlen, char *host,
int e;
while ((e = __getservbyport_r (((const struct sockaddr_in *) sa)->sin_port,
((flags & NI_DGRAM)
? "udp" : "tcp"),
&ts, tmpbuf, tmpbuflen, &s)))
? "udp" : "tcp"), &ts,
tmpbuf.data, tmpbuf.length, &s)))
{
if (e == ERANGE)
tmpbuf = extend_alloca (tmpbuf, tmpbuflen, 2 * tmpbuflen);
{
if (!scratch_buffer_grow (&tmpbuf))
return EAI_MEMORY;
}
else
break;
}