diff --git a/nspr-ipv6-numerichost.patch b/nspr-ipv6-numerichost.patch index d570ee3..e0c8512 100644 --- a/nspr-ipv6-numerichost.patch +++ b/nspr-ipv6-numerichost.patch @@ -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 @@ RCS file: /cvsroot/mozilla/nsprpub/pr/include/md/_winnt.h,v 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 @@ RCS file: /cvsroot/mozilla/nsprpub/pr/src/misc/prnetdb.c,v 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 + #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 @@ diff -u -r3.47.2.1 prnetdb.c - 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 @@ diff -u -r3.47.2.1 prnetdb.c #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 @@ diff -u -r3.47.2.1 prnetdb.c #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 @@ diff -u -r3.47.2.1 prnetdb.c #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 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 */ + -+ if (flags & PR_AI_NUMERICHOST) { -+ if (!pr_IsValidNumericHost(hostname)) { -+ PR_SetError(PR_BAD_ADDRESS_ERROR, 0); -+ return NULL; -+ } ++ 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 */