The implementation of strjoin is a bit suboptimal. The destination string is traversed from the beginning due to strcat and we have a left-over separator at the end, while it should only be in-between. Fix this. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- include/string.h | 1 + lib/string.c | 15 +++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/include/string.h b/include/string.h index 2cc727fd1d7a..596440ca8164 100644 --- a/include/string.h +++ b/include/string.h @@ -4,6 +4,7 @@ #include <linux/string.h> +void *mempcpy(void *dest, const void *src, size_t count); int strtobool(const char *str, int *val); char *strsep_unescaped(char **, const char *); char *stpcpy(char *dest, const char *src); diff --git a/lib/string.c b/lib/string.c index a500e8a3d1ba..edd36da4d4f2 100644 --- a/lib/string.c +++ b/lib/string.c @@ -603,6 +603,11 @@ void *__memcpy(void * dest, const void *src, size_t count) __alias(__default_memcpy); #endif +void *mempcpy(void *dest, const void *src, size_t count) +{ + return memcpy(dest, src, count) + count; +} +EXPORT_SYMBOL(mempcpy); #ifndef __HAVE_ARCH_MEMMOVE /** @@ -943,7 +948,7 @@ char *strjoin(const char *separator, char **arr, size_t arrlen) { size_t separatorlen; int len = 1; /* '\0' */ - char *buf; + char *buf, *p; int i; separatorlen = strlen(separator); @@ -951,12 +956,14 @@ char *strjoin(const char *separator, char **arr, size_t arrlen) for (i = 0; i < arrlen; i++) len += strlen(arr[i]) + separatorlen; - buf = xzalloc(len); + p = buf = xmalloc(len); for (i = 0; i < arrlen; i++) { - strcat(buf, arr[i]); - strcat(buf, separator); + p = stpcpy(p, arr[i]); + p = mempcpy(p, separator, separatorlen); } + p[-separatorlen] = '\0'; + return buf; } -- 2.30.2