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
