From dd642ea2a8f5113023a0d686644383c819add5d2 Mon Sep 17 00:00:00 2001 From: Frank Richter Date: Sun, 19 Dec 2021 15:10:36 +0100 Subject: [PATCH] Replace mi_strlcpy() and mi_strlcat() with versions written from scratch They used strncpy() and strncat(), which behave almost, but not quite like the ...l... functions. Since these functions are not standard, and not all OSes have comparable functions available, just add a implementations. Addresses first issue raised in microsoft/mimalloc#502. --- src/options.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/options.c b/src/options.c index 43f8fb4b..259ba7f9 100644 --- a/src/options.c +++ b/src/options.c @@ -400,14 +400,27 @@ void _mi_error_message(int err, const char* fmt, ...) { // -------------------------------------------------------- static void mi_strlcpy(char* dest, const char* src, size_t dest_size) { - dest[0] = 0; - strncpy(dest, src, dest_size - 1); - dest[dest_size - 1] = 0; + if (dest_size == 0) + return; + + // Copy until end of 'src' or dest is (almost) full + while (*src && (dest_size > 1)) { + *dest++ = *src++; + --dest_size; + } + // Null-terminate dest + *dest = 0; } static void mi_strlcat(char* dest, const char* src, size_t dest_size) { - strncat(dest, src, dest_size - 1); - dest[dest_size - 1] = 0; + // Skip existing data in 'dest' + while (*dest && (dest_size > 1)) { + ++dest; + --dest_size; + } + + // Concatenate src + mi_strlcpy(dest, src, dest_size); } #ifdef MI_NO_GETENV