diff --git a/CMake/unix-cache.cmake b/CMake/unix-cache.cmake index 44dc6472b2..97be36d5f3 100644 --- a/CMake/unix-cache.cmake +++ b/CMake/unix-cache.cmake @@ -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) diff --git a/CMake/win32-cache.cmake b/CMake/win32-cache.cmake index bd9bb6e3fc..c108087273 100644 --- a/CMake/win32-cache.cmake +++ b/CMake/win32-cache.cmake @@ -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) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8db6d79ad7..0ad15f7667 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/configure.ac b/configure.ac index 575cf4046a..a8bf9703fa 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/docs/examples/block_ip.c b/docs/examples/block_ip.c index 675490701b..69ffb25195 100644 --- a/docs/examples/block_ip.c +++ b/docs/examples/block_ip.c @@ -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); diff --git a/docs/internals/CODE_STYLE.md b/docs/internals/CODE_STYLE.md index ce3c199135..5feb52f3dc 100644 --- a/docs/internals/CODE_STYLE.md +++ b/docs/internals/CODE_STYLE.md @@ -371,6 +371,8 @@ This is the full list of functions generally banned. getaddrinfo gets gmtime + inet_ntop + inet_pton llseek LoadLibrary LoadLibraryA diff --git a/lib/config-win32.h b/lib/config-win32.h index b1fc102209..fedfb8f30e 100644 --- a/lib/config-win32.h +++ b/lib/config-win32.h @@ -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 diff --git a/lib/curl_config-cmake.h.in b/lib/curl_config-cmake.h.in index c38caa2a03..92280010c0 100644 --- a/lib/curl_config-cmake.h.in +++ b/lib/curl_config-cmake.h.in @@ -336,12 +336,6 @@ /* Define to 1 if you have the 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 diff --git a/lib/curlx/inet_ntop.c b/lib/curlx/inet_ntop.c index 803b9887ac..7f6028a791 100644 --- a/lib/curlx/inet_ntop.c +++ b/lib/curlx/inet_ntop.c @@ -18,8 +18,6 @@ */ #include "curl_setup.h" -#ifndef HAVE_INET_NTOP - #ifdef HAVE_SYS_PARAM_H #include #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 */ diff --git a/lib/curlx/inet_ntop.h b/lib/curlx/inet_ntop.h index ba8299fe4e..8f4c636d69 100644 --- a/lib/curlx/inet_ntop.h +++ b/lib/curlx/inet_ntop.h @@ -25,26 +25,6 @@ ***************************************************************************/ #include "curl_setup.h" -#ifdef HAVE_INET_NTOP -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifndef _WIN32 -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#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 */ diff --git a/lib/curlx/inet_pton.c b/lib/curlx/inet_pton.c index 7994f258fe..c8f63a1413 100644 --- a/lib/curlx/inet_pton.c +++ b/lib/curlx/inet_pton.c @@ -19,8 +19,6 @@ */ #include "curl_setup.h" -#ifndef HAVE_INET_PTON - #ifdef HAVE_SYS_PARAM_H #include #endif @@ -217,5 +215,3 @@ int curlx_inet_pton(int af, const char *src, void *dst) } /* NOTREACHED */ } - -#endif /* HAVE_INET_PTON */ diff --git a/lib/curlx/inet_pton.h b/lib/curlx/inet_pton.h index 02ae7f2269..4e45e83285 100644 --- a/lib/curlx/inet_pton.h +++ b/lib/curlx/inet_pton.h @@ -25,25 +25,6 @@ ***************************************************************************/ #include "curl_setup.h" -#ifdef HAVE_INET_PTON -#ifdef HAVE_NETINET_IN_H -#include -#endif -#ifndef _WIN32 -#include -#endif -#ifdef HAVE_ARPA_INET_H -#include -#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 */ diff --git a/m4/curl-functions.m4 b/m4/curl-functions.m4 index 490c1e5d1f..64046a834a 100644 --- a/m4/curl-functions.m4 +++ b/m4/curl-functions.m4 @@ -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 -#endif -#ifdef HAVE_NETINET_IN_H -# include -#endif -#ifdef HAVE_ARPA_INET_H -# include -#endif -#ifdef _WIN32 -#include -#include -#else -#include -#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 diff --git a/scripts/checksrc.pl b/scripts/checksrc.pl index 7ef3074b0c..b1062308a4 100755 --- a/scripts/checksrc.pl +++ b/scripts/checksrc.pl @@ -88,6 +88,8 @@ my %banfunc = ( "getaddrinfo" => 1, "gets" => 1, "gmtime" => 1, + "inet_ntop" => 1, + "inet_pton" => 1, "llseek" => 1, "LoadLibrary" => 1, "LoadLibraryA" => 1, diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index a8a3b96e61..940ee4bfe8 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -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 \ diff --git a/tests/data/test1961 b/tests/data/test1961 new file mode 100644 index 0000000000..0b44ca3c0e --- /dev/null +++ b/tests/data/test1961 @@ -0,0 +1,18 @@ + + + + +unittest + + + +# Client-side + + +unittest + + +curlx_inet_ntop() and curlx_inet_pton() + + + diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc index bec648542b..64508d1285 100644 --- a/tests/libtest/Makefile.inc +++ b/tests/libtest/Makefile.inc @@ -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 \ diff --git a/tests/libtest/first.h b/tests/libtest/first.h index fda2fd9f1f..75ae75c6fb 100644 --- a/tests/libtest/first.h +++ b/tests/libtest/first.h @@ -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 */ diff --git a/tests/libtest/lib1960.c b/tests/libtest/lib1960.c index fbb0f7e597..1cda44040a 100644 --- a/tests/libtest/lib1960.c +++ b/tests/libtest/lib1960.c @@ -23,8 +23,6 @@ ***************************************************************************/ #include "first.h" -#ifdef HAVE_INET_PTON - #ifdef HAVE_NETINET_IN_H #include #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 diff --git a/tests/server/dnsd.c b/tests/server/dnsd.c index b9a50c120b..ca89c9c053 100644 --- a/tests/server/dnsd.c +++ b/tests/server/dnsd.c @@ -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); diff --git a/tests/unit/Makefile.inc b/tests/unit/Makefile.inc index 18d97b051c..d1fec804ee 100644 --- a/tests/unit/Makefile.inc +++ b/tests/unit/Makefile.inc @@ -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 \ diff --git a/tests/unit/unit1961.c b/tests/unit/unit1961.c new file mode 100644 index 0000000000..135386256a --- /dev/null +++ b/tests/unit/unit1961.c @@ -0,0 +1,172 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) Daniel Stenberg, , 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 +#endif +#ifndef _WIN32 +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_IN6_H +#include +#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 +}