Re: [ID 20010215.006] Bad arg length for Socket::unpack_sockaddr_un, length is 14 ...
Radu Greab [Fri, 23 Mar 2001 21:14:59 +0000 (23:14 +0200)]
Message-ID: <15035.41139.646781.478457@ix.netsoft.ro>

p4raw-id: //depot/perl@9352

pp_sys.c

index dc070f8..922fb28 100644 (file)
--- a/pp_sys.c
+++ b/pp_sys.c
@@ -98,6 +98,12 @@ 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
@@ -1571,6 +1577,13 @@ 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;
@@ -2443,6 +2456,12 @@ 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;
 
@@ -2620,6 +2639,11 @@ 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);