From: Radu Greab Date: Fri, 23 Mar 2001 21:14:59 +0000 (+0200) Subject: Re: [ID 20010215.006] Bad arg length for Socket::unpack_sockaddr_un, length is 14 ... X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=d3b9c6891b7459d54058317f1c1f213e6a01409e;p=p5sagit%2Fp5-mst-13.2.git Re: [ID 20010215.006] Bad arg length for Socket::unpack_sockaddr_un, length is 14 ... Message-ID: <15035.41139.646781.478457@ix.netsoft.ro> p4raw-id: //depot/perl@9352 --- diff --git a/pp_sys.c b/pp_sys.c index dc070f8..922fb28 100644 --- 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 +# 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);