From 5f07fe8cbb9d3696e94bb9c64625e23721c95c4e 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 --- configure.ac | 2 +- lib/isc/include/isc/string.h | 5 +++++ lib/isc/string.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 037b10a0b6..04d400f8de 100644 --- a/configure.ac +++ b/configure.ac @@ -991,7 +991,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]) # # Check for readline support diff --git a/lib/isc/include/isc/string.h b/lib/isc/include/isc/string.h index 5469d69a0e..fbf6129cbe 100644 --- a/lib/isc/include/isc/string.h +++ b/lib/isc/include/isc/string.h @@ -31,6 +31,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 f1ee7748cd..09cf5d636c 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: @@ -109,6 +115,28 @@ 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; + 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--; + } + return ((char *)s); +} +#endif + int isc_string_strerror_r(int errnum, char *buf, size_t buflen) { return (strerror_r(errnum, buf, buflen));