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.