Update Socket from 2.010 to 2.011
authorSteve Hay <steve.m.hay@googlemail.com>
Mon, 29 Jul 2013 16:56:12 +0000 (17:56 +0100)
committerSteve Hay <steve.m.hay@googlemail.com>
Tue, 30 Jul 2013 08:09:22 +0000 (09:09 +0100)
Porting/Maintainers.pl
cpan/Socket/Socket.pm
cpan/Socket/Socket.xs
pod/perldelta.pod

index 96937fb..5c4504b 100755 (executable)
@@ -1574,7 +1574,7 @@ use File::Glob qw(:case);
 
     'Socket' => {
         'MAINTAINER'   => 'pevans',
-        'DISTRIBUTION' => 'PEVANS/Socket-2.010.tar.gz',
+        'DISTRIBUTION' => 'PEVANS/Socket-2.011.tar.gz',
         'FILES'        => q[cpan/Socket],
         'UPSTREAM'     => 'cpan',
     },
index 0556ae0..68a7722 100644 (file)
@@ -3,7 +3,7 @@ package Socket;
 use strict;
 { use 5.006001; }
 
-our $VERSION = '2.010';
+our $VERSION = '2.011';
 
 =head1 NAME
 
index 3cc90f6..10d6620 100644 (file)
@@ -717,8 +717,8 @@ unpack_sockaddr_un(sun_sv)
        STRLEN sockaddrlen;
        char * sun_ad = SvPVbyte(sun_sv,sockaddrlen);
        int addr_len;
-#   ifdef __linux__
-       /* On Linux sockaddrlen on sockets returned by accept, recvfrom,
+#   if defined(__linux__) || defined(HAS_SOCKADDR_SA_LEN)
+       /* On Linux or *BSD sockaddrlen on sockets returned by accept, recvfrom,
           getpeername and getsockname is not equal to sizeof(addr). */
        if (sockaddrlen < sizeof(addr)) {
          Copy(sun_ad, &addr, sockaddrlen, char);
@@ -726,6 +726,12 @@ unpack_sockaddr_un(sun_sv)
        } else {
          Copy(sun_ad, &addr, sizeof(addr), char);
        }
+#     ifdef HAS_SOCKADDR_SA_LEN
+       /* In this case, sun_len must be checked */
+       if (sockaddrlen != addr.sun_len)
+               croak("Invalid arg sun_len field for %s, length is %"UVuf", but sun_len is %"UVuf,
+                     "Socket::unpack_sockaddr_un", (UV)sockaddrlen, (UV)addr.sun_len);
+#     endif
 #   else
        if (sockaddrlen != sizeof(addr))
                croak("Bad arg length for %s, length is %"UVuf", should be %"UVuf,
@@ -736,14 +742,24 @@ unpack_sockaddr_un(sun_sv)
        if (addr.sun_family != AF_UNIX)
                croak("Bad address family for %s, got %d, should be %d",
                      "Socket::unpack_sockaddr_un", addr.sun_family, AF_UNIX);
-
+#   ifdef __linux__
        if (addr.sun_path[0] == '\0') {
                /* Linux-style abstract socket address begins with a nul
                 * and can contain nuls. */
                addr_len = (char *)&addr - (char *)&(addr.sun_path) + sockaddrlen;
-       } else {
+       } else
+#   endif
+       {
+#   if defined(HAS_SOCKADDR_SA_LEN)
+               /* On *BSD sun_path not always ends with a '\0' */
+               int maxlen = addr.sun_len - 2; /* should use offsetof(struct sockaddr_un, sun_path) instead of 2 */
+               if (maxlen > (int)sizeof(addr.sun_path))
+                 maxlen = (int)sizeof(addr.sun_path);
+#   else
+               const int maxlen = (int)sizeof(addr.sun_path);
+#   endif
                for (addr_len = 0; addr.sun_path[addr_len]
-                    && addr_len < (int)sizeof(addr.sun_path); addr_len++);
+                    && addr_len < maxlen; addr_len++);
        }
 
        ST(0) = sv_2mortal(newSVpvn(addr.sun_path, addr_len));
index cebec9f..534b923 100644 (file)
@@ -144,6 +144,13 @@ under C<Useqq> has been improved. [perl #118933]
 
 =item *
 
+L<Socket> has been upgraded from version 2.010 to 2.011.
+
+Handle FreeBSD (or other platforms) returning shorter AF_UNIX sockaddr
+structures due to embedded sun_len. [cpan #86613]
+
+=item *
+
 L<Storable> has been upgraded from version 2.45 to 2.46.
 
 Avoid creating temporary objects for STORABLE_attach when they aren't