From bf56a39e6f230c4d49feb35ee7dee0706f952884 Mon Sep 17 00:00:00 2001 From: akallabeth Date: Tue, 2 Aug 2022 09:15:38 +0200 Subject: [PATCH] Fixed #8090: Duplicate definition of strndup (#8102) * Fixed #8090: Duplicate definition of strndup * Moved strndup detection to winpr Co-authored-by: Armin Novak --- CMakeLists.txt | 6 ------ include/config/config.h.in | 1 - libfreerdp/core/settings.h | 12 ++---------- uwac/templates/config.h.in | 1 - winpr/CMakeLists.txt | 2 ++ winpr/libwinpr/crt/string.c | 22 +++++----------------- 6 files changed, 9 insertions(+), 35 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6aed8ed32..15e679930 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -312,12 +312,6 @@ if(NOT IOS) find_package(Threads REQUIRED) endif() -if (IOS) - set(HAVE_STRNDUP 1) -else() - CHECK_SYMBOL_EXISTS(strndup string.h HAVE_STRNDUP) -endif() - # Enable address sanitizer, where supported and when required if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" OR CMAKE_COMPILER_IS_GNUCC) CHECK_C_COMPILER_FLAG ("-fno-omit-frame-pointer" fno-omit-frame-pointer) diff --git a/include/config/config.h.in b/include/config/config.h.in index b3d3ac184..6ce58f044 100644 --- a/include/config/config.h.in +++ b/include/config/config.h.in @@ -7,7 +7,6 @@ #cmakedefine HAVE_SYSLOG_H #cmakedefine HAVE_JOURNALD_H #cmakedefine HAVE_VALGRIND_MEMCHECK_H -#cmakedefine HAVE_STRNDUP /* Features */ #cmakedefine SWRESAMPLE_FOUND diff --git a/libfreerdp/core/settings.h b/libfreerdp/core/settings.h index 7b3fcd4b5..a7a629af9 100644 --- a/libfreerdp/core/settings.h +++ b/libfreerdp/core/settings.h @@ -21,6 +21,8 @@ #ifndef FREERDP_LIB_CORE_SETTINGS_H #define FREERDP_LIB_CORE_SETTINGS_H +#include + #include #include @@ -29,16 +31,6 @@ #include -#if !defined(HAVE_STRNDUP) -static INLINE char* strndup(const char* src, size_t len) -{ - char* dst = calloc(len + 1, sizeof(char)); - if (dst) - strncpy(dst, src, len); - return dst; -} -#endif - FREERDP_LOCAL BOOL freerdp_settings_set_default_order_support(rdpSettings* settings); FREERDP_LOCAL BOOL freerdp_settings_clone_keys(rdpSettings* dst, const rdpSettings* src); FREERDP_LOCAL void freerdp_settings_free_keys(rdpSettings* dst, BOOL cleanup); diff --git a/uwac/templates/config.h.in b/uwac/templates/config.h.in index 3b6015373..5c136bf40 100644 --- a/uwac/templates/config.h.in +++ b/uwac/templates/config.h.in @@ -6,7 +6,6 @@ #cmakedefine HAVE_POLL_H #cmakedefine HAVE_SYSLOG_H #cmakedefine HAVE_JOURNALD_H -#cmakedefine HAVE_STRNDUP #cmakedefine HAVE_PIXMAN_REGION #endif /* UWAC_CONFIG_H */ diff --git a/winpr/CMakeLists.txt b/winpr/CMakeLists.txt index 8a4664419..43876f130 100644 --- a/winpr/CMakeLists.txt +++ b/winpr/CMakeLists.txt @@ -163,6 +163,7 @@ else() endif() if(NOT IOS) + CHECK_SYMBOL_EXISTS(strndup string.h HAVE_STRNDUP) check_include_files(unistd.h HAVE_UNISTD_H) check_include_files(execinfo.h HAVE_EXECINFO_H) check_include_files(inttypes.h HAVE_INTTYPES_H) @@ -170,6 +171,7 @@ if(NOT IOS) check_include_files(inttypes.h HAVE_INTTYPES_H) else(NOT IOS) set(HAVE_STDINT_H 1) + set(HAVE_STRNDUP 1) set(HAVE_INTTYPES_H 1) endif(NOT IOS) diff --git a/winpr/libwinpr/crt/string.c b/winpr/libwinpr/crt/string.c index 3d9afb92f..e9f7bf1a5 100644 --- a/winpr/libwinpr/crt/string.c +++ b/winpr/libwinpr/crt/string.c @@ -646,23 +646,11 @@ INT64 GetLine(char** lineptr, size_t* size, FILE* stream) } #if !defined(HAVE_STRNDUP) -char* strndup(const char* s, size_t n) +char* strndup(const char* src, size_t n) { - char* rc; - size_t len; - - WINPR_ASSERT(s || (n == 0)); - if (n == 0) - return NULL; - - len = strnlen(s, n); - if (len == n) - len++; - - rc = calloc(len, sizeof(char)); - if (!rc) - return NULL; - memcpy(rc, s, n); - return rc; + char* dst = calloc(n + 1, sizeof(char)); + if (dst) + strncpy(dst, src, n); + return dst; } #endif