From 358c5c0745a4c47f910189095f3832163b4708c4 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 13 Feb 2013 13:18:43 +0100 Subject: [PATCH] strlcat: remove function This function was only used twice, both in places where performance isn't crucial (socks + if2ip). Removing the use of this function removes the need to have our private version for systems without it == reduced amount of code. Also, in the SOCKS case it is clearly better to fail gracefully rather than to truncate the results. This work was triggered by a bug report on the strcal prototype in strequal.h. strlcat was added in commit db70cd28 in February 2001! Bug: http://curl.haxx.se/bug/view.cgi?id=1192 Reported by: Jeremy Huddleston --- configure.ac | 1 - lib/config-dos.h | 6 +-- lib/config-os400.h | 5 +-- lib/config-riscos.h | 5 +-- lib/config-symbian.h | 5 +-- lib/config-tpf.h | 5 +-- lib/config-vxworks.h | 5 +-- lib/if2ip.c | 8 ++-- lib/socks.c | 13 +++++-- lib/strequal.c | 47 +---------------------- lib/strequal.h | 7 +--- m4/curl-functions.m4 | 90 +------------------------------------------- 12 files changed, 25 insertions(+), 172 deletions(-) diff --git a/configure.ac b/configure.ac index 597018827..baacf9fad 100644 --- a/configure.ac +++ b/configure.ac @@ -3044,7 +3044,6 @@ CURL_CHECK_FUNC_STRCMPI CURL_CHECK_FUNC_STRDUP CURL_CHECK_FUNC_STRERROR_R CURL_CHECK_FUNC_STRICMP -CURL_CHECK_FUNC_STRLCAT CURL_CHECK_FUNC_STRNCASECMP CURL_CHECK_FUNC_STRNCMPI CURL_CHECK_FUNC_STRNICMP diff --git a/lib/config-dos.h b/lib/config-dos.h index 68614e8f4..0ab396349 100644 --- a/lib/config-dos.h +++ b/lib/config-dos.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -164,10 +164,6 @@ #define HAVE_SYS_TIME_H 1 #define HAVE_VARIADIC_MACROS_GCC 1 - #if (DJGPP_MINOR >= 4) - #define HAVE_STRLCAT 1 - #endif - /* Because djgpp <= 2.03 doesn't have snprintf() etc. */ #if (DJGPP_MINOR < 4) #define _MPRINTF_REPLACE diff --git a/lib/config-os400.h b/lib/config-os400.h index 208c02903..0ac2cdb61 100644 --- a/lib/config-os400.h +++ b/lib/config-os400.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -298,9 +298,6 @@ /* Define if you have the header file. */ #define HAVE_STRING_H -/* Define if you have the `strlcat' function. */ -#undef HAVE_STRLCAT - /* Define if you have the `strlcpy' function. */ #undef HAVE_STRLCPY diff --git a/lib/config-riscos.h b/lib/config-riscos.h index e2af9af6c..e40057789 100644 --- a/lib/config-riscos.h +++ b/lib/config-riscos.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -305,9 +305,6 @@ /* Define if you have the header file. */ #define HAVE_STRING_H -/* Define if you have the `strlcat' function. */ -#undef HAVE_STRLCAT - /* Define if you have the `strlcpy' function. */ #undef HAVE_STRLCPY diff --git a/lib/config-symbian.h b/lib/config-symbian.h index fcfb4058c..754319f94 100644 --- a/lib/config-symbian.h +++ b/lib/config-symbian.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -525,9 +525,6 @@ /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 -/* Define to 1 if you have the `strlcat' function. */ -#define HAVE_STRLCAT 1 - /* Define to 1 if you have the `strlcpy' function. */ #define HAVE_STRLCPY 1 diff --git a/lib/config-tpf.h b/lib/config-tpf.h index 0208ab835..ddb8f778c 100644 --- a/lib/config-tpf.h +++ b/lib/config-tpf.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -471,9 +471,6 @@ /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 -/* Define to 1 if you have the `strlcat' function. */ -/* #undef HAVE_STRLCAT */ - /* Define to 1 if you have the `strlcpy' function. */ /* #undef HAVE_STRLCPY */ diff --git a/lib/config-vxworks.h b/lib/config-vxworks.h index 5b224c045..ab128768a 100644 --- a/lib/config-vxworks.h +++ b/lib/config-vxworks.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -592,9 +592,6 @@ /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 -/* Define to 1 if you have the strlcat function. */ -/* #undef HAVE_STRLCAT */ - /* Define to 1 if you have the `strlcpy' function. */ /* #undef HAVE_STRLCPY */ diff --git a/lib/if2ip.c b/lib/if2ip.c index 558e30f15..cc191201e 100644 --- a/lib/if2ip.c +++ b/lib/if2ip.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -95,6 +95,7 @@ char *Curl_if2ip(int af, const char *interf, char *buf, int buf_size) curl_strequal(iface->ifa_name, interf)) { void *addr; char scope[12]=""; + char ipstr[64]; #ifdef ENABLE_IPV6 if(af == AF_INET6) { unsigned int scopeid = 0; @@ -109,8 +110,9 @@ char *Curl_if2ip(int af, const char *interf, char *buf, int buf_size) else #endif addr = &((struct sockaddr_in *)iface->ifa_addr)->sin_addr; - ip = (char *) Curl_inet_ntop(af, addr, buf, buf_size); - strlcat(buf, scope, buf_size); + ip = (char *) Curl_inet_ntop(af, addr, ipstr, sizeof(ipstr)); + snprintf(buf, buf_size, "%s%s", ip, scope); + ip = buf; break; } } diff --git a/lib/socks.c b/lib/socks.c index 51bb94664..b101a0de4 100644 --- a/lib/socks.c +++ b/lib/socks.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -196,8 +196,15 @@ CURLcode Curl_SOCKS4(const char *proxy_name, * This is currently not supporting "Identification Protocol (RFC1413)". */ socksreq[8] = 0; /* ensure empty userid is NUL-terminated */ - if(proxy_name) - strlcat((char*)socksreq + 8, proxy_name, sizeof(socksreq) - 8); + if(proxy_name) { + size_t plen = strlen(proxy_name); + if(plen >= sizeof(socksreq) - 8) { + failf(data, "Too long SOCKS proxy name, can't use!\n"); + return CURLE_COULDNT_CONNECT; + } + /* copy the proxy name WITH trailing zero */ + memcpy(socksreq + 8, proxy_name, plen+1); + } /* * Make connection diff --git a/lib/strequal.c b/lib/strequal.c index f69c5bf9e..5f2f508e2 100644 --- a/lib/strequal.c +++ b/lib/strequal.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2011, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -77,48 +77,3 @@ int curl_strnequal(const char *first, const char *second, size_t max) return toupper(*first) == toupper(*second); #endif } - -#ifndef HAVE_STRLCAT -/* - * The strlcat() function appends the NUL-terminated string src to the end - * of dst. It will append at most size - strlen(dst) - 1 bytes, NUL-termi- - * nating the result. - * - * The strlcpy() and strlcat() functions return the total length of the - * string they tried to create. For strlcpy() that means the length of src. - * For strlcat() that means the initial length of dst plus the length of - * src. While this may seem somewhat confusing it was done to make trunca- - * tion detection simple. - * - * - */ -size_t Curl_strlcat(char *dst, const char *src, size_t siz) -{ - char *d = dst; - const char *s = src; - size_t n = siz; - union { - ssize_t sig; - size_t uns; - } dlen; - - /* Find the end of dst and adjust bytes left but don't go past end */ - while(n-- != 0 && *d != '\0') - d++; - dlen.sig = d - dst; - n = siz - dlen.uns; - - if(n == 0) - return(dlen.uns + strlen(s)); - while(*s != '\0') { - if(n != 1) { - *d++ = *s; - n--; - } - s++; - } - *d = '\0'; - - return(dlen.uns + (s - src)); /* count does not include NUL */ -} -#endif diff --git a/lib/strequal.h b/lib/strequal.h index 287e042f4..117a305b7 100644 --- a/lib/strequal.h +++ b/lib/strequal.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2013, 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 @@ -27,10 +27,5 @@ #define strequal(a,b) curl_strequal(a,b) #define strnequal(a,b,c) curl_strnequal(a,b,c) -#ifndef HAVE_STRLCAT -#define strlcat(x,y,z) Curl_strlcat(x,y,z) -#endif -size_t strlcat(char *dst, const char *src, size_t siz); - #endif /* HEADER_CURL_STREQUAL_H */ diff --git a/m4/curl-functions.m4 b/m4/curl-functions.m4 index 2a37d2e11..d3bff078d 100644 --- a/m4/curl-functions.m4 +++ b/m4/curl-functions.m4 @@ -5,7 +5,7 @@ # | (__| |_| | _ <| |___ # \___|\___/|_| \_\_____| # -# Copyright (C) 1998 - 2012, Daniel Stenberg, , et al. +# Copyright (C) 1998 - 2013, 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 @@ -21,7 +21,7 @@ #*************************************************************************** # File version for 'aclocal' use. Keep it a single number. -# serial 72 +# serial 73 dnl CURL_INCLUDES_ARPA_INET @@ -6472,92 +6472,6 @@ AC_DEFUN([CURL_CHECK_FUNC_STRICMP], [ fi ]) - -dnl CURL_CHECK_FUNC_STRLCAT -dnl ------------------------------------------------- -dnl Verify if strlcat is available, prototyped, and -dnl can be compiled. If all of these are true, and -dnl usage has not been previously disallowed with -dnl shell variable curl_disallow_strlcat, then -dnl HAVE_STRLCAT will be defined. - -AC_DEFUN([CURL_CHECK_FUNC_STRLCAT], [ - AC_REQUIRE([CURL_INCLUDES_STRING])dnl - # - tst_links_strlcat="unknown" - tst_proto_strlcat="unknown" - tst_compi_strlcat="unknown" - tst_allow_strlcat="unknown" - # - AC_MSG_CHECKING([if strlcat can be linked]) - AC_LINK_IFELSE([ - AC_LANG_FUNC_LINK_TRY([strlcat]) - ],[ - AC_MSG_RESULT([yes]) - tst_links_strlcat="yes" - ],[ - AC_MSG_RESULT([no]) - tst_links_strlcat="no" - ]) - # - if test "$tst_links_strlcat" = "yes"; then - AC_MSG_CHECKING([if strlcat is prototyped]) - AC_EGREP_CPP([strlcat],[ - $curl_includes_string - ],[ - AC_MSG_RESULT([yes]) - tst_proto_strlcat="yes" - ],[ - AC_MSG_RESULT([no]) - tst_proto_strlcat="no" - ]) - fi - # - if test "$tst_proto_strlcat" = "yes"; then - AC_MSG_CHECKING([if strlcat is compilable]) - AC_COMPILE_IFELSE([ - AC_LANG_PROGRAM([[ - $curl_includes_string - ]],[[ - if(0 != strlcat(0, 0, 0)) - return 1; - ]]) - ],[ - AC_MSG_RESULT([yes]) - tst_compi_strlcat="yes" - ],[ - AC_MSG_RESULT([no]) - tst_compi_strlcat="no" - ]) - fi - # - if test "$tst_compi_strlcat" = "yes"; then - AC_MSG_CHECKING([if strlcat usage allowed]) - if test "x$curl_disallow_strlcat" != "xyes"; then - AC_MSG_RESULT([yes]) - tst_allow_strlcat="yes" - else - AC_MSG_RESULT([no]) - tst_allow_strlcat="no" - fi - fi - # - AC_MSG_CHECKING([if strlcat might be used]) - if test "$tst_links_strlcat" = "yes" && - test "$tst_proto_strlcat" = "yes" && - test "$tst_compi_strlcat" = "yes" && - test "$tst_allow_strlcat" = "yes"; then - AC_MSG_RESULT([yes]) - AC_DEFINE_UNQUOTED(HAVE_STRLCAT, 1, - [Define to 1 if you have the strlcat function.]) - ac_cv_func_strlcat="yes" - else - AC_MSG_RESULT([no]) - ac_cv_func_strlcat="no" - fi -]) - - dnl CURL_CHECK_FUNC_STRNCASECMP dnl ------------------------------------------------- dnl Verify if strncasecmp is available, prototyped, and