diff --git a/Socket.xs b/Socket.xs index beac92e..db06f99 100644 --- a/Socket.xs +++ b/Socket.xs @@ -713,9 +713,15 @@ unpack_sockaddr_un(sun_sv) if (sockaddrlen != sizeof(addr)) croak("Bad arg length for %s, length is %"UVuf", should be %"UVuf, "Socket::unpack_sockaddr_un", (UV)sockaddrlen, (UV)sizeof(addr)); -# endif - Copy(sun_ad, &addr, sizeof(addr), char); +# else + if (sockaddrlen < sizeof(addr)) { + Copy(sun_ad, &addr, sockaddrlen, char); + Zero(&addr+sockaddrlen, sizeof(addr)-sockaddrlen, char); + } else { + Copy(sun_ad, &addr, sizeof(addr), char); + } +# endif if (addr.sun_family != AF_UNIX) croak("Bad address family for %s, got %d, should be %d", @@ -901,8 +907,13 @@ inet_ntop(af, ip_address_sv) #endif "Socket::inet_ntop", af); } - - Copy(ip_address, &addr, sizeof addr, char); + if (addrlen < sizeof(addr)) { + Copy(ip_address, &addr, addrlen, char); + Zero(&addr+addrlen, sizeof(addr)-addrlen, char); + } + else { + Copy(ip_address, &addr, sizeof addr, char); + } inet_ntop(af, &addr, str, sizeof str); ST(0) = sv_2mortal(newSVpvn(str, strlen(str)));