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