diff options
author | Eric Andersen <andersen@codepoet.org> | 2002-07-10 04:32:03 +0000 |
---|---|---|
committer | Eric Andersen <andersen@codepoet.org> | 2002-07-10 04:32:03 +0000 |
commit | 64bfb23ea641191b6266b637269d41b99b9597ca (patch) | |
tree | 82aba663ead95672eaa4fe7aba5d076f1eca7f10 /libc/inet/ntop.c | |
parent | fbede14cba2d835fe9e474db3cf5912187ee4c58 (diff) |
Per bug report from Ronald Wahl <rwa@peppercon.com>:
...inet_pton breaks since tolower is implemented as
a macro and its argument is evaluated more than once:
while ((ch = tolower (*src++)) != '\0') {
So I fixed it by just undefining tolower() so we use the
function version, not the macro.
-Erik
Diffstat (limited to 'libc/inet/ntop.c')
-rw-r--r-- | libc/inet/ntop.c | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/libc/inet/ntop.c b/libc/inet/ntop.c index b7e831d49..bcdc57df8 100644 --- a/libc/inet/ntop.c +++ b/libc/inet/ntop.c @@ -28,12 +28,7 @@ #include <errno.h> #include <stdio.h> #include <string.h> - -#ifdef __UCLIBC_HAS_IPV6__ -#define INET_IPV6 -#define SPRINTF(a) sprintf a #include <ctype.h> -#endif /* @@ -95,13 +90,10 @@ inet_ntop4(const u_char *src, char *dst, size_t size) * Paul Vixie, 1996. */ -#ifdef INET_IPV6 +#ifdef __UCLIBC_HAS_IPV6__ static const char * -inet_ntop6(src, dst, size) - const u_char *src; - char *dst; - size_t size; +inet_ntop6(const u_char *src, char *dst, size_t size) { /* * Note that int32_t and int16_t need only be "at least" large enough @@ -169,7 +161,7 @@ inet_ntop6(src, dst, size) tp += strlen(tp); break; } - tp += SPRINTF((tp, "%x", words[i])); + tp += sprintf(tp, "%x", words[i]); } /* Was it a trailing run of 0x00's? */ if (best.base != -1 && (best.base + best.len) == 8) @@ -185,7 +177,7 @@ inet_ntop6(src, dst, size) } return strcpy(dst, tmp); } -#endif /* INET_IPV6 */ +#endif /* __UCLIBC_HAS_IPV6__ */ /* int @@ -248,12 +240,17 @@ inet_pton4(const char *src, u_char *dst) * Paul Vixie, 1996. */ -#ifdef INET_IPV6 +#ifdef __UCLIBC_HAS_IPV6__ + +/* We cannot use the macro version of tolower() or very bad + * things happen when '*src++' gets evaluated multiple times. + * So * undef it here so we get the function version of tolower + * instead. + */ +#undef tolower static int -inet_pton6(src, dst) - const char *src; - u_char *dst; +inet_pton6(const char *src, u_char *dst) { static const char xdigits[] = "0123456789abcdef"; u_char tmp[16], *tp, *endp, *colonp; @@ -338,7 +335,7 @@ inet_pton6(src, dst) return (1); } -#endif /* INET_IPV6 */ +#endif /* __UCLIBC_HAS_IPV6__ */ @@ -360,7 +357,7 @@ inet_ntop(af, src, dst, size) switch (af) { case AF_INET: return (inet_ntop4(src, dst, size)); -#ifdef INET_IPV6 +#ifdef __UCLIBC_HAS_IPV6__ case AF_INET6: return (inet_ntop6(src, dst, size)); #endif @@ -392,7 +389,7 @@ inet_pton(af, src, dst) switch (af) { case AF_INET: return (inet_pton4(src, dst)); -#ifdef INET_IPV6 +#ifdef __UCLIBC_HAS_IPV6__ case AF_INET6: return (inet_pton6(src, dst)); #endif |