Change 11889 by jhi@alpha on 2001/09/05 22:23:06

        inet_ntoa() tweaks:
        - don't allow addresses with > 255 characters
        - indent the HP-UX workaround
        - don't leak memory

Affected files ...

... //depot/perl/ext/Socket/Socket.xs#39 edit

Differences ...

==== //depot/perl/ext/Socket/Socket.xs#39 (text) ====
Index: perl/ext/Socket/Socket.xs
--- perl/ext/Socket/Socket.xs.~1~       Wed Sep  5 16:30:06 2001
+++ perl/ext/Socket/Socket.xs   Wed Sep  5 16:30:06 2001
@@ -213,22 +213,30 @@
        STRLEN addrlen;
        struct in_addr addr;
        char * addr_str;
-       char * ip_address = SvPV(ip_address_sv,addrlen);
+       char * ip_address;
+       if (DO_UTF8(ip_address_sv) && !sv_utf8_downgrade(ip_address_sv, 1))
+            croak("Wide character in Socket::ntoa");
+       ip_address = SvPV(ip_address_sv,addrlen);
        if (addrlen != sizeof(addr)) {
            croak("Bad arg length for %s, length is %d, should be %d",
                        "Socket::inet_ntoa",
                        addrlen, sizeof(addr));
        }
-
        Copy( ip_address, &addr, sizeof addr, char );
 #if defined(__hpux) && defined(__GNUC__) && defined(USE_64_BIT_INT)
-        /* GCC on HP_UX breaks the call to inet_ntoa, // sky*/
-       addr_str = (char *) malloc(16);
-       sprintf(addr_str, "%d.%d.%d.%d", ((addr.s_addr >> 24) & 0xFF) , ((addr.s_addr 
>> 16) & 0xFF), ((addr.s_addr >> 8) & 0xFF), (addr.s_addr  & 0xFF));
+        /* GCC on HP_UX breaks the call to inet_ntoa --sky */
+       New(1138, addr_str, 4 * 3 + 3 + 1, char);
+       sprintf(addr_str, "%d.%d.%d.%d",
+               ((addr.s_addr >> 24) & 0xFF),
+               ((addr.s_addr >> 16) & 0xFF),
+               ((addr.s_addr >>  8) & 0xFF),
+               ( addr.s_addr        & 0xFF));
+       ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
+       Safefree(addr_str);
 #else
        addr_str = inet_ntoa(addr);
+       ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
 #endif
-       ST(0) = sv_2mortal(newSVpvn(addr_str, strlen(addr_str)));
        }
 
 void
End of Patch.

Reply via email to