diff options
Diffstat (limited to 'pr/src/io/prsocket.c')
-rw-r--r-- | pr/src/io/prsocket.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/pr/src/io/prsocket.c b/pr/src/io/prsocket.c index 4ee568fd..8b17c327 100644 --- a/pr/src/io/prsocket.c +++ b/pr/src/io/prsocket.c @@ -49,6 +49,19 @@ static PRBool IsValidNetAddrLen(const PRNetAddr *addr, PRInt32 addr_len) && (addr->raw.family != AF_UNIX) #endif && (PR_NETADDR_SIZE(addr) != addr_len)) { +#if defined(LINUX) + /* + * In glibc 2.1, struct sockaddr_in6 is 24 bytes. In glibc 2.2 + * and in the 2.4 kernel, struct sockaddr_in6 has the scope_id + * field and is 28 bytes. It is possible for socket functions + * to return an addr_len greater than sizeof(struct sockaddr_in6). + * We need to allow that. (Bugzilla bug #77264) + */ + if ((PR_AF_INET6 == addr->raw.family) + && (sizeof(addr->ipv6) == addr_len)) { + return PR_TRUE; + } +#endif /* * The accept(), getsockname(), etc. calls on some platforms * do not set the actual socket address length on return. @@ -56,14 +69,11 @@ static PRBool IsValidNetAddrLen(const PRNetAddr *addr, PRInt32 addr_len) * passed in (i.e., sizeof(PRNetAddr)). */ #if defined(QNX) - if (sizeof(PRNetAddr) != addr_len) { - return PR_FALSE; - } else { + if (sizeof(PRNetAddr) == addr_len) { return PR_TRUE; } -#else - return PR_FALSE; #endif + return PR_FALSE; } return PR_TRUE; } @@ -1304,7 +1314,7 @@ PR_IMPLEMENT(PRStatus) PR_NewTCPSocketPair(PRFileDesc *f[]) } selfAddr.sin_family = AF_INET; selfAddr.sin_port = 0; - selfAddr.sin_addr.s_addr = htonl(INADDR_ANY); + selfAddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); /* BugZilla: 35408 */ addrLen = sizeof(selfAddr); if (bind(listenSock, (struct sockaddr *) &selfAddr, addrLen) == SOCKET_ERROR) { @@ -1382,7 +1392,7 @@ failed: if (listenSock == NULL) { goto failed; } - PR_InitializeNetAddr(PR_IpAddrAny, 0, &selfAddr); + PR_InitializeNetAddr(PR_IpAddrLoopback, 0, &selfAddr); /* BugZilla: 35408 */ if (PR_Bind(listenSock, &selfAddr) == PR_FAILURE) { goto failed; } |