From: Radu Greab Date: Fri, 30 Mar 2001 15:09:06 +0000 (+0300) 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=36902e12d2b30e9370acddd3ddab927d842061cf;p=p5sagit%2Fp5-mst-13.2.git Re: [ID 20010215.006] Bad arg length for Socket::unpack_sockaddr_un, length is 14 ... Message-ID: <15044.30562.566390.559726@ix.netsoft.ro> Replace #9352. p4raw-id: //depot/perl@9470 --- diff --git a/ext/Socket/Socket.xs b/ext/Socket/Socket.xs index 0584e78..e089829 100644 --- a/ext/Socket/Socket.xs +++ b/ext/Socket/Socket.xs @@ -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 ); diff --git a/pp_sys.c b/pp_sys.c index ee02ccd..3285574 100644 --- 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 -# 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);