summaryrefslogtreecommitdiff
path: root/cpan/Socket
diff options
context:
space:
mode:
authorSteve Hay <steve.m.hay@googlemail.com>2013-07-29 17:56:12 +0100
committerSteve Hay <steve.m.hay@googlemail.com>2013-07-30 09:09:22 +0100
commit669d990be35a6a02b9d7ab8487aaba1d37bad180 (patch)
tree061c0b66ef8245189204c1b29cc6eb5ed7ec9814 /cpan/Socket
parent5016d3c45a66ce5b279c253e8a8c2a38a9bd8431 (diff)
downloadperl-669d990be35a6a02b9d7ab8487aaba1d37bad180.tar.gz
Update Socket from 2.010 to 2.011
Diffstat (limited to 'cpan/Socket')
-rw-r--r--cpan/Socket/Socket.pm2
-rw-r--r--cpan/Socket/Socket.xs26
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));