]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
lib/string.c: implement strdup() and strndup() in terms of memdup_nul()
authorRasmus Villemoes <ravi@prevas.dk>
Tue, 21 Apr 2026 07:54:35 +0000 (09:54 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 12 May 2026 21:38:00 +0000 (15:38 -0600)
With the addition of memdup_nul(), strdup() and strndup() can be
implemented as one-liners.

While not required by POSIX or C, do keep the behaviour of gracefully
accepting a NULL source and simply return NULL.

Reviewed-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Rasmus Villemoes <ravi@prevas.dk>
lib/string.c

index 3923cce5561a1fec612abbde0d351e7adc7d10fb..5ccd1011ab57f29f903d9f498556955581ebdf74 100644 (file)
@@ -360,38 +360,12 @@ void *memdup_nul(const void *src, size_t len)
 
 char * strdup(const char *s)
 {
-       char *new;
-
-       if ((s == NULL) ||
-           ((new = malloc (strlen(s) + 1)) == NULL) ) {
-               return NULL;
-       }
-
-       strcpy (new, s);
-       return new;
+       return s ? memdup_nul(s, strlen(s)) : NULL;
 }
 
 char * strndup(const char *s, size_t n)
 {
-       size_t len;
-       char *new;
-
-       if (s == NULL)
-               return NULL;
-
-       len = strlen(s);
-
-       if (n < len)
-               len = n;
-
-       new = malloc(len + 1);
-       if (new == NULL)
-               return NULL;
-
-       strncpy(new, s, len);
-       new[len] = '\0';
-
-       return new;
+       return s ? memdup_nul(s, strnlen(s, n)) : NULL;
 }
 
 #ifndef __HAVE_ARCH_STRSPN