rpms/nspr/devel nspr-ipv6-numerichost.patch,1.2,1.3
fedora-cvs-commits at redhat.com
fedora-cvs-commits at redhat.com
Wed Mar 7 03:05:07 UTC 2007
Author: kengert
Update of /cvs/dist/rpms/nspr/devel
In directory cvs.devel.redhat.com:/tmp/cvs-serv25380
Modified Files:
nspr-ipv6-numerichost.patch
Log Message:
Adjust IPv6 patch to latest upstream version
nspr-ipv6-numerichost.patch:
include/md/_win95.h | 2
include/md/_winnt.h | 2
src/misc/prnetdb.c | 312 ++++++++++++++++++++++++++++++++++++----------------
3 files changed, 220 insertions(+), 96 deletions(-)
Index: nspr-ipv6-numerichost.patch
===================================================================
RCS file: /cvs/dist/rpms/nspr/devel/nspr-ipv6-numerichost.patch,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- nspr-ipv6-numerichost.patch 24 Feb 2007 08:29:22 -0000 1.2
+++ nspr-ipv6-numerichost.patch 7 Mar 2007 03:05:05 -0000 1.3
@@ -1,11 +1,10 @@
-? mozilla/nsprpub/pr/tests/detach.c
Index: mozilla/nsprpub/pr/include/md/_win95.h
===================================================================
RCS file: /cvsroot/mozilla/nsprpub/pr/include/md/_win95.h,v
retrieving revision 3.30.2.1
diff -u -r3.30.2.1 _win95.h
--- mozilla/nsprpub/pr/include/md/_win95.h 5 Apr 2006 21:51:23 -0000 3.30.2.1
-+++ mozilla/nsprpub/pr/include/md/_win95.h 20 Feb 2007 20:51:07 -0000
++++ mozilla/nsprpub/pr/include/md/_win95.h 22 Feb 2007 02:14:52 -0000
@@ -61,6 +61,8 @@
/* newer ws2tcpip.h provides these */
#ifndef AI_CANONNAME
@@ -21,7 +20,7 @@
retrieving revision 3.30
diff -u -r3.30 _winnt.h
--- mozilla/nsprpub/pr/include/md/_winnt.h 20 Jun 2005 22:05:20 -0000 3.30
-+++ mozilla/nsprpub/pr/include/md/_winnt.h 20 Feb 2007 20:51:07 -0000
++++ mozilla/nsprpub/pr/include/md/_winnt.h 22 Feb 2007 02:14:52 -0000
@@ -76,6 +76,8 @@
/* newer ws2tcpip.h provides these */
#ifndef AI_CANONNAME
@@ -37,68 +36,39 @@
retrieving revision 3.47.2.1
diff -u -r3.47.2.1 prnetdb.c
--- mozilla/nsprpub/pr/src/misc/prnetdb.c 14 Nov 2006 17:41:59 -0000 3.47.2.1
-+++ mozilla/nsprpub/pr/src/misc/prnetdb.c 20 Feb 2007 20:51:08 -0000
-@@ -39,6 +39,8 @@
++++ mozilla/nsprpub/pr/src/misc/prnetdb.c 22 Feb 2007 02:14:52 -0000
+@@ -1772,99 +1772,6 @@
- #include <string.h>
+ #endif /* !_PR_HAVE_INET_NTOP */
-+#define PR_AI_NUMERICHOST 0x4000 /* for internal use only */
-+
- /*
- * On Unix, the error code for gethostbyname() and gethostbyaddr()
- * is returned in the global variable h_errno, instead of the usual
-@@ -1775,63 +1777,70 @@
- PR_IMPLEMENT(PRStatus) PR_StringToNetAddr(const char *string, PRNetAddr *addr)
- {
- PRStatus status = PR_SUCCESS;
+-PR_IMPLEMENT(PRStatus) PR_StringToNetAddr(const char *string, PRNetAddr *addr)
+-{
+- PRStatus status = PR_SUCCESS;
- PRIntn rv;
-+ PRAddrInfo *infop = NULL;
-+ PRNetAddr laddr;
-
+-
-#if defined(_PR_HAVE_INET_NTOP)
- rv = inet_pton(AF_INET6, string, &addr->ipv6.ip);
- if (1 == rv)
-+ if (NULL == addr)
- {
+- {
- addr->raw.family = PR_AF_INET6;
-+ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
-+ return PR_FAILURE;
- }
+- }
- else
-+ infop = PR_GetAddrInfoByName(string, PR_AF_UNSPEC,
-+ PR_AI_NUMERICHOST|PR_AI_ADDRCONFIG);
-+ if (NULL == infop)
-+ {
-+ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
-+ return PR_FAILURE;
-+ }
-+ if (PR_EnumerateAddrInfo(NULL, infop, 0, &laddr) != NULL)
- {
+- {
- PR_ASSERT(0 == rv);
- /* clean up after the failed inet_pton() call */
- memset(&addr->ipv6.ip, 0, sizeof(addr->ipv6.ip));
- rv = inet_pton(AF_INET, string, &addr->inet.ip);
- if (1 == rv)
-+ /* pick up the first addr */
-+ if (PR_AF_INET6 == laddr.raw.family)
-+ {
-+ addr->ipv6.family = laddr.ipv6.family;
-+ addr->ipv6.ip = laddr.ipv6.ip;
-+ addr->ipv6.scope_id = laddr.ipv6.scope_id;
-+ }
-+ else if (PR_AF_INET == laddr.raw.family)
- {
+- {
- addr->raw.family = AF_INET;
-+ addr->inet.family = laddr.inet.family;
-+ addr->inet.ip = laddr.inet.ip;
- }
- else
- {
+- }
+- else
+- {
- PR_ASSERT(0 == rv);
- PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
- status = PR_FAILURE;
- }
- }
+- PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
+- status = PR_FAILURE;
+- }
+- }
-#else /* _PR_HAVE_INET_NTOP */
- rv = StringToV6Addr(string, &addr->ipv6.ip);
- if (1 == rv) {
@@ -116,53 +86,58 @@
- addr->inet.ip = inet_addr(string);
-#endif
- if ((PRUint32) -1 == addr->inet.ip)
-+ else
- {
+- {
- /*
- * The string argument is a malformed address string.
- */
- PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
- status = PR_FAILURE;
- }
+- PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
+- status = PR_FAILURE;
+- }
-#endif /* _PR_HAVE_INET_NTOP */
-
-+ PR_FreeAddrInfo(infop);
- return status;
- }
-
-+static int
-+pr_GetNameInfo(const PRNetAddr *addr, size_t addrlen,
-+ char *host, size_t hostlen,
-+ char *serv, size_t servlen, PRIntn flags);
-+
- PR_IMPLEMENT(PRStatus) PR_NetAddrToString(
- const PRNetAddr *addr, char *string, PRUint32 size)
- {
-+#if defined(_PR_HAVE_GETADDRINFO)
-+ PRIntn rv = 0;
-+ size_t addrlen = 0;
-+
-+ if (NULL == string || 0 == size)
-+ goto failed;
-+ addrlen = PR_NETADDR_SIZE(addr);
-+ rv = pr_GetNameInfo(addr, addrlen, string, size, NULL, 0, NI_NUMERICHOST);
-+ if (rv != 0)
-+ goto failed;
-+ return PR_SUCCESS;
-+#else
- if (PR_AF_INET6 == addr->raw.family)
- {
- #if defined(_PR_HAVE_INET_NTOP)
-@@ -1858,7 +1867,7 @@
- }
-
- return PR_SUCCESS;
+- return status;
+-}
-
-+#endif
- failed:
- PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
- return PR_FAILURE;
-@@ -1947,6 +1956,7 @@
+-PR_IMPLEMENT(PRStatus) PR_NetAddrToString(
+- const PRNetAddr *addr, char *string, PRUint32 size)
+-{
+- if (PR_AF_INET6 == addr->raw.family)
+- {
+-#if defined(_PR_HAVE_INET_NTOP)
+- if (NULL == inet_ntop(AF_INET6, &addr->ipv6.ip, string, size))
+-#else
+- if (NULL == V6AddrToString(&addr->ipv6.ip, string, size))
+-#endif
+- {
+- /* the size of the result buffer is inadequate */
+- PR_SetError(PR_BUFFER_OVERFLOW_ERROR, 0);
+- return PR_FAILURE;
+- }
+- }
+- else
+- {
+- if (size < 16) goto failed;
+- if (AF_INET != addr->raw.family) goto failed;
+- else
+- {
+- unsigned char *byte = (unsigned char*)&addr->inet.ip;
+- PR_snprintf(string, size, "%u.%u.%u.%u",
+- byte[0], byte[1], byte[2], byte[3]);
+- }
+- }
+-
+- return PR_SUCCESS;
+-
+-failed:
+- PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
+- return PR_FAILURE;
+-
+-} /* PR_NetAddrToString */
+-
+ /*
+ * Convert an IPv4 addr to an (IPv4-mapped) IPv6 addr
+ */
+@@ -1947,12 +1854,13 @@
typedef struct addrinfo PRADDRINFO;
#define GETADDRINFO getaddrinfo
#define FREEADDRINFO freeaddrinfo
@@ -170,7 +145,14 @@
#elif defined(_PR_INET6_PROBE)
-@@ -1965,17 +1975,24 @@
+ typedef struct addrinfo PRADDRINFO;
+
+-/* getaddrinfo/freeaddrinfo prototypes */
++/* getaddrinfo/freeaddrinfo/getnameinfo prototypes */
+ #if defined(WIN32)
+ #define FUNC_MODIFIER __stdcall
+ #else
+@@ -1965,17 +1873,24 @@
PRADDRINFO **res);
typedef int (FUNC_MODIFIER * FN_FREEADDRINFO)
(PRADDRINFO *ai);
@@ -195,33 +177,33 @@
#endif
PRStatus
-@@ -2003,6 +2020,12 @@
- PR_UnloadLibrary(lib);
- continue;
+@@ -2005,7 +1920,12 @@
}
+ _pr_freeaddrinfo = (FN_FREEADDRINFO)
+ PR_FindFunctionSymbol(lib, FREEADDRINFO_SYMBOL);
+- PR_ASSERT(_pr_freeaddrinfo);
+ _pr_getnameinfo = (FN_GETNAMEINFO)
+ PR_FindFunctionSymbol(lib, GETNAMEINFO_SYMBOL);
-+ if (!_pr_getnameinfo) {
++ if (!_pr_freeaddrinfo || !_pr_getnameinfo) {
+ PR_UnloadLibrary(lib);
+ continue;
+ }
- _pr_freeaddrinfo = (FN_FREEADDRINFO)
- PR_FindFunctionSymbol(lib, FREEADDRINFO_SYMBOL);
- PR_ASSERT(_pr_freeaddrinfo);
-@@ -2020,6 +2043,12 @@
- if (!_pr_getaddrinfo) {
- return PR_FAILURE;
+ /* Keep the library loaded. */
+ return PR_SUCCESS;
+ }
+@@ -2022,8 +1942,10 @@
}
-+ _pr_getnameinfo = (FN_GETNAMEINFO)
-+ PR_FindFunctionSymbol(lib, GETNAMEINFO_SYMBOL);
-+ if (!_pr_getnameinfo) {
-+ PR_UnloadLibrary(lib);
-+ return PR_FAILURE;
-+ }
_pr_freeaddrinfo = (FN_FREEADDRINFO)
PR_FindFunctionSymbol(lib, FREEADDRINFO_SYMBOL);
++ _pr_getnameinfo = (FN_GETNAMEINFO)
++ PR_FindFunctionSymbol(lib, GETNAMEINFO_SYMBOL);
PR_UnloadLibrary(lib);
-@@ -2032,6 +2061,7 @@
+- if (!_pr_freeaddrinfo) {
++ if (!_pr_freeaddrinfo || !_pr_getnameinfo) {
+ return PR_FAILURE;
+ }
+ return PR_SUCCESS;
+@@ -2032,6 +1954,7 @@
#define GETADDRINFO (*_pr_getaddrinfo)
#define FREEADDRINFO (*_pr_freeaddrinfo)
@@ -229,104 +211,204 @@
#endif /* _PR_INET6 */
-@@ -2048,6 +2078,46 @@
- PRBool has_cname;
- } PRAddrInfoFB;
-
-+static PRBool
-+pr_IsValidNumericHost(const char *string)
+@@ -2201,3 +2124,200 @@
+ return fb->has_cname ? fb->hostent.h_name : NULL;
+ #endif
+ }
++
++#if defined(_PR_HAVE_GETADDRINFO)
++static PRStatus pr_StringToNetAddrGAI(const char *string, PRNetAddr *addr)
++{
++ PRADDRINFO *res, hints;
++ int rv; /* 0 for success, or the error code EAI_xxx */
++ PRNetAddr laddr;
++ PRStatus status = PR_SUCCESS;
++
++ if (NULL == addr)
++ {
++ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
++ return PR_FAILURE;
++ }
++
++ memset(&hints, 0, sizeof(hints));
++ hints.ai_flags = AI_NUMERICHOST;
++ hints.ai_family = AF_UNSPEC;
++ hints.ai_socktype = SOCK_STREAM;
++
++ rv = GETADDRINFO(string, NULL, &hints, &res);
++ if (rv != 0)
++ {
++ PR_SetError(PR_INVALID_ARGUMENT_ERROR, rv);
++ return PR_FAILURE;
++ }
++
++ /* pick up the first addr */
++ memcpy(&laddr, res->ai_addr, res->ai_addrlen);
++ if (AF_INET6 == res->ai_addr->sa_family)
++ {
++ addr->ipv6.family = PR_AF_INET6;
++ addr->ipv6.ip = laddr.ipv6.ip;
++ addr->ipv6.scope_id = laddr.ipv6.scope_id;
++ }
++ else if (AF_INET == res->ai_addr->sa_family)
++ {
++ addr->inet.family = PR_AF_INET;
++ addr->inet.ip = laddr.inet.ip;
++ }
++ else
++ {
++ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
++ status = PR_FAILURE;
++ }
++
++ FREEADDRINFO(res);
++ return status;
++}
++#endif /* _PR_HAVE_GETADDRINFO */
++
++#if !defined(_PR_HAVE_GETADDRINFO) || defined(_PR_INET6_PROBE)
++static PRStatus pr_StringToNetAddrFB(const char *string, PRNetAddr *addr)
+{
-+ PRNetAddr addr;
++ PRStatus status = PR_SUCCESS;
+ PRIntn rv;
++
+#if defined(_PR_HAVE_INET_NTOP)
-+ rv = inet_pton(AF_INET6, string, &addr.ipv6.ip);
-+ if (0 < rv) {
-+ return PR_TRUE;
++ rv = inet_pton(AF_INET6, string, &addr->ipv6.ip);
++ if (1 == rv)
++ {
++ addr->raw.family = PR_AF_INET6;
+ }
-+ PR_ASSERT(0 == rv);
-+ memset(&addr.ipv6.ip, 0, sizeof(addr.ipv6.ip));
-+ rv = inet_pton(AF_INET, string, &addr.inet.ip);
-+ if (0 < rv) {
-+ return PR_TRUE;
++ else
++ {
++ PR_ASSERT(0 == rv);
++ /* clean up after the failed inet_pton() call */
++ memset(&addr->ipv6.ip, 0, sizeof(addr->ipv6.ip));
++ rv = inet_pton(AF_INET, string, &addr->inet.ip);
++ if (1 == rv)
++ {
++ addr->raw.family = AF_INET;
++ }
++ else
++ {
++ PR_ASSERT(0 == rv);
++ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
++ status = PR_FAILURE;
++ }
+ }
-+ return PR_FALSE;
+#else /* _PR_HAVE_INET_NTOP */
-+ rv = StringToV6Addr(string, &addr.ipv6.ip);
-+ if (0 < rv) {
-+ return PR_TRUE;
++ rv = StringToV6Addr(string, &addr->ipv6.ip);
++ if (1 == rv) {
++ addr->raw.family = PR_AF_INET6;
++ return PR_SUCCESS;
+ }
+ PR_ASSERT(0 == rv);
+ /* clean up after the failed StringToV6Addr() call */
-+ memset(&addr.ipv6.ip, 0, sizeof(addr.ipv6.ip));
++ memset(&addr->ipv6.ip, 0, sizeof(addr->ipv6.ip));
++
++ addr->inet.family = AF_INET;
+#ifdef XP_OS2_VACPP
-+ addr.inet.ip = inet_addr((char *)string);
++ addr->inet.ip = inet_addr((char *)string);
+#else
-+ addr.inet.ip = inet_addr(string);
++ addr->inet.ip = inet_addr(string);
+#endif
-+ if ((PRUint32) -1 == addr.inet.ip) {
++ if ((PRUint32) -1 == addr->inet.ip)
++ {
+ /*
+ * The string argument is a malformed address string.
+ */
-+ return PR_FALSE;
++ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
++ status = PR_FAILURE;
+ }
-+ return PR_TRUE;
++#endif /* _PR_HAVE_INET_NTOP */
++
++ return status;
++}
++#endif /* !_PR_HAVE_GETADDRINFO || _PR_INET6_PROBE */
++
++PR_IMPLEMENT(PRStatus) PR_StringToNetAddr(const char *string, PRNetAddr *addr)
++{
++ if (!_pr_initialized) _PR_ImplicitInitialization();
++
++#if !defined(_PR_HAVE_GETADDRINFO)
++ return pr_StringToNetAddrFB(string, addr);
++#else
++#if defined(_PR_INET6_PROBE)
++ if (!_pr_ipv6_is_present)
++ return pr_StringToNetAddrFB(string, addr);
++#endif
++ return pr_StringToNetAddrGAI(string, addr);
+#endif
+}
+
- static PRAddrInfo *
- pr_GetAddrInfoByNameFB(const char *hostname,
- PRUint16 af,
-@@ -2055,6 +2125,13 @@
- {
- PRStatus rv;
- PRAddrInfoFB *ai;
-+
-+ if (flags & PR_AI_NUMERICHOST) {
-+ if (!pr_IsValidNumericHost(hostname)) {
-+ PR_SetError(PR_BAD_ADDRESS_ERROR, 0);
-+ return NULL;
-+ }
++#if defined(_PR_HAVE_GETADDRINFO)
++static PRStatus pr_NetAddrToStringGNI(
++ const PRNetAddr *addr, char *string, PRUint32 size)
++{
++ int addrlen;
++ int rv; /* 0 for success, or the error code EAI_xxx */
++
++ addrlen = PR_NETADDR_SIZE(addr);
++ rv = GETNAMEINFO((const struct sockaddr *)addr, addrlen,
++ string, size, NULL, 0, NI_NUMERICHOST);
++ if (rv != 0)
++ {
++ PR_SetError(PR_INVALID_ARGUMENT_ERROR, rv);
++ return PR_FAILURE;
+ }
- /* fallback on PR_GetHostByName */
- ai = PR_NEW(PRAddrInfoFB);
- if (!ai) {
-@@ -2077,7 +2154,7 @@
- {
- /* restrict input to supported values */
- if ((af != PR_AF_INET && af != PR_AF_UNSPEC) ||
-- (flags & ~ PR_AI_NOCANONNAME) != PR_AI_ADDRCONFIG) {
-+ (flags & ~ (PR_AI_NOCANONNAME|PR_AI_NUMERICHOST)) != PR_AI_ADDRCONFIG) {
- PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
- return NULL;
- }
-@@ -2104,6 +2181,7 @@
-
- memset(&hints, 0, sizeof(hints));
- hints.ai_flags = (flags & PR_AI_NOCANONNAME) ? 0: AI_CANONNAME;
-+ hints.ai_flags |= (flags & PR_AI_NUMERICHOST) ? AI_NUMERICHOST : 0;
- hints.ai_family = (af == PR_AF_INET) ? AF_INET : AF_UNSPEC;
-
- /*
-@@ -2139,6 +2217,22 @@
- #endif
- }
-
-+/*
-+ * A wrapper function for getnameinfo
-+ * Caution: Not implemented for the system that does not have "getnameinfo"
-+ */
-+static int
-+pr_GetNameInfo(const PRNetAddr *addr, size_t addrlen,
-+ char *host, size_t hostlen,
-+ char *serv, size_t servlen, PRIntn flags)
++ return PR_SUCCESS;
++}
++#endif /* _PR_HAVE_GETADDRINFO */
++
++#if !defined(_PR_HAVE_GETADDRINFO) || defined(_PR_INET6_PROBE)
++static PRStatus pr_NetAddrToStringFB(
++ const PRNetAddr *addr, char *string, PRUint32 size)
+{
-+#if defined(_PR_HAVE_GETADDRINFO)
-+ return GETNAMEINFO((const struct sockaddr *)addr, addrlen, host, hostlen, serv, servlen, flags);
++ if (PR_AF_INET6 == addr->raw.family)
++ {
++#if defined(_PR_HAVE_INET_NTOP)
++ if (NULL == inet_ntop(AF_INET6, &addr->ipv6.ip, string, size))
+#else
-+ return EAI_SYSTEM; /* not implemented */
++ if (NULL == V6AddrToString(&addr->ipv6.ip, string, size))
+#endif
-+}
++ {
++ /* the size of the result buffer is inadequate */
++ PR_SetError(PR_BUFFER_OVERFLOW_ERROR, 0);
++ return PR_FAILURE;
++ }
++ }
++ else
++ {
++ if (size < 16) goto failed;
++ if (AF_INET != addr->raw.family) goto failed;
++ else
++ {
++ unsigned char *byte = (unsigned char*)&addr->inet.ip;
++ PR_snprintf(string, size, "%u.%u.%u.%u",
++ byte[0], byte[1], byte[2], byte[3]);
++ }
++ }
+
- PR_IMPLEMENT(void *) PR_EnumerateAddrInfo(void *iterPtr,
- const PRAddrInfo *base,
- PRUint16 port,
++ return PR_SUCCESS;
++
++failed:
++ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0);
++ return PR_FAILURE;
++
++} /* pr_NetAddrToStringFB */
++#endif /* !_PR_HAVE_GETADDRINFO || _PR_INET6_PROBE */
++
++PR_IMPLEMENT(PRStatus) PR_NetAddrToString(
++ const PRNetAddr *addr, char *string, PRUint32 size)
++{
++ if (!_pr_initialized) _PR_ImplicitInitialization();
++
++#if !defined(_PR_HAVE_GETADDRINFO)
++ return pr_NetAddrToStringFB(addr, string, size);
++#else
++#if defined(_PR_INET6_PROBE)
++ if (!_pr_ipv6_is_present)
++ return pr_NetAddrToStringFB(addr, string, size);
++#endif
++ return pr_NetAddrToStringGNI(addr, string, size);
++#endif
++} /* PR_NetAddrToString */
More information about the fedora-cvs-commits
mailing list