[win32] maintpatch
Trevor Blackwell [Tue, 28 Oct 1997 13:04:43 +0000 (08:04 -0500)]
    #60:  "Socket occasional SEGV"
 Msg-ID:  <199710281804.NAA09632@wagg.viaweb.com>
  Files:  ext/Socket/Socket.xs

p4raw-id: //depot/win32/perl@636

ext/Socket/Socket.xs

index d37208f..d2f3d9e 100644 (file)
@@ -742,9 +742,10 @@ pack_sockaddr_un(pathname)
        {
 #ifdef I_SYS_UN
        struct sockaddr_un sun_ad; /* fear using sun */
+       STRLEN len;
        Zero( &sun_ad, sizeof sun_ad, char );
        sun_ad.sun_family = AF_UNIX;
-       Copy( pathname, sun_ad.sun_path, sizeof sun_ad.sun_path, char );
+       strncpy(sun_ad.sun_path, pathname, sizeof sun_ad.sun_path);
        ST(0) = sv_2mortal(newSVpv((char *)&sun_ad, sizeof sun_ad));
 #else
        ST(0) = (SV *) not_here("pack_sockaddr_un");
@@ -758,9 +759,10 @@ unpack_sockaddr_un(sun_sv)
        CODE:
        {
 #ifdef I_SYS_UN
-       STRLEN sockaddrlen;
        struct sockaddr_un addr;
-       char *  sun_ad = SvPV(sun_sv,sockaddrlen);
+       STRLEN sockaddrlen;
+       char * sun_ad = SvPV(sun_sv,sockaddrlen);
+       char * e;
 
        if (sockaddrlen != sizeof(addr)) {
            croak("Bad arg length for %s, length is %d, should be %d",
@@ -775,8 +777,11 @@ unpack_sockaddr_un(sun_sv)
                        "Socket::unpack_sockaddr_un",
                        addr.sun_family,
                        AF_UNIX);
-       } 
-       ST(0) = sv_2mortal(newSVpv(addr.sun_path, strlen(addr.sun_path)));
+       }
+       e = addr.sun_path;
+       while (*e && e < addr.sun_path + sizeof addr.sun_path)
+           ++e;
+       ST(0) = sv_2mortal(newSVpvn(addr.sun_path, e - addr.sun_path));
 #else
        ST(0) = (SV *) not_here("unpack_sockaddr_un");
 #endif