From 872a773fac1e2880428d82e9f589ff16a5fde727 Mon Sep 17 00:00:00 2001 From: Guilherme Janczak Date: Fri, 6 May 2022 18:42:52 +0000 Subject: [PATCH] remove libbsd libbsd is only used once and as part of a larger, incorrect function. I rewrote the code that used it without the need for it. --- CMakeLists.txt | 41 ++++++----------------------- builds/cmake/platform.hpp.in | 2 -- src/compat.hpp | 51 +++++++++++++++++++++++------------- 8 files changed, 50 insertions(+), 101 deletions(-) --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1484,10 +1484,6 @@ if(BUILD_SHARED) target_link_libraries(libzmq ${NSS3_LIBRARIES}) endif() - if(LIBBSD_FOUND) - target_link_libraries(libzmq ${LIBBSD_LIBRARIES}) - endif() - if(SODIUM_FOUND) target_link_libraries(libzmq ${SODIUM_LIBRARIES}) # On Solaris, libsodium depends on libssp @@ -1534,10 +1530,6 @@ if(BUILD_STATIC) target_include_directories(libzmq-static PRIVATE "${GNUTLS_INCLUDE_DIR}") endif() - if(LIBBSD_FOUND) - target_link_libraries(libzmq-static ${LIBBSD_LIBRARIES}) - endif() - if(NSS3_FOUND) target_link_libraries(libzmq-static ${NSS3_LIBRARIES}) endif() @@ -1607,10 +1599,6 @@ if(BUILD_SHARED) target_include_directories(${perf-tool} PRIVATE "${GNUTLS_INCLUDE_DIR}") endif() - if(LIBBSD_FOUND) - target_link_libraries(${perf-tool} ${LIBBSD_LIBRARIES}) - endif() - if(NSS3_FOUND) target_link_libraries(${perf-tool} ${NSS3_LIBRARIES}) endif() --- a/builds/cmake/platform.hpp.in +++ b/builds/cmake/platform.hpp.in @@ -56,8 +56,6 @@ #cmakedefine ZMQ_HAVE_PTHREAD_SET_AFFINITY #cmakedefine HAVE_ACCEPT4 #cmakedefine HAVE_STRNLEN -#cmakedefine ZMQ_HAVE_STRLCPY -#cmakedefine ZMQ_HAVE_LIBBSD #cmakedefine ZMQ_HAVE_IPC #cmakedefine ZMQ_HAVE_STRUCT_SOCKADDR_UN --- a/src/compat.hpp +++ b/src/compat.hpp @@ -10,26 +10,41 @@ #define strcasecmp _stricmp #define strtok_r strtok_s #else -#ifndef ZMQ_HAVE_STRLCPY -#ifdef ZMQ_HAVE_LIBBSD -#include -#else -static inline size_t -strlcpy (char *dest_, const char *src_, const size_t dest_size_) -{ - size_t remain = dest_size_; - for (; remain && *src_; --remain, ++src_, ++dest_) { - *dest_ = *src_; - } - return dest_size_ - remain; -} -#endif -#endif +/* + * https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/strcpy-s-wcscpy-s-mbscpy-s?view=msvc-170 + */ template -static inline int strcpy_s (char (&dest_)[size], const char *const src_) +static inline int strcpy_s (char (&dst)[size], const char *const src) { - const size_t res = strlcpy (dest_, src_, size); - return res >= size ? ERANGE : 0; + size_t i; + + if (src == NULL) { + /* + * XXX: + * Microsoft's documentation is ambiguous. + * + * How does Microsoft handle size == 0 when src is NULL? + * Do they return ERANGE? + * + * How does Microsoft handle size == 0 when src is non-NULL? + * Do they write a '\0' to *dst anyway? + */ + if (size > 0) + *dst = '\0'; + return (errno = EINVAL); + } + + for (i = 0;; i++) { + if (i >= size) { + if (size > 0) + *dst = '\0'; + return (errno = ERANGE); + } + dst[i] = src[i]; + if (src[i] == '\0') + return 0; + } + /* NOTREACHED */ } #endif