summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwtc%netscape.com <devnull@localhost>2001-05-23 04:17:33 +0000
committerwtc%netscape.com <devnull@localhost>2001-05-23 04:17:33 +0000
commit69b685ae450b913e2662af9aeca4ac0d128d3100 (patch)
tree85f13f1d4c93a2fdcac60fc537c01bc1ae6c023e
parent872e7ec21b553ef42877e651a80e03bc12e4d23a (diff)
downloadnspr-hg-69b685ae450b913e2662af9aeca4ac0d128d3100.tar.gz
Bugzilla bug #77264: the IsValidNetAddrLen() check should accept both of
the possible sizes of struct sockaddr_in6 on Linux. Modified files: prsocket.c, ptio.c.
-rw-r--r--pr/src/io/prsocket.c20
-rw-r--r--pr/src/pthreads/ptio.c13
2 files changed, 28 insertions, 5 deletions
diff --git a/pr/src/io/prsocket.c b/pr/src/io/prsocket.c
index df52b376..3194d657 100644
--- a/pr/src/io/prsocket.c
+++ b/pr/src/io/prsocket.c
@@ -65,6 +65,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.
@@ -72,14 +85,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;
}
diff --git a/pr/src/pthreads/ptio.c b/pr/src/pthreads/ptio.c
index 5dd54b09..2b55af23 100644
--- a/pr/src/pthreads/ptio.c
+++ b/pr/src/pthreads/ptio.c
@@ -236,6 +236,19 @@ static PRBool IsValidNetAddrLen(const PRNetAddr *addr, PRInt32 addr_len)
if ((addr != NULL)
&& (addr->raw.family != AF_UNIX)
&& (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
return PR_FALSE;
}
return PR_TRUE;