In perl.git, the branch blead has been updated

<http://perl5.git.perl.org/perl.git/commitdiff/669d990be35a6a02b9d7ab8487aaba1d37bad180?hp=5016d3c45a66ce5b279c253e8a8c2a38a9bd8431>

- Log -----------------------------------------------------------------
commit 669d990be35a6a02b9d7ab8487aaba1d37bad180
Author: Steve Hay <[email protected]>
Date:   Mon Jul 29 17:56:12 2013 +0100

    Update Socket from 2.010 to 2.011
-----------------------------------------------------------------------

Summary of changes:
 Porting/Maintainers.pl |  2 +-
 cpan/Socket/Socket.pm  |  2 +-
 cpan/Socket/Socket.xs  | 26 +++++++++++++++++++++-----
 pod/perldelta.pod      |  7 +++++++
 4 files changed, 30 insertions(+), 7 deletions(-)

diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 96937fb..5c4504b 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -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',
     },
diff --git a/cpan/Socket/Socket.pm b/cpan/Socket/Socket.pm
index 0556ae0..68a7722 100644
--- a/cpan/Socket/Socket.pm
+++ b/cpan/Socket/Socket.pm
@@ -3,7 +3,7 @@ package Socket;
 use strict;
 { use 5.006001; }
 
-our $VERSION = '2.010';
+our $VERSION = '2.011';
 
 =head1 NAME
 
diff --git a/cpan/Socket/Socket.xs b/cpan/Socket/Socket.xs
index 3cc90f6..10d6620 100644
--- a/cpan/Socket/Socket.xs
+++ b/cpan/Socket/Socket.xs
@@ -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));
diff --git a/pod/perldelta.pod b/pod/perldelta.pod
index cebec9f..534b923 100644
--- a/pod/perldelta.pod
+++ b/pod/perldelta.pod
@@ -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

--
Perl5 Master Repository

Reply via email to