The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=a98e5d78500193dc7aa352e1f60ac2c6529e2c38

commit a98e5d78500193dc7aa352e1f60ac2c6529e2c38
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2025-12-03 23:56:26 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2025-12-08 22:34:57 +0000

    libc/string: add strdupa(3) and strndupa(3)
    
    Reviewed by:    markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D54066
---
 include/string.h             | 28 ++++++++++++++++++++++++++++
 lib/libc/string/Makefile.inc |  4 +++-
 lib/libc/string/strdup.3     | 34 +++++++++++++++++++++++++++++++++-
 3 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/include/string.h b/include/string.h
index a3fa96ebb449..e9aa1b55281a 100644
--- a/include/string.h
+++ b/include/string.h
@@ -154,6 +154,34 @@ void        swab(const void * __restrict, void * 
__restrict, ssize_t);
 
 int     timingsafe_bcmp(const void *, const void *, size_t);
 int     timingsafe_memcmp(const void *, const void *, size_t);
+
+#if __has_builtin(__builtin_alloca)
+#define        strdupa(_Str) (__extension__({                          \
+       const char *_Str1;                                      \
+       size_t _Len;                                            \
+       char *_Copy;                                            \
+                                                               \
+       _Str1 = (_Str);                                         \
+       _Len = strlen(_Str1) + 1;                               \
+       _Copy = (char *)__builtin_alloca(_Len);                 \
+       memcpy(_Copy, _Str1, _Len);                             \
+       _Copy;                                                  \
+}))
+
+#define        strndupa(_Str, _Maxlen) (__extension__({                \
+       const char *_Str1;                                      \
+       char *_Copy;                                            \
+       size_t _Len;                                            \
+                                                               \
+       _Str1 = (_Str);                                         \
+       _Len = strnlen((_Str1), (_Maxlen));                     \
+       _Copy = __builtin_alloca(_Len + 1);                     \
+       (void)memcpy(_Copy, _Str1, _Len);                       \
+       _Copy[_Len] = '\0';                                     \
+       _Copy;                                                  \
+}))
+#endif
+
 #endif /* __BSD_VISIBLE */
 
 #if __POSIX_VISIBLE >= 200112 || defined(_XLOCALE_H_)
diff --git a/lib/libc/string/Makefile.inc b/lib/libc/string/Makefile.inc
index 13cff22b9a32..dfe4b4b55bec 100644
--- a/lib/libc/string/Makefile.inc
+++ b/lib/libc/string/Makefile.inc
@@ -174,7 +174,9 @@ MLINKS+=strcoll.3 strcoll_l.3
 MLINKS+=strcpy.3 stpcpy.3 \
        strcpy.3 stpncpy.3 \
        strcpy.3 strncpy.3
-MLINKS+=strdup.3 strndup.3
+MLINKS+=strdup.3 strndup.3 \
+       strdup.3 strdupa.3 \
+       strdup.3 strndupa.3
 MLINKS+=strerror.3 perror.3 \
        strerror.3 strerror_l.3 \
        strerror.3 strerror_r.3 \
diff --git a/lib/libc/string/strdup.3 b/lib/libc/string/strdup.3
index 576fa122b8d6..5968289f5002 100644
--- a/lib/libc/string/strdup.3
+++ b/lib/libc/string/strdup.3
@@ -30,7 +30,9 @@
 .Os
 .Sh NAME
 .Nm strdup ,
-.Nm strndup
+.Nm strdupa ,
+.Nm strndup ,
+.Nm strndupa
 .Nd save a copy of a string
 .Sh LIBRARY
 .Lb libc
@@ -39,7 +41,11 @@
 .Ft char *
 .Fn strdup "const char *str"
 .Ft char *
+.Fn strdupa "const char *str"
+.Ft char *
 .Fn strndup "const char *str" "size_t len"
+.Ft char *
+.Fn strndupa "const char *str" "size_t len"
 .Sh DESCRIPTION
 The
 .Fn strdup
@@ -63,6 +69,19 @@ characters from the string
 always
 .Dv NUL
 terminating the copied string.
+.Pp
+The
+.Fn strdupa
+function is identical to
+.Fn strdup
+but allocates the memory with
+.Xr alloca 3 .
+Similarly, the
+.Fn strndupa
+function is identical to
+.Fn strndup ,
+but allocates the memory with
+.Xr alloca 3 .
 .Sh RETURN VALUES
 If insufficient memory is available, NULL is returned and
 .Va errno
@@ -72,6 +91,7 @@ Otherwise, the
 .Fn strdup
 family of functions return a pointer to the copied string.
 .Sh SEE ALSO
+.Xr alloca 3 ,
 .Xr free 3 ,
 .Xr malloc 3 ,
 .Xr wcsdup 3
@@ -84,6 +104,12 @@ The
 .Fn strndup
 function is specified by
 .St -p1003.1-2008 .
+The
+.Fn strdupa
+and
+.Fn strndupa
+functions are extensions,
+taken from glibc.
 .Sh HISTORY
 The
 .Fn strdup
@@ -93,3 +119,9 @@ The
 .Fn strndup
 function was added in
 .Fx 7.2 .
+The
+.Fn strdupa
+and
+.Fn strndupa
+functions were added in
+.Fx 15.1 .

Reply via email to