diff options
author | Steve Hay <steve.m.hay@googlemail.com> | 2013-07-29 17:56:12 +0100 |
---|---|---|
committer | Steve Hay <steve.m.hay@googlemail.com> | 2013-07-30 09:09:22 +0100 |
commit | 669d990be35a6a02b9d7ab8487aaba1d37bad180 (patch) | |
tree | 061c0b66ef8245189204c1b29cc6eb5ed7ec9814 /cpan/Socket | |
parent | 5016d3c45a66ce5b279c253e8a8c2a38a9bd8431 (diff) | |
download | perl-669d990be35a6a02b9d7ab8487aaba1d37bad180.tar.gz |
Update Socket from 2.010 to 2.011
Diffstat (limited to 'cpan/Socket')
-rw-r--r-- | cpan/Socket/Socket.pm | 2 | ||||
-rw-r--r-- | cpan/Socket/Socket.xs | 26 |
2 files changed, 22 insertions, 6 deletions
diff --git a/cpan/Socket/Socket.pm b/cpan/Socket/Socket.pm index 0556ae07ac..68a7722c48 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 3cc90f64e6..10d662042c 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)); |