Re: [ID 20010215.006] Bad arg length for Socket::unpack_sockaddr_un, length is 14 ...
Radu Greab [Fri, 30 Mar 2001 15:09:06 +0000 (18:09 +0300)]
Message-ID: <15044.30562.566390.559726@ix.netsoft.ro>

Replace #9352.

p4raw-id: //depot/perl@9470

ext/Socket/Socket.xs
pp_sys.c

index 0584e78..e089829 100644 (file)
@@ -1006,12 +1006,15 @@ unpack_sockaddr_un(sun_sv)
        STRLEN sockaddrlen;
        char * sun_ad = SvPV(sun_sv,sockaddrlen);
        char * e;
-
+#   ifndef __linux__
+       /* On Linux sockaddrlen on sockets returned by accept, recvfrom,
+          getpeername and getsockname is not equal to sizeof(addr). */
        if (sockaddrlen != sizeof(addr)) {
            croak("Bad arg length for %s, length is %d, should be %d",
                        "Socket::unpack_sockaddr_un",
                        sockaddrlen, sizeof(addr));
        }
+#   endif
 
        Copy( sun_ad, &addr, sizeof addr, char );
 
index ee02ccd..3285574 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -98,12 +98,6 @@ extern int h_errno;
 #  endif
 #endif
 
-#ifdef I_SYS_UN
-#  ifdef  __linux__
-#    include <sys/un.h>
-#  endif
-#endif
-
 /* Put this after #includes because fork and vfork prototypes may conflict. */
 #ifndef HAS_VFORK
 #   define vfork fork
@@ -1577,13 +1571,6 @@ PP(pp_sysread)
        if (!(IoFLAGS(io) & IOf_UNTAINT))
            SvTAINTED_on(bufsv);
        SP = ORIGMARK;
-#if defined(I_SYS_UN) && defined(__linux__)
-       /* Linux returns the sum of actual pathname string length and the
-          size of the other members of sockaddr_un members. It should
-          return sizeof(struct sockaddr_un). */
-       if (((struct sockaddr *)namebuf)->sa_family == AF_UNIX)
-           bufsize = sizeof(struct sockaddr_un);
-#endif
        sv_setpvn(TARG, namebuf, bufsize);
        PUSHs(TARG);
        RETURN;
@@ -2464,12 +2451,6 @@ PP(pp_accept)
     setbuf( IoIFP(nstio), NULL); /* EPOC gets confused about sockets */
 #endif
 
-#if defined(I_SYS_UN) && defined(__linux__)
-    /* see the comment in pp_sysread */
-    if (saddr.sa_family == AF_UNIX)
-       len = sizeof(struct sockaddr_un);
-#endif
-
     PUSHp((char *)&saddr, len);
     RETURN;
 
@@ -2647,11 +2628,6 @@ PP(pp_getpeername)
     if (len == BOGUS_GETNAME_RETURN)
        len = sizeof(struct sockaddr);
 #endif
-#if defined(I_SYS_UN) && defined(__linux__)
-    /* see the comment in pp_sysread */
-    if (((struct sockaddr *)SvPVX(sv))->sa_family == AF_UNIX)
-       len = sizeof(struct sockaddr_un);
-#endif
     SvCUR_set(sv, len);
     *SvEND(sv) ='\0';
     PUSHs(sv);