Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 145537 Details for
Bug 222554
fix IPv6 support in PR_StringToNetAddr, PR_GetAddrInfoByName
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
patch to fix IPv6 in nspr 4.6.4
ipv6.patch (text/plain), 15.20 KB, created by
Rich Megginson
on 2007-01-14 02:38:59 UTC
(
hide
)
Description:
patch to fix IPv6 in nspr 4.6.4
Filename:
MIME Type:
Creator:
Rich Megginson
Created:
2007-01-14 02:38:59 UTC
Size:
15.20 KB
patch
obsolete
>--- mozilla/nsprpub/pr/include/md/_hpux.h~ Mon Nov 13 17:53:00 2006 >+++ mozilla/nsprpub/pr/include/md/_hpux.h Thu Dec 21 14:05:08 2006 >@@ -98,21 +98,22 @@ > extern PRInt32 _PR_ia64_AtomicDecrement(PRInt32 *val); > #define _MD_ATOMIC_DECREMENT _PR_ia64_AtomicDecrement > extern PRInt32 _PR_ia64_AtomicAdd(PRInt32 *ptr, PRInt32 val); > #define _MD_ATOMIC_ADD _PR_ia64_AtomicAdd > extern PRInt32 _PR_ia64_AtomicSet(PRInt32 *val, PRInt32 newval); > #define _MD_ATOMIC_SET _PR_ia64_AtomicSet > #endif > >-#ifdef _PR_INET6 >-#define _PR_HAVE_INET_NTOP > #define _PR_HAVE_GETIPNODEBYNAME > #define _PR_HAVE_GETIPNODEBYADDR > #define _PR_HAVE_GETADDRINFO >+#ifdef _PR_INET6 >+#define _PR_HAVE_INET_NTOP >+#else > #define _PR_INET6_PROBE > #endif > > #if !defined(_PR_PTHREADS) > > #include <syscall.h> > #include <setjmp.h> > >--- mozilla/nsprpub/pr/include/md/_win95.h~ Wed Apr 5 15:51:23 2006 >+++ mozilla/nsprpub/pr/include/md/_win95.h Thu Dec 21 14:05:08 2006 >@@ -56,16 +56,18 @@ > #undef HAVE_THREAD_AFFINITY > #define _PR_HAVE_GETADDRINFO > #define _PR_INET6_PROBE > #ifndef _PR_INET6 > #define AF_INET6 23 > /* newer ws2tcpip.h provides these */ > #ifndef AI_CANONNAME > #define AI_CANONNAME 0x2 >+#define AI_NUMERICHOST 0x4 >+#define NI_NUMERICHOST 0x02 > struct addrinfo { > int ai_flags; > int ai_family; > int ai_socktype; > int ai_protocol; > size_t ai_addrlen; > char *ai_canonname; > struct sockaddr *ai_addr; >--- mozilla/nsprpub/pr/include/md/_winnt.h~ Mon Jun 20 16:05:20 2005 >+++ mozilla/nsprpub/pr/include/md/_winnt.h Thu Dec 21 14:05:08 2006 >@@ -71,16 +71,18 @@ > #define HAVE_THREAD_AFFINITY > #define _PR_HAVE_GETADDRINFO > #define _PR_INET6_PROBE > #ifndef _PR_INET6 > #define AF_INET6 23 > /* newer ws2tcpip.h provides these */ > #ifndef AI_CANONNAME > #define AI_CANONNAME 0x2 >+#define AI_NUMERICHOST 0x4 >+#define NI_NUMERICHOST 0x02 > struct addrinfo { > int ai_flags; > int ai_family; > int ai_socktype; > int ai_protocol; > size_t ai_addrlen; > char *ai_canonname; > struct sockaddr *ai_addr; >--- mozilla/nsprpub/pr/src/misc/prnetdb.c~ Tue Nov 14 10:41:59 2006 >+++ mozilla/nsprpub/pr/src/misc/prnetdb.c Thu Dec 21 14:05:08 2006 >@@ -34,16 +34,18 @@ > * the terms of any one of the MPL, the GPL or the LGPL. > * > * ***** END LICENSE BLOCK ***** */ > > #include "primpl.h" > > #include <string.h> > >+#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 > * errno. > */ > #if defined(XP_UNIX) > #if defined(_PR_NEED_H_ERRNO) > extern int h_errno; >@@ -1770,73 +1772,80 @@ > #undef STUFF > } > > #endif /* !_PR_HAVE_INET_NTOP */ > > 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_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) >+ PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); >+ return PR_FAILURE; >+ } >+ if (PR_EnumerateAddrInfo(NULL, infop, 0, &laddr) != NULL) >+ { >+ /* pick up the first addr */ >+ if (PR_AF_INET6 == laddr.raw.family) > { >- addr->raw.family = AF_INET; >+ 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->inet.family = laddr.inet.family; >+ addr->inet.ip = laddr.inet.ip; >+ } > else > { >- PR_ASSERT(0 == rv); > PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); > status = PR_FAILURE; > } > } >-#else /* _PR_HAVE_INET_NTOP */ >- 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)); >- >- addr->inet.family = AF_INET; >-#ifdef XP_OS2_VACPP >- addr->inet.ip = inet_addr((char *)string); >-#else >- 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; > } >-#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) > if (NULL == inet_ntop(AF_INET6, &addr->ipv6.ip, string, size)) > #else > if (NULL == V6AddrToString(&addr->ipv6.ip, string, size)) > #endif > { >@@ -1853,17 +1862,17 @@ > { > 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; >- >+#endif > failed: > PR_SetError(PR_INVALID_ARGUMENT_ERROR, 0); > return PR_FAILURE; > > } /* PR_NetAddrToString */ > > /* > * Convert an IPv4 addr to an (IPv4-mapped) IPv6 addr >@@ -1942,16 +1951,17 @@ > > #if defined(_PR_HAVE_GETADDRINFO) > > #if defined(_PR_INET6) > > typedef struct addrinfo PRADDRINFO; > #define GETADDRINFO getaddrinfo > #define FREEADDRINFO freeaddrinfo >+#define GETNAMEINFO getnameinfo > > #elif defined(_PR_INET6_PROBE) > > typedef struct addrinfo PRADDRINFO; > > /* getaddrinfo/freeaddrinfo prototypes */ > #if defined(WIN32) > #define FUNC_MODIFIER __stdcall >@@ -1960,27 +1970,34 @@ > #endif > typedef int (FUNC_MODIFIER * FN_GETADDRINFO) > (const char *nodename, > const char *servname, > const PRADDRINFO *hints, > PRADDRINFO **res); > typedef int (FUNC_MODIFIER * FN_FREEADDRINFO) > (PRADDRINFO *ai); >+typedef int (FUNC_MODIFIER * FN_GETNAMEINFO) >+ (const struct sockaddr *addr, int addrlen, >+ char *host, int hostlen, >+ char *serv, int servlen, int flags); > > /* global state */ > static FN_GETADDRINFO _pr_getaddrinfo = NULL; > static FN_FREEADDRINFO _pr_freeaddrinfo = NULL; >+static FN_GETNAMEINFO _pr_getnameinfo = NULL; > > #if defined(VMS) > #define GETADDRINFO_SYMBOL getenv("GETADDRINFO") > #define FREEADDRINFO_SYMBOL getenv("FREEADDRINFO") >+#define GETNAMEINFO_SYMBOL getenv("GETNAMEINFO") > #else > #define GETADDRINFO_SYMBOL "getaddrinfo" > #define FREEADDRINFO_SYMBOL "freeaddrinfo" >+#define GETNAMEINFO_SYMBOL "getnameinfo" > #endif > > PRStatus > _pr_find_getaddrinfo(void) > { > PRLibrary *lib; > #ifdef WIN32 > /* >@@ -1998,16 +2015,22 @@ > continue; > } > _pr_getaddrinfo = (FN_GETADDRINFO) > PR_FindFunctionSymbol(lib, GETADDRINFO_SYMBOL); > if (!_pr_getaddrinfo) { > PR_UnloadLibrary(lib); > continue; > } >+ _pr_getnameinfo = (FN_GETNAMEINFO) >+ PR_FindFunctionSymbol(lib, GETNAMEINFO_SYMBOL); >+ if (!_pr_getnameinfo) { >+ PR_UnloadLibrary(lib); >+ continue; >+ } > _pr_freeaddrinfo = (FN_FREEADDRINFO) > PR_FindFunctionSymbol(lib, FREEADDRINFO_SYMBOL); > PR_ASSERT(_pr_freeaddrinfo); > /* Keep the library loaded. */ > return PR_SUCCESS; > } > return PR_FAILURE; > #else >@@ -2015,28 +2038,34 @@ > * Resolve getaddrinfo by searching all loaded libraries. Then > * search library containing getaddrinfo for freeaddrinfo. > */ > _pr_getaddrinfo = (FN_GETADDRINFO) > PR_FindFunctionSymbolAndLibrary(GETADDRINFO_SYMBOL, &lib); > if (!_pr_getaddrinfo) { > return PR_FAILURE; > } >+ _pr_getnameinfo = (FN_GETNAMEINFO) >+ PR_FindFunctionSymbolAndLibrary(GETNAMEINFO_SYMBOL, &lib); >+ if (!_pr_getnameinfo) { >+ return PR_FAILURE; >+ } > _pr_freeaddrinfo = (FN_FREEADDRINFO) > PR_FindFunctionSymbol(lib, FREEADDRINFO_SYMBOL); > PR_UnloadLibrary(lib); > if (!_pr_freeaddrinfo) { > return PR_FAILURE; > } > return PR_SUCCESS; > #endif > } > > #define GETADDRINFO (*_pr_getaddrinfo) > #define FREEADDRINFO (*_pr_freeaddrinfo) >+#define GETNAMEINFO (*_pr_getnameinfo) > > #endif /* _PR_INET6 */ > > #endif /* _PR_HAVE_GETADDRINFO */ > > /* > * If getaddrinfo does not exist, then we will fall back on > * PR_GetHostByName, which requires that we allocate a buffer for the >@@ -2043,23 +2072,70 @@ > * PRHostEnt data structure and its members. > */ > typedef struct PRAddrInfoFB { > char buf[PR_NETDB_BUF_SIZE]; > PRHostEnt hostent; > PRBool has_cname; > } PRAddrInfoFB; > >+static PRBool >+pr_IsValidNumericHost(const char *string) >+{ >+ PRNetAddr addr; >+ PRIntn rv; >+#if defined(_PR_HAVE_INET_NTOP) >+ rv = inet_pton(AF_INET6, string, &addr.ipv6.ip); >+ if (0 < rv) { >+ return PR_TRUE; >+ } >+ 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; >+ } >+ return PR_FALSE; >+#else /* _PR_HAVE_INET_NTOP */ >+ rv = StringToV6Addr(string, &addr.ipv6.ip); >+ if (0 < rv) { >+ return PR_TRUE; >+ } >+ PR_ASSERT(0 == rv); >+ /* clean up after the failed StringToV6Addr() call */ >+ memset(&addr.ipv6.ip, 0, sizeof(addr.ipv6.ip)); >+#ifdef XP_OS2_VACPP >+ addr.inet.ip = inet_addr((char *)string); >+#else >+ addr.inet.ip = inet_addr(string); >+#endif >+ if ((PRUint32) -1 == addr.inet.ip) { >+ /* >+ * The string argument is a malformed address string. >+ */ >+ return PR_FALSE; >+ } >+ return PR_TRUE; >+#endif >+} >+ > static PRAddrInfo * > pr_GetAddrInfoByNameFB(const char *hostname, > PRUint16 af, > PRIntn flags) > { > PRStatus rv; > PRAddrInfoFB *ai; >+ >+ if (flags & PR_AI_NUMERICHOST) { >+ if (!pr_IsValidNumericHost(hostname)) { >+ PR_SetError(PR_BAD_ADDRESS_ERROR, 0); >+ return NULL; >+ } >+ } > /* fallback on PR_GetHostByName */ > ai = PR_NEW(PRAddrInfoFB); > if (!ai) { > PR_SetError(PR_OUT_OF_MEMORY_ERROR, 0); > return NULL; > } > rv = PR_GetHostByName(hostname, ai->buf, sizeof ai->buf, &ai->hostent); > if (rv == PR_FAILURE) { >@@ -2072,17 +2148,17 @@ > } > > PR_IMPLEMENT(PRAddrInfo *) PR_GetAddrInfoByName(const char *hostname, > PRUint16 af, > PRIntn flags) > { > /* 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; > } > > if (!_pr_initialized) _PR_ImplicitInitialization(); > > #if !defined(_PR_HAVE_GETADDRINFO) > return pr_GetAddrInfoByNameFB(hostname, af, flags); >@@ -2099,16 +2175,17 @@ > /* > * we assume a RFC 2553 compliant getaddrinfo. this may at some > * point need to be customized as platforms begin to adopt the > * RFC 3493. > */ > > 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; > > /* > * it is important to select a socket type in the hints, otherwise we > * will get back repetitive entries: one for each socket type. since > * we do not expose ai_socktype through our API, it is okay to do this > * here. the application may still choose to create a socket of some > * other type. >@@ -2133,16 +2210,32 @@ > PR_Free((PRAddrInfoFB *) ai); > else > #endif > FREEADDRINFO((PRADDRINFO *) ai); > #else > PR_Free((PRAddrInfoFB *) ai); > #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) >+{ >+#if defined(_PR_HAVE_GETADDRINFO) >+ return GETNAMEINFO((const struct sockaddr *)addr, addrlen, host, hostlen, serv, servlen, flags); >+#else >+ return EAI_SYSTEM; /* not implemented */ >+#endif >+} > > PR_IMPLEMENT(void *) PR_EnumerateAddrInfo(void *iterPtr, > const PRAddrInfo *base, > PRUint16 port, > PRNetAddr *result) > { > #if defined(_PR_HAVE_GETADDRINFO) > PRADDRINFO *ai; >--- mozilla/nsprpub/configure~ Mon Nov 13 18:37:41 2006 >+++ mozilla/nsprpub/configure Thu Dec 21 14:05:08 2006 >@@ -3576,20 +3576,20 @@ > > if echo "$OS_RELEASE" | egrep '^(B.10.30|B.11)' >/dev/null; then > cat >> confdefs.h <<\EOF > #define HAVE_POINTER_LOCALTIME_R 1 > EOF > > fi > >- # HP-UX 11i (B.11.11) or higher >+ # HP-UX 11i v2 (B.11.23) or higher > > case "$OS_RELEASE" in >- [C-Z]*|B.[2-9]*|B.1[2-9]*|B.11.[2-9]*|B.11.1[1-9]*) >+ [C-Z]*|B.[2-9]*|B.1[2-9]*|B.11.[3-9]*|B.11.2[3-9]*) > USE_IPV6=1 > ;; > esac > > > if test "$OS_RELEASE" = "B.10.01"; then > cat >> confdefs.h <<\EOF > #define HPUX10 1 >--- mozilla/nsprpub/configure.in~ Mon Nov 13 18:37:41 2006 >+++ mozilla/nsprpub/configure.in Thu Dec 21 14:05:08 2006 >@@ -1195,20 +1195,20 @@ > if echo "$OS_RELEASE" | egrep '^(B.10.10|B.10.20)' >/dev/null; then > AC_DEFINE(HAVE_INT_LOCALTIME_R) > fi > > if echo "$OS_RELEASE" | egrep '^(B.10.30|B.11)' >/dev/null; then > AC_DEFINE(HAVE_POINTER_LOCALTIME_R) > fi > >- # HP-UX 11i (B.11.11) or higher >+ # HP-UX 11i v2 (B.11.23) or higher > changequote(<<,>>) > case "$OS_RELEASE" in >- [C-Z]*|B.[2-9]*|B.1[2-9]*|B.11.[2-9]*|B.11.1[1-9]*) >+ [C-Z]*|B.[2-9]*|B.1[2-9]*|B.11.[3-9]*|B.11.2[3-9]*) > USE_IPV6=1 > ;; > esac > changequote([,]) > > if test "$OS_RELEASE" = "B.10.01"; then > AC_DEFINE(HPUX10) > DEFAULT_IMPL_STRATEGY=_EMU
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 222554
:
145537
|
145625
|
145626