1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-10 17:42:29 +03:00

freeaddrinfo2() does need two parameters after all, per comment by

Kurt Roeckx.  Add some documentation to try to prevent others from
repeating my mistake.
This commit is contained in:
Tom Lane
2003-06-09 17:59:19 +00:00
parent 2df532d9a2
commit cdfb3d9981
5 changed files with 47 additions and 33 deletions

View File

@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/libpq/ip.c,v 1.8 2003/06/08 17:42:59 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/libpq/ip.c,v 1.9 2003/06/09 17:59:19 tgl Exp $
*
* This file and the IPV6 implementation were initially provided by
* Nigel Kukard <nkukard@lbsd.net>, Linux Based Systems Design
@@ -73,26 +73,34 @@ getaddrinfo2(const char *hostname, const char *servname,
/*
* freeaddrinfo2 - free addrinfo structures for IPv4, IPv6, or Unix
*
* Note: the ai_family field of the original hint structure must be passed
* so that we can tell whether the addrinfo struct was built by the system's
* getaddrinfo() routine or our own getaddrinfo_unix() routine. Some versions
* of getaddrinfo() might be willing to return AF_UNIX addresses, so it's
* not safe to look at ai_family in the addrinfo itself.
*/
void
freeaddrinfo2(struct addrinfo *ai)
freeaddrinfo2(int hint_ai_family, struct addrinfo *ai)
{
if (ai != NULL)
{
#ifdef HAVE_UNIX_SOCKETS
if (ai->ai_family == AF_UNIX)
if (hint_ai_family == AF_UNIX)
{
/* struct was built by getaddrinfo_unix (see getaddrinfo2) */
while (ai != NULL)
{
while (ai != NULL)
{
struct addrinfo *p = ai;
struct addrinfo *p = ai;
ai = ai->ai_next;
free(p->ai_addr);
free(p);
}
ai = ai->ai_next;
free(p->ai_addr);
free(p);
}
else
}
else
#endif /* HAVE_UNIX_SOCKETS */
{
/* struct was built by getaddrinfo() */
if (ai != NULL)
freeaddrinfo(ai);
}
}
@@ -115,6 +123,8 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp,
struct addrinfo *aip;
struct sockaddr_un *unp;
*result = NULL;
MemSet(&hints, 0, sizeof(hints));
if (hintsp == NULL)
@@ -138,6 +148,13 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp,
if (aip == NULL)
return EAI_MEMORY;
unp = calloc(1, sizeof(struct sockaddr_un));
if (unp == NULL)
{
free(aip);
return EAI_MEMORY;
}
aip->ai_family = AF_UNIX;
aip->ai_socktype = hints.ai_socktype;
aip->ai_protocol = hints.ai_protocol;
@@ -145,10 +162,6 @@ getaddrinfo_unix(const char *path, const struct addrinfo *hintsp,
aip->ai_canonname = NULL;
*result = aip;
unp = calloc(1, sizeof(struct sockaddr_un));
if (aip == NULL)
return EAI_MEMORY;
unp->sun_family = AF_UNIX;
aip->ai_addr = (struct sockaddr *) unp;
aip->ai_addrlen = sizeof(struct sockaddr_un);

View File

@@ -30,7 +30,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.155 2003/06/08 17:43:00 tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/libpq/pqcomm.c,v 1.156 2003/06/09 17:59:19 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -242,7 +242,7 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
{
elog(LOG, "server socket failure: getaddrinfo2(): %s",
gai_strerror(ret));
freeaddrinfo2(addrs);
freeaddrinfo2(hint.ai_family, addrs);
return STATUS_ERROR;
}
@@ -250,7 +250,7 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
{
elog(LOG, "server socket failure: socket(): %s",
strerror(errno));
freeaddrinfo2(addrs);
freeaddrinfo2(hint.ai_family, addrs);
return STATUS_ERROR;
}
@@ -261,7 +261,7 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
{
elog(LOG, "server socket failure: setsockopt(SO_REUSEADDR): %s",
strerror(errno));
freeaddrinfo2(addrs);
freeaddrinfo2(hint.ai_family, addrs);
return STATUS_ERROR;
}
}
@@ -278,7 +278,7 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
sock_path);
else
elog(LOG, "\tIf not, wait a few seconds and retry.");
freeaddrinfo2(addrs);
freeaddrinfo2(hint.ai_family, addrs);
return STATUS_ERROR;
}
@@ -287,7 +287,7 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
{
if (Setup_AF_UNIX() != STATUS_OK)
{
freeaddrinfo2(addrs);
freeaddrinfo2(hint.ai_family, addrs);
return STATUS_ERROR;
}
}
@@ -307,14 +307,13 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
{
elog(LOG, "server socket failure: listen(): %s",
strerror(errno));
freeaddrinfo2(addrs);
freeaddrinfo2(hint.ai_family, addrs);
return STATUS_ERROR;
}
*fdP = fd;
freeaddrinfo2(addrs);
freeaddrinfo2(hint.ai_family, addrs);
return STATUS_OK;
}