summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2011-10-06 20:48:23 +0000
committerjkim <jkim@FreeBSD.org>2011-10-06 20:48:23 +0000
commitbd4e9fe2ca235f77b480cd2357ca375a084f9a8b (patch)
tree8c35d747bd38533ca7c438af28074eb7061d9e79 /sys/compat
parent55a4bbebe3049907c91a6dbf26531e15e11da72a (diff)
downloadFreeBSD-src-bd4e9fe2ca235f77b480cd2357ca375a084f9a8b.zip
FreeBSD-src-bd4e9fe2ca235f77b480cd2357ca375a084f9a8b.tar.gz
Restore the original socket address length if it was not really AF_INET6.
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/linux/linux_socket.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/sys/compat/linux/linux_socket.c b/sys/compat/linux/linux_socket.c
index 546b77c..66becb3 100644
--- a/sys/compat/linux/linux_socket.c
+++ b/sys/compat/linux/linux_socket.c
@@ -128,22 +128,25 @@ linux_getsockaddr(struct sockaddr **sap, const struct osockaddr *osa, int osalen
*
* Still accept addresses for which the scope id is not used.
*/
- if (oldv6size && bdom == AF_INET6) {
- sin6 = (struct sockaddr_in6 *)kosa;
- if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr) ||
- (!IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) &&
- !IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr) &&
- !IN6_IS_ADDR_V4COMPAT(&sin6->sin6_addr) &&
- !IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) &&
- !IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))) {
- sin6->sin6_scope_id = 0;
- } else {
- log(LOG_DEBUG,
- "obsolete pre-RFC2553 sockaddr_in6 rejected\n");
- error = EINVAL;
- goto out;
- }
- } else
+ if (oldv6size) {
+ if (bdom == AF_INET6) {
+ sin6 = (struct sockaddr_in6 *)kosa;
+ if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr) ||
+ (!IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) &&
+ !IN6_IS_ADDR_SITELOCAL(&sin6->sin6_addr) &&
+ !IN6_IS_ADDR_V4COMPAT(&sin6->sin6_addr) &&
+ !IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr) &&
+ !IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))) {
+ sin6->sin6_scope_id = 0;
+ } else {
+ log(LOG_DEBUG,
+ "obsolete pre-RFC2553 sockaddr_in6 rejected\n");
+ error = EINVAL;
+ goto out;
+ }
+ } else
+ alloclen -= sizeof(u_int32_t);
+ }
#endif
if (bdom == AF_INET) {
alloclen = sizeof(struct sockaddr_in);
OpenPOWER on IntegriCloud