Author: jkim
Date: Thu Oct  6 20:48:23 2011
New Revision: 226072
URL: http://svn.freebsd.org/changeset/base/226072

Log:
  Restore the original socket address length if it was not really AF_INET6.

Modified:
  head/sys/compat/linux/linux_socket.c

Modified: head/sys/compat/linux/linux_socket.c
==============================================================================
--- head/sys/compat/linux/linux_socket.c        Thu Oct  6 20:28:08 2011        
(r226071)
+++ head/sys/compat/linux/linux_socket.c        Thu Oct  6 20:48:23 2011        
(r226072)
@@ -128,22 +128,25 @@ linux_getsockaddr(struct sockaddr **sap,
         *
         * 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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to