build: always use local `inet_pton()`/`inet_ntop()` implementations
No binary (build failed)
—
(log yok)
| @@ -166,8 +166,6 @@ endif() | |
| set(HAVE_GMTIME_R 1) | |
| set(HAVE_IFADDRS_H 1) | |
| set(HAVE_IF_NAMETOINDEX 1) | |
| - | set(HAVE_INET_NTOP 1) |
| - | set(HAVE_INET_PTON 1) |
| set(HAVE_IOCTLSOCKET 0) | |
| set(HAVE_IOCTLSOCKET_CAMEL 0) | |
| set(HAVE_IOCTLSOCKET_CAMEL_FIONBIO 0) | |
| @@ -104,8 +104,6 @@ set(HAVE_GETSOCKNAME 1) | |
| set(HAVE_GLIBC_STRERROR_R 0) | |
| set(HAVE_GMTIME_R 0) | |
| set(HAVE_IFADDRS_H 0) | |
| - | set(HAVE_INET_NTOP 0) |
| - | set(HAVE_INET_PTON 0) |
| set(HAVE_IOCTLSOCKET 1) | |
| set(HAVE_IOCTLSOCKET_CAMEL 0) | |
| set(HAVE_IOCTLSOCKET_CAMEL_FIONBIO 0) | |
| @@ -1685,8 +1685,6 @@ if(NOT WIN32) | |
| check_function_exists("realpath" HAVE_REALPATH) | |
| check_function_exists("sched_yield" HAVE_SCHED_YIELD) | |
| - | check_symbol_exists("inet_ntop" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_NTOP) # arpa/inet.h netinet/in.h sys/socket.h |
| - | check_symbol_exists("inet_pton" "${CURL_INCLUDES};stdlib.h;string.h" HAVE_INET_PTON) # arpa/inet.h netinet/in.h sys/socket.h |
| check_symbol_exists("strcasecmp" "string.h" HAVE_STRCASECMP) | |
| check_symbol_exists("stricmp" "string.h" HAVE_STRICMP) | |
| check_symbol_exists("strcmpi" "string.h" HAVE_STRCMPI) | |
| @@ -4193,8 +4193,6 @@ if test "$curl_cv_native_windows" != "yes"; then | |
| realpath \ | |
| sched_yield \ | |
| ]) | |
| - | CURL_CHECK_FUNC_INET_NTOP |
| - | CURL_CHECK_FUNC_INET_PTON |
| CURL_CHECK_FUNC_STRCASECMP | |
| CURL_CHECK_FUNC_STRCMPI | |
| CURL_CHECK_FUNC_STRICMP | |
| @@ -150,6 +150,7 @@ static struct ip *ip_list_append(struct ip *list, const char *data) | |
| ip->maskbits = 128; | |
| #endif | |
| + | /* !checksrc! disable BANNEDFUNC 1 */ |
| if(inet_pton(ip->family, ip->str, &ip->netaddr) != 1) { | |
| free(ip->str); | |
| free(ip); | |
| @@ -264,6 +265,7 @@ static curl_socket_t opensocket(void *clientp, curlsocktype purpose, | |
| if(ip && filter->type == CONNECTION_FILTER_BLACKLIST) { | |
| if(filter->verbose) { | |
| char buf[128] = { 0 }; | |
| + | /* !checksrc! disable BANNEDFUNC 1 */ |
| inet_ntop(address->family, cinaddr, buf, sizeof(buf)); | |
| fprintf(stderr, "* Rejecting IP %s due to blacklist entry %s.\n", | |
| buf, ip->str); | |
| @@ -273,6 +275,7 @@ static curl_socket_t opensocket(void *clientp, curlsocktype purpose, | |
| else if(!ip && filter->type == CONNECTION_FILTER_WHITELIST) { | |
| if(filter->verbose) { | |
| char buf[128] = { 0 }; | |
| + | /* !checksrc! disable BANNEDFUNC 1 */ |
| inet_ntop(address->family, cinaddr, buf, sizeof(buf)); | |
| fprintf(stderr, | |
| "* Rejecting IP %s due to missing whitelist entry.\n", buf); | |
| @@ -371,6 +371,8 @@ This is the full list of functions generally banned. | |
| getaddrinfo | |
| gets | |
| gmtime | |
| + | inet_ntop |
| + | inet_pton |
| llseek | |
| LoadLibrary | |
| LoadLibraryA | |
| @@ -154,12 +154,6 @@ | |
| /* Define to the function return type for send. */ | |
| #define SEND_TYPE_RETV int | |
| - | /* Must always use local implementations on Windows. */ |
| - | /* Define to 1 if you have an IPv6 capable working inet_ntop function. */ |
| - | /* #undef HAVE_INET_NTOP */ |
| - | /* Define to 1 if you have an IPv6 capable working inet_pton function. */ |
| - | /* #undef HAVE_INET_PTON */ |
| - | |
| /* Define to 1 if you have the `basename' function. */ | |
| #ifdef __MINGW32__ | |
| #define HAVE_BASENAME 1 | |
| @@ -336,12 +336,6 @@ | |
| /* Define to 1 if you have the <ifaddrs.h> header file. */ | |
| #cmakedefine HAVE_IFADDRS_H 1 | |
| - | /* Define to 1 if you have an IPv6 capable working inet_ntop function. */ |
| - | #cmakedefine HAVE_INET_NTOP 1 |
| - | |
| - | /* Define to 1 if you have an IPv6 capable working inet_pton function. */ |
| - | #cmakedefine HAVE_INET_PTON 1 |
| - | |
| /* Define to 1 if symbol `sa_family_t' exists */ | |
| #cmakedefine HAVE_SA_FAMILY_T 1 | |
| @@ -18,8 +18,6 @@ | |
| */ | |
| #include "curl_setup.h" | |
| - | #ifndef HAVE_INET_NTOP |
| - | |
| #ifdef HAVE_SYS_PARAM_H | |
| #include <sys/param.h> | |
| #endif | |
| @@ -219,4 +217,3 @@ char *curlx_inet_ntop(int af, const void *src, char *buf, size_t size) | |
| return NULL; | |
| } | |
| } | |
| - | #endif /* HAVE_INET_NTOP */ |
| @@ -25,26 +25,6 @@ | |
| ***************************************************************************/ | |
| #include "curl_setup.h" | |
| - | #ifdef HAVE_INET_NTOP |
| - | #ifdef HAVE_NETINET_IN_H |
| - | #include <netinet/in.h> |
| - | #endif |
| - | #ifndef _WIN32 |
| - | #include <sys/socket.h> |
| - | #endif |
| - | #ifdef HAVE_ARPA_INET_H |
| - | #include <arpa/inet.h> |
| - | #endif |
| - | #ifdef __AMIGA__ |
| - | #define curlx_inet_ntop(af, src, buf, size) \ |
| - | (char *)inet_ntop(af, CURL_UNCONST(src), (unsigned char *)(buf), \ |
| - | (curl_socklen_t)(size)) |
| - | #else |
| - | #define curlx_inet_ntop(af, src, buf, size) \ |
| - | inet_ntop(af, src, buf, (curl_socklen_t)(size)) |
| - | #endif |
| - | #else |
| char *curlx_inet_ntop(int af, const void *src, char *buf, size_t size); | |
| - | #endif /* HAVE_INET_NTOP */ |
| #endif /* HEADER_CURL_INET_NTOP_H */ | |
| @@ -19,8 +19,6 @@ | |
| */ | |
| #include "curl_setup.h" | |
| - | #ifndef HAVE_INET_PTON |
| - | |
| #ifdef HAVE_SYS_PARAM_H | |
| #include <sys/param.h> | |
| #endif | |
| @@ -217,5 +215,3 @@ int curlx_inet_pton(int af, const char *src, void *dst) | |
| } | |
| /* NOTREACHED */ | |
| } | |
| - | |
| - | #endif /* HAVE_INET_PTON */ |
| @@ -25,25 +25,6 @@ | |
| ***************************************************************************/ | |
| #include "curl_setup.h" | |
| - | #ifdef HAVE_INET_PTON |
| - | #ifdef HAVE_NETINET_IN_H |
| - | #include <netinet/in.h> |
| - | #endif |
| - | #ifndef _WIN32 |
| - | #include <sys/socket.h> |
| - | #endif |
| - | #ifdef HAVE_ARPA_INET_H |
| - | #include <arpa/inet.h> |
| - | #endif |
| - | #ifdef __AMIGA__ |
| - | #define curlx_inet_pton(x, y, z) \ |
| - | inet_pton(x, (unsigned char *)CURL_UNCONST(y), z) |
| - | #else |
| - | #define curlx_inet_pton(x, y, z) \ |
| - | inet_pton(x, y, z) |
| - | #endif |
| - | #else |
| int curlx_inet_pton(int af, const char *src, void *dst); | |
| - | #endif /* HAVE_INET_PTON */ |
| #endif /* HEADER_CURL_INET_PTON_H */ | |
| @@ -25,35 +25,6 @@ | |
| dnl File version for 'aclocal' use. Keep it a single number. | |
| dnl serial 73 | |
| - | dnl CURL_INCLUDES_ARPA_INET |
| - | dnl ------------------------------------------------- |
| - | dnl Set up variable with list of headers that must be |
| - | dnl included when arpa/inet.h is to be included. |
| - | |
| - | AC_DEFUN([CURL_INCLUDES_ARPA_INET], [ |
| - | curl_includes_arpa_inet="\ |
| - | /* includes start */ |
| - | #ifdef HAVE_SYS_TYPES_H |
| - | # include <sys/types.h> |
| - | #endif |
| - | #ifdef HAVE_NETINET_IN_H |
| - | # include <netinet/in.h> |
| - | #endif |
| - | #ifdef HAVE_ARPA_INET_H |
| - | # include <arpa/inet.h> |
| - | #endif |
| - | #ifdef _WIN32 |
| - | #include <winsock2.h> |
| - | #include <ws2tcpip.h> |
| - | #else |
| - | #include <sys/socket.h> |
| - | #endif |
| - | /* includes end */" |
| - | AC_CHECK_HEADERS( |
| - | sys/types.h netinet/in.h arpa/inet.h, |
| - | [], [], [$curl_includes_arpa_inet]) |
| - | ]) |
| - | |
| dnl CURL_INCLUDES_FCNTL | |
| dnl ------------------------------------------------- | |
| @@ -2254,334 +2225,6 @@ AC_DEFUN([CURL_CHECK_FUNC_LOCALTIME_R], [ | |
| ]) | |
| - | dnl CURL_CHECK_FUNC_INET_NTOP |
| - | dnl ------------------------------------------------- |
| - | dnl Verify if inet_ntop is available, prototyped, can |
| - | dnl be compiled and seems to work. If all of these are |
| - | dnl true, and usage has not been previously disallowed |
| - | dnl with shell variable curl_disallow_inet_ntop, then |
| - | dnl HAVE_INET_NTOP is defined. |
| - | |
| - | AC_DEFUN([CURL_CHECK_FUNC_INET_NTOP], [ |
| - | AC_REQUIRE([CURL_INCLUDES_STDLIB]) |
| - | AC_REQUIRE([CURL_INCLUDES_ARPA_INET]) |
| - | AC_REQUIRE([CURL_INCLUDES_STRING]) |
| - | |
| - | tst_links_inet_ntop="unknown" |
| - | tst_proto_inet_ntop="unknown" |
| - | tst_compi_inet_ntop="unknown" |
| - | tst_works_inet_ntop="unknown" |
| - | tst_allow_inet_ntop="unknown" |
| - | |
| - | AC_MSG_CHECKING([if inet_ntop can be linked]) |
| - | AC_LINK_IFELSE([ |
| - | AC_LANG_FUNC_LINK_TRY([inet_ntop]) |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_links_inet_ntop="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_links_inet_ntop="no" |
| - | ]) |
| - | |
| - | if test "$tst_links_inet_ntop" = "yes"; then |
| - | AC_MSG_CHECKING([if inet_ntop is prototyped]) |
| - | AC_EGREP_CPP([inet_ntop],[ |
| - | $curl_includes_arpa_inet |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_proto_inet_ntop="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_proto_inet_ntop="no" |
| - | ]) |
| - | fi |
| - | |
| - | if test "$tst_proto_inet_ntop" = "yes"; then |
| - | AC_MSG_CHECKING([if inet_ntop is compilable]) |
| - | AC_COMPILE_IFELSE([ |
| - | AC_LANG_PROGRAM([[ |
| - | $curl_includes_arpa_inet |
| - | ]],[[ |
| - | char ipv4res[sizeof("255.255.255.255")]; |
| - | unsigned char ipv4a[5] = ""; |
| - | if(inet_ntop(0, ipv4a, ipv4res, 0)) |
| - | return 1; |
| - | ]]) |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_compi_inet_ntop="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_compi_inet_ntop="no" |
| - | ]) |
| - | fi |
| - | |
| - | dnl only do runtime verification when not cross-compiling |
| - | if test "$cross_compiling" != "yes" && |
| - | test "$tst_compi_inet_ntop" = "yes"; then |
| - | AC_MSG_CHECKING([if inet_ntop seems to work]) |
| - | CURL_RUN_IFELSE([ |
| - | AC_LANG_PROGRAM([[ |
| - | $curl_includes_stdlib |
| - | $curl_includes_arpa_inet |
| - | $curl_includes_string |
| - | ]],[[ |
| - | char ipv6res[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; |
| - | char ipv4res[sizeof("255.255.255.255")]; |
| - | unsigned char ipv6a[26]; |
| - | unsigned char ipv4a[5]; |
| - | const char *ipv6ptr = 0; |
| - | const char *ipv4ptr = 0; |
| - | /* - */ |
| - | ipv4res[0] = '\0'; |
| - | ipv4a[0] = 0xc0; |
| - | ipv4a[1] = 0xa8; |
| - | ipv4a[2] = 0x64; |
| - | ipv4a[3] = 0x01; |
| - | ipv4a[4] = 0x01; |
| - | ipv4ptr = inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res)); |
| - | if(!ipv4ptr) |
| - | return 1; /* fail */ |
| - | if(ipv4ptr != ipv4res) |
| - | return 1; /* fail */ |
| - | if(!ipv4ptr[0]) |
| - | return 1; /* fail */ |
| - | if(memcmp(ipv4res, "192.168.100.1", 13)) |
| - | return 1; /* fail */ |
| - | /* - */ |
| - | ipv6res[0] = '\0'; |
| - | memset(ipv6a, 0, sizeof(ipv6a)); |
| - | ipv6a[0] = 0xfe; |
| - | ipv6a[1] = 0x80; |
| - | ipv6a[8] = 0x02; |
| - | ipv6a[9] = 0x14; |
| - | ipv6a[10] = 0x4f; |
| - | ipv6a[11] = 0xff; |
| - | ipv6a[12] = 0xfe; |
| - | ipv6a[13] = 0x0b; |
| - | ipv6a[14] = 0x76; |
| - | ipv6a[15] = 0xc8; |
| - | ipv6a[25] = 0x01; |
| - | ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res)); |
| - | if(!ipv6ptr) |
| - | return 1; /* fail */ |
| - | if(ipv6ptr != ipv6res) |
| - | return 1; /* fail */ |
| - | if(!ipv6ptr[0]) |
| - | return 1; /* fail */ |
| - | if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24)) |
| - | return 1; /* fail */ |
| - | |
| - | /* verify working RFC 4291 zero prefixed IPv4 - mapped format */ |
| - | memset(ipv6a, 0, sizeof(ipv6a)); |
| - | ipv6a[12] = 0x7f; |
| - | ipv6a[13] = 0x0; |
| - | ipv6a[14] = 0x0; |
| - | ipv6a[15] = 0x01; |
| - | ipv6ptr = inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res)); |
| - | if(!ipv6ptr) |
| - | return 1; /* fail */ |
| - | if(ipv6ptr != ipv6res) |
| - | return 1; /* fail */ |
| - | if(!ipv6ptr[0]) |
| - | return 1; /* fail */ |
| - | if(memcmp(ipv6res, "::127.0.0.1", 11)) |
| - | return 1; /* fail */ |
| - | return 0; |
| - | ]]) |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_works_inet_ntop="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_works_inet_ntop="no" |
| - | ]) |
| - | fi |
| - | |
| - | if test "$tst_compi_inet_ntop" = "yes" && |
| - | test "$tst_works_inet_ntop" != "no"; then |
| - | AC_MSG_CHECKING([if inet_ntop usage allowed]) |
| - | if test "x$curl_disallow_inet_ntop" != "xyes"; then |
| - | AC_MSG_RESULT([yes]) |
| - | tst_allow_inet_ntop="yes" |
| - | else |
| - | AC_MSG_RESULT([no]) |
| - | tst_allow_inet_ntop="no" |
| - | fi |
| - | fi |
| - | |
| - | AC_MSG_CHECKING([if inet_ntop might be used]) |
| - | if test "$tst_links_inet_ntop" = "yes" && |
| - | test "$tst_proto_inet_ntop" = "yes" && |
| - | test "$tst_compi_inet_ntop" = "yes" && |
| - | test "$tst_allow_inet_ntop" = "yes" && |
| - | test "$tst_works_inet_ntop" != "no"; then |
| - | AC_MSG_RESULT([yes]) |
| - | AC_DEFINE_UNQUOTED(HAVE_INET_NTOP, 1, |
| - | [Define to 1 if you have an IPv6 capable working inet_ntop function.]) |
| - | curl_cv_func_inet_ntop="yes" |
| - | else |
| - | AC_MSG_RESULT([no]) |
| - | curl_cv_func_inet_ntop="no" |
| - | fi |
| - | ]) |
| - | |
| - | |
| - | dnl CURL_CHECK_FUNC_INET_PTON |
| - | dnl ------------------------------------------------- |
| - | dnl Verify if inet_pton is available, prototyped, can |
| - | dnl be compiled and seems to work. If all of these are |
| - | dnl true, and usage has not been previously disallowed |
| - | dnl with shell variable curl_disallow_inet_pton, then |
| - | dnl HAVE_INET_PTON is defined. |
| - | |
| - | AC_DEFUN([CURL_CHECK_FUNC_INET_PTON], [ |
| - | AC_REQUIRE([CURL_INCLUDES_STDLIB]) |
| - | AC_REQUIRE([CURL_INCLUDES_ARPA_INET]) |
| - | AC_REQUIRE([CURL_INCLUDES_STRING]) |
| - | |
| - | tst_links_inet_pton="unknown" |
| - | tst_proto_inet_pton="unknown" |
| - | tst_compi_inet_pton="unknown" |
| - | tst_works_inet_pton="unknown" |
| - | tst_allow_inet_pton="unknown" |
| - | |
| - | AC_MSG_CHECKING([if inet_pton can be linked]) |
| - | AC_LINK_IFELSE([ |
| - | AC_LANG_FUNC_LINK_TRY([inet_pton]) |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_links_inet_pton="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_links_inet_pton="no" |
| - | ]) |
| - | |
| - | if test "$tst_links_inet_pton" = "yes"; then |
| - | AC_MSG_CHECKING([if inet_pton is prototyped]) |
| - | AC_EGREP_CPP([inet_pton],[ |
| - | $curl_includes_arpa_inet |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_proto_inet_pton="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_proto_inet_pton="no" |
| - | ]) |
| - | fi |
| - | |
| - | if test "$tst_proto_inet_pton" = "yes"; then |
| - | AC_MSG_CHECKING([if inet_pton is compilable]) |
| - | AC_COMPILE_IFELSE([ |
| - | AC_LANG_PROGRAM([[ |
| - | $curl_includes_arpa_inet |
| - | ]],[[ |
| - | unsigned char ipv4a[4 + 1] = ""; |
| - | const char *ipv4src = "192.168.100.1"; |
| - | if(inet_pton(0, ipv4src, ipv4a)) |
| - | return 1; |
| - | ]]) |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_compi_inet_pton="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_compi_inet_pton="no" |
| - | ]) |
| - | fi |
| - | |
| - | dnl only do runtime verification when not cross-compiling |
| - | if test "$cross_compiling" != "yes" && |
| - | test "$tst_compi_inet_pton" = "yes"; then |
| - | AC_MSG_CHECKING([if inet_pton seems to work]) |
| - | CURL_RUN_IFELSE([ |
| - | AC_LANG_PROGRAM([[ |
| - | $curl_includes_stdlib |
| - | $curl_includes_arpa_inet |
| - | $curl_includes_string |
| - | ]],[[ |
| - | unsigned char ipv6a[16 + 1]; |
| - | unsigned char ipv4a[4 + 1]; |
| - | const char *ipv6src = "fe80::214:4fff:fe0b:76c8"; |
| - | const char *ipv4src = "192.168.100.1"; |
| - | /* - */ |
| - | memset(ipv4a, 1, sizeof(ipv4a)); |
| - | if(inet_pton(AF_INET, ipv4src, ipv4a) != 1) |
| - | return 1; /* fail */ |
| - | /* - */ |
| - | if((ipv4a[0] != 0xc0) || |
| - | (ipv4a[1] != 0xa8) || |
| - | (ipv4a[2] != 0x64) || |
| - | (ipv4a[3] != 0x01) || |
| - | (ipv4a[4] != 0x01)) |
| - | return 1; /* fail */ |
| - | /* - */ |
| - | memset(ipv6a, 1, sizeof(ipv6a)); |
| - | if(inet_pton(AF_INET6, ipv6src, ipv6a) != 1) |
| - | return 1; /* fail */ |
| - | /* - */ |
| - | if((ipv6a[0] != 0xfe) || |
| - | (ipv6a[1] != 0x80) || |
| - | (ipv6a[8] != 0x02) || |
| - | (ipv6a[9] != 0x14) || |
| - | (ipv6a[10] != 0x4f) || |
| - | (ipv6a[11] != 0xff) || |
| - | (ipv6a[12] != 0xfe) || |
| - | (ipv6a[13] != 0x0b) || |
| - | (ipv6a[14] != 0x76) || |
| - | (ipv6a[15] != 0xc8) || |
| - | (ipv6a[16] != 0x01)) |
| - | return 1; /* fail */ |
| - | /* - */ |
| - | if((ipv6a[2] != 0x0) || |
| - | (ipv6a[3] != 0x0) || |
| - | (ipv6a[4] != 0x0) || |
| - | (ipv6a[5] != 0x0) || |
| - | (ipv6a[6] != 0x0) || |
| - | (ipv6a[7] != 0x0)) |
| - | return 1; /* fail */ |
| - | /* - */ |
| - | return 0; |
| - | ]]) |
| - | ],[ |
| - | AC_MSG_RESULT([yes]) |
| - | tst_works_inet_pton="yes" |
| - | ],[ |
| - | AC_MSG_RESULT([no]) |
| - | tst_works_inet_pton="no" |
| - | ]) |
| - | fi |
| - | |
| - | if test "$tst_compi_inet_pton" = "yes" && |
| - | test "$tst_works_inet_pton" != "no"; then |
| - | AC_MSG_CHECKING([if inet_pton usage allowed]) |
| - | if test "x$curl_disallow_inet_pton" != "xyes"; then |
| - | AC_MSG_RESULT([yes]) |
| - | tst_allow_inet_pton="yes" |
| - | else |
| - | AC_MSG_RESULT([no]) |
| - | tst_allow_inet_pton="no" |
| - | fi |
| - | fi |
| - | |
| - | AC_MSG_CHECKING([if inet_pton might be used]) |
| - | if test "$tst_links_inet_pton" = "yes" && |
| - | test "$tst_proto_inet_pton" = "yes" && |
| - | test "$tst_compi_inet_pton" = "yes" && |
| - | test "$tst_allow_inet_pton" = "yes" && |
| - | test "$tst_works_inet_pton" != "no"; then |
| - | AC_MSG_RESULT([yes]) |
| - | AC_DEFINE_UNQUOTED(HAVE_INET_PTON, 1, |
| - | [Define to 1 if you have an IPv6 capable working inet_pton function.]) |
| - | curl_cv_func_inet_pton="yes" |
| - | else |
| - | AC_MSG_RESULT([no]) |
| - | curl_cv_func_inet_pton="no" |
| - | fi |
| - | ]) |
| - | |
| - | |
| dnl CURL_CHECK_FUNC_IOCTL | |
| dnl ------------------------------------------------- | |
| dnl Verify if ioctl is available, prototyped, and | |
| @@ -88,6 +88,8 @@ my %banfunc = ( | |
| "getaddrinfo" => 1, | |
| "gets" => 1, | |
| "gmtime" => 1, | |
| + | "inet_ntop" => 1, |
| + | "inet_pton" => 1, |
| "llseek" => 1, | |
| "LoadLibrary" => 1, | |
| "LoadLibraryA" => 1, | |
| @@ -235,10 +235,10 @@ test1916 test1917 test1918 test1919 test1920 test1921 test1922 \ | |
| \ | |
| test1933 test1934 test1935 test1936 test1937 test1938 test1939 test1940 \ | |
| test1941 test1942 test1943 test1944 test1945 test1946 test1947 test1948 \ | |
| - | test1955 test1956 test1957 test1958 test1959 test1960 test1964 test1965 \ |
| - | test1966 test1967 test1970 test1971 test1972 test1973 \ |
| - | test1974 test1975 test1976 test1977 test1978 test1979 test1980 test1981 \ |
| - | test1982 test1983 test1984 \ |
| + | test1955 test1956 test1957 test1958 test1959 test1960 test1961 \ |
| + | test1964 test1965 test1966 test1967 test1970 \ |
| + | test1971 test1972 test1973 test1974 test1975 test1976 test1977 test1978 \ |
| + | test1979 test1980 test1981 test1982 test1983 test1984 \ |
| \ | |
| test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \ | |
| test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \ | |
| @@ -0,0 +1,18 @@ | |
| + | <?xml version="1.0" encoding="US-ASCII"?> |
| + | <testcase> |
| + | <info> |
| + | <keywords> |
| + | unittest |
| + | </keywords> |
| + | </info> |
| + | |
| + | # Client-side |
| + | <client> |
| + | <features> |
| + | unittest |
| + | </features> |
| + | <name> |
| + | curlx_inet_ntop() and curlx_inet_pton() |
| + | </name> |
| + | </client> |
| + | </testcase> |
| @@ -36,6 +36,8 @@ UTILS_H = testutil.h testtrace.h unitcheck.h | |
| CURLX_C = \ | |
| ../../lib/curl_threads.c \ | |
| ../../lib/curlx/fopen.c \ | |
| + | ../../lib/curlx/inet_ntop.c \ |
| + | ../../lib/curlx/inet_pton.c \ |
| ../../lib/curlx/multibyte.c \ | |
| ../../lib/curlx/strcopy.c \ | |
| ../../lib/curlx/strerr.c \ | |
| @@ -47,6 +47,8 @@ extern int unitfail; /* for unittests */ | |
| #include "curlx/base64.h" /* for curlx_base64* */ | |
| #include "curlx/dynbuf.h" /* for curlx_dyn_*() */ | |
| #include "curlx/fopen.h" /* for curlx_f*() */ | |
| + | #include "curlx/inet_ntop.h" /* for curlx_inet_ntop() */ |
| + | #include "curlx/inet_pton.h" /* for curlx_inet_pton() */ |
| #include "curlx/strcopy.h" /* for curlx_strcopy() */ | |
| #include "curlx/strerr.h" /* for curlx_strerror() */ | |
| #include "curlx/strparse.h" /* for curlx_str_* parsing functions */ | |
| @@ -23,8 +23,6 @@ | |
| ***************************************************************************/ | |
| #include "first.h" | |
| - | #ifdef HAVE_INET_PTON |
| - | |
| #ifdef HAVE_NETINET_IN_H | |
| #include <netinet/in.h> | |
| #endif | |
| @@ -62,12 +60,6 @@ static int sockopt_cb(void *clientp, | |
| return CURL_SOCKOPT_ALREADY_CONNECTED; | |
| } | |
| - | #ifdef __AMIGA__ |
| - | #define my_inet_pton(x, y, z) inet_pton(x, (unsigned char *)CURL_UNCONST(y), z) |
| - | #else |
| - | #define my_inet_pton(x, y, z) inet_pton(x, y, z) |
| - | #endif |
| - | |
| /* Expected args: URL IP PORT */ | |
| static CURLcode test_lib1960(const char *URL) | |
| { | |
| @@ -104,8 +96,8 @@ static CURLcode test_lib1960(const char *URL) | |
| serv_addr.sin_family = AF_INET; | |
| serv_addr.sin_port = htons((unsigned short)port); | |
| - | if(my_inet_pton(AF_INET, libtest_arg2, &serv_addr.sin_addr) <= 0) { |
| - | curl_mfprintf(stderr, "inet_pton failed\n"); |
| + | if(curlx_inet_pton(AF_INET, libtest_arg2, &serv_addr.sin_addr) <= 0) { |
| + | curl_mfprintf(stderr, "curlx_inet_pton() failed\n"); |
| goto test_cleanup; | |
| } | |
| @@ -143,11 +135,3 @@ test_cleanup: | |
| return result; | |
| } | |
| - | #else |
| - | static CURLcode test_lib1960(const char *URL) |
| - | { |
| - | (void)URL; |
| - | curl_mprintf("lacks inet_pton\n"); |
| - | return CURLE_OK; |
| - | } |
| - | #endif |
| @@ -493,10 +493,12 @@ create_resp(int qid, const struct sockaddr *addr, curl_socklen_t addrlen, | |
| case QTYPE_A: | |
| for(a = 0; a < ancount_a; a++) { | |
| const unsigned char *store = ipv4_pref; | |
| + | const char *ip; |
| if(add_answer(&resp->body, store, sizeof(ipv4_pref), QTYPE_A)) | |
| goto error; | |
| + | ip = curlx_inet_ntop(AF_INET, store, addrbuf, sizeof(addrbuf)); |
| logmsg("[%d] response A (%x) '%s'", qid, (unsigned int)QTYPE_A, | |
| - | curlx_inet_ntop(AF_INET, store, addrbuf, sizeof(addrbuf))); |
| + | ip ? ip : "(null)"); |
| } | |
| if(!ancount_a) | |
| logmsg("[%d] response A empty", qid); | |
| @@ -504,10 +506,12 @@ create_resp(int qid, const struct sockaddr *addr, curl_socklen_t addrlen, | |
| case QTYPE_AAAA: | |
| for(a = 0; a < ancount_aaaa; a++) { | |
| const unsigned char *store = ipv6_pref; | |
| + | const char *ip; |
| if(add_answer(&resp->body, store, sizeof(ipv6_pref), QTYPE_AAAA)) | |
| goto error; | |
| + | ip = curlx_inet_ntop(AF_INET6, store, addrbuf, sizeof(addrbuf)); |
| logmsg("[%d] response AAAA (%x) '%s'", qid, (unsigned int)QTYPE_AAAA, | |
| - | curlx_inet_ntop(AF_INET6, store, addrbuf, sizeof(addrbuf))); |
| + | ip ? ip : "(null)"); |
| } | |
| if(!ancount_aaaa) | |
| logmsg("[%d] response AAAA empty", qid); | |
| @@ -43,7 +43,7 @@ TESTS_C = \ | |
| unit1657.c unit1658.c unit1660.c unit1661.c unit1663.c unit1664.c \ | |
| unit1666.c unit1667.c unit1668.c unit1669.c \ | |
| unit1674.c unit1675.c unit1676.c \ | |
| - | unit1979.c unit1980.c \ |
| + | unit1961.c unit1979.c unit1980.c \ |
| unit2413.c \ | |
| unit2600.c unit2601.c unit2602.c unit2603.c unit2604.c unit2605.c \ | |
| unit3200.c unit3205.c \ | |
| @@ -0,0 +1,172 @@ | |
| + | /*************************************************************************** |
| + | * _ _ ____ _ |
| + | * Project ___| | | | _ \| | |
| + | * / __| | | | |_) | | |
| + | * | (__| |_| | _ <| |___ |
| + | * \___|\___/|_| \_\_____| |
| + | * |
| + | * Copyright (C) Daniel Stenberg, <[email protected]>, et al. |
| + | * |
| + | * This software is licensed as described in the file COPYING, which |
| + | * you should have received as part of this distribution. The terms |
| + | * are also available at https://curl.se/docs/copyright.html. |
| + | * |
| + | * You may opt to use, copy, modify, merge, publish, distribute and/or sell |
| + | * copies of the Software, and permit persons to whom the Software is |
| + | * furnished to do so, under the terms of the COPYING file. |
| + | * |
| + | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| + | * KIND, either express or implied. |
| + | * |
| + | * SPDX-License-Identifier: curl |
| + | * |
| + | ***************************************************************************/ |
| + | #include "unitcheck.h" |
| + | |
| + | #ifdef HAVE_SYS_TYPES_H |
| + | #include <sys/types.h> |
| + | #endif |
| + | #ifndef _WIN32 |
| + | #include <sys/socket.h> |
| + | #endif |
| + | #ifdef HAVE_ARPA_INET_H |
| + | #include <arpa/inet.h> |
| + | #endif |
| + | #ifdef HAVE_NETINET_IN_H |
| + | #include <netinet/in.h> |
| + | #endif |
| + | #ifdef HAVE_NETINET_IN6_H |
| + | #include <netinet/in6.h> |
| + | #endif |
| + | |
| + | /* |
| + | * If USE_IPV6 is disabled, we still want to parse IPv6 addresses, so make |
| + | * sure we have _some_ value for AF_INET6 without polluting our fake value |
| + | * everywhere. |
| + | */ |
| + | #if !defined(USE_IPV6) && !defined(AF_INET6) |
| + | #define AF_INET6 (AF_INET + 1) |
| + | #endif |
| + | |
| + | static int test_ntop(void) |
| + | { |
| + | char ipv6res[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; |
| + | char ipv4res[sizeof("255.255.255.255")]; |
| + | unsigned char ipv6a[26]; |
| + | unsigned char ipv4a[5]; |
| + | const char *ipv6ptr = 0; |
| + | const char *ipv4ptr = 0; |
| + | |
| + | ipv4res[0] = '\0'; |
| + | ipv4a[0] = 0xc0; |
| + | ipv4a[1] = 0xa8; |
| + | ipv4a[2] = 0x64; |
| + | ipv4a[3] = 0x01; |
| + | ipv4a[4] = 0x01; |
| + | ipv4ptr = curlx_inet_ntop(AF_INET, ipv4a, ipv4res, sizeof(ipv4res)); |
| + | if(!ipv4ptr) |
| + | return 1; /* fail */ |
| + | if(ipv4ptr != ipv4res) |
| + | return 1; /* fail */ |
| + | if(!ipv4ptr[0]) |
| + | return 1; /* fail */ |
| + | if(memcmp(ipv4res, "192.168.100.1", 13)) |
| + | return 1; /* fail */ |
| + | |
| + | ipv6res[0] = '\0'; |
| + | memset(ipv6a, 0, sizeof(ipv6a)); |
| + | ipv6a[0] = 0xfe; |
| + | ipv6a[1] = 0x80; |
| + | ipv6a[8] = 0x02; |
| + | ipv6a[9] = 0x14; |
| + | ipv6a[10] = 0x4f; |
| + | ipv6a[11] = 0xff; |
| + | ipv6a[12] = 0xfe; |
| + | ipv6a[13] = 0x0b; |
| + | ipv6a[14] = 0x76; |
| + | ipv6a[15] = 0xc8; |
| + | ipv6a[25] = 0x01; |
| + | ipv6ptr = curlx_inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res)); |
| + | if(!ipv6ptr) |
| + | return 1; /* fail */ |
| + | if(ipv6ptr != ipv6res) |
| + | return 1; /* fail */ |
| + | if(!ipv6ptr[0]) |
| + | return 1; /* fail */ |
| + | if(memcmp(ipv6res, "fe80::214:4fff:fe0b:76c8", 24)) |
| + | return 1; /* fail */ |
| + | |
| + | /* verify working RFC 4291 zero prefixed IPv4 - mapped format */ |
| + | memset(ipv6a, 0, sizeof(ipv6a)); |
| + | ipv6a[12] = 0x7f; |
| + | ipv6a[13] = 0x0; |
| + | ipv6a[14] = 0x0; |
| + | ipv6a[15] = 0x01; |
| + | ipv6ptr = curlx_inet_ntop(AF_INET6, ipv6a, ipv6res, sizeof(ipv6res)); |
| + | if(!ipv6ptr) |
| + | return 1; /* fail */ |
| + | if(ipv6ptr != ipv6res) |
| + | return 1; /* fail */ |
| + | if(!ipv6ptr[0]) |
| + | return 1; /* fail */ |
| + | if(memcmp(ipv6res, "::127.0.0.1", 11)) |
| + | return 1; /* fail */ |
| + | |
| + | return 0; |
| + | } |
| + | |
| + | static int test_pton(void) |
| + | { |
| + | unsigned char ipv6a[16 + 1]; |
| + | unsigned char ipv4a[4 + 1]; |
| + | const char *ipv6src = "fe80::214:4fff:fe0b:76c8"; |
| + | const char *ipv4src = "192.168.100.1"; |
| + | |
| + | memset(ipv4a, 1, sizeof(ipv4a)); |
| + | if(curlx_inet_pton(AF_INET, ipv4src, ipv4a) != 1) |
| + | return 1; /* fail */ |
| + | |
| + | if((ipv4a[0] != 0xc0) || |
| + | (ipv4a[1] != 0xa8) || |
| + | (ipv4a[2] != 0x64) || |
| + | (ipv4a[3] != 0x01) || |
| + | (ipv4a[4] != 0x01)) |
| + | return 1; /* fail */ |
| + | |
| + | memset(ipv6a, 1, sizeof(ipv6a)); |
| + | if(curlx_inet_pton(AF_INET6, ipv6src, ipv6a) != 1) |
| + | return 1; /* fail */ |
| + | |
| + | if((ipv6a[0] != 0xfe) || |
| + | (ipv6a[1] != 0x80) || |
| + | (ipv6a[8] != 0x02) || |
| + | (ipv6a[9] != 0x14) || |
| + | (ipv6a[10] != 0x4f) || |
| + | (ipv6a[11] != 0xff) || |
| + | (ipv6a[12] != 0xfe) || |
| + | (ipv6a[13] != 0x0b) || |
| + | (ipv6a[14] != 0x76) || |
| + | (ipv6a[15] != 0xc8) || |
| + | (ipv6a[16] != 0x01)) |
| + | return 1; /* fail */ |
| + | |
| + | if((ipv6a[2] != 0x0) || |
| + | (ipv6a[3] != 0x0) || |
| + | (ipv6a[4] != 0x0) || |
| + | (ipv6a[5] != 0x0) || |
| + | (ipv6a[6] != 0x0) || |
| + | (ipv6a[7] != 0x0)) |
| + | return 1; /* fail */ |
| + | |
| + | return 0; |
| + | } |
| + | |
| + | static CURLcode test_unit1961(const char *arg) |
| + | { |
| + | UNITTEST_BEGIN_SIMPLE |
| + | |
| + | fail_if(test_ntop(), "curlx_inet_ntop()"); |
| + | fail_if(test_pton(), "curlx_inet_pton()"); |
| + | |
| + | UNITTEST_END_SIMPLE |
| + | } |