From 9bb5157adfb85d3611ca34d41fe7c3b37ed0e4e7 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 15 Sep 2022 17:03:50 +1000 Subject: [PATCH] Use strnstr implementation from FreeBSD if not provided by OS (cherry picked from commit 5f07fe8cbb9d3696e94bb9c64625e23721c95c4e) --- config.h.in | 3 +++ configure | 2 +- configure.ac | 2 +- lib/isc/include/isc/string.h | 5 +++++ lib/isc/string.c | 30 ++++++++++++++++++++++++++++++ lib/isc/win32/libisc.def.in | 1 + 6 files changed, 41 insertions(+), 2 deletions(-) diff --git a/config.h.in b/config.h.in index 945e12318b..7806015d24 100644 --- a/config.h.in +++ b/config.h.in @@ -429,6 +429,9 @@ /* Define to 1 if you have the `strlcpy' function. */ #undef HAVE_STRLCPY +/* Define to 1 if you have the `strnstr' function. */ +#undef HAVE_STRNSTR + /* Define to 1 if you have the `sysconf' function. */ #undef HAVE_SYSCONF diff --git a/configure b/configure index b1491f6c0c..9113596b8f 100755 --- a/configure +++ b/configure @@ -19633,7 +19633,7 @@ fi # # Check for some other useful functions that are not ever-present. # -for ac_func in strlcpy strlcat +for ac_func in strlcpy strlcat strnstr do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" diff --git a/configure.ac b/configure.ac index 21b087adbf..eaad0097ec 100644 --- a/configure.ac +++ b/configure.ac @@ -1701,7 +1701,7 @@ AS_IF([test "$enable_tcp_fastopen" = "yes"], # # Check for some other useful functions that are not ever-present. # -AC_CHECK_FUNCS([strlcpy strlcat]) +AC_CHECK_FUNCS([strlcpy strlcat strnstr]) AC_SUBST(READLINE_LIB) diff --git a/lib/isc/include/isc/string.h b/lib/isc/include/isc/string.h index 2d7f8df949..1bc5693091 100644 --- a/lib/isc/include/isc/string.h +++ b/lib/isc/include/isc/string.h @@ -32,6 +32,11 @@ size_t strlcat(char *dst, const char *src, size_t size); #endif /* if !defined(HAVE_STRLCAT) */ +#if !defined(HAVE_STRNSTR) +char * +strnstr(const char *s, const char *find, size_t slen); +#endif /* if !defined(HAVE_STRNSTR) */ + int isc_string_strerror_r(int errnum, char *buf, size_t buflen); diff --git a/lib/isc/string.c b/lib/isc/string.c index d307758a23..5de6d88b27 100644 --- a/lib/isc/string.c +++ b/lib/isc/string.c @@ -12,9 +12,15 @@ */ /* + * SPDX-License-Identifier: BSD-3-Clause + * + * Copyright (c) 2001 Mike Barcroft * Copyright (c) 1990, 1993 * The Regents of the University of California. All rights reserved. * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: @@ -48,6 +54,7 @@ #include #include /* IWYU pragma: keep */ +#include #if !defined(HAVE_STRLCPY) size_t @@ -109,6 +116,29 @@ strlcat(char *dst, const char *src, size_t size) { } #endif /* !defined(HAVE_STRLCAT) */ +#if !defined(HAVE_STRNSTR) +char * +strnstr(const char *s, const char *find, size_t slen) { + char c, sc, *r; + size_t len; + + if ((c = *find++) != '\0') { + len = strlen(find); + do { + do { + if (slen-- < 1 || (sc = *s++) == '\0') + return (NULL); + } while (sc != c); + if (len > slen) + return (NULL); + } while (strncmp(s, find, len) != 0); + s--; + } + DE_CONST(s, r); + return (r); +} +#endif + int isc_string_strerror_r(int errnum, char *buf, size_t buflen) { #if defined(_WIN32) || defined(_WIN64) diff --git a/lib/isc/win32/libisc.def.in b/lib/isc/win32/libisc.def.in index 56358f3c64..a98ae707c6 100644 --- a/lib/isc/win32/libisc.def.in +++ b/lib/isc/win32/libisc.def.in @@ -778,6 +778,7 @@ pkcs_C_VerifyUpdate @END PKCS11 strlcat strlcpy +strnstr syslog @IF NOLONGER