summaryrefslogtreecommitdiff
path: root/pr/src/io/prsocket.c
diff options
context:
space:
mode:
Diffstat (limited to 'pr/src/io/prsocket.c')
-rw-r--r--pr/src/io/prsocket.c24
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;
}