Skip to content

Commit

Permalink
getnameinfo: Use struct scratch_buffer instead of extend_alloca
Browse files Browse the repository at this point in the history
This patch adjusts the internal function nrl_domainname, too.
  • Loading branch information
Florian Weimer committed Apr 8, 2015
1 parent 794a74a commit c6ee40d
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 27 deletions.
1 change: 1 addition & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down
85 changes: 58 additions & 27 deletions inet/getnameinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand All @@ -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>
Expand Down Expand Up @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -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;
}
Expand All @@ -148,6 +159,8 @@ nrl_domainname (void)
}
}
}
done:
scratch_buffer_free (&tmpbuf);
}

__libc_lock_unlock (lock);
Expand All @@ -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
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit c6ee40d

Please sign in to comment.