@@ -31,6 +31,7 @@ headers := execinfo.h
routines = \
$(static-only-routines) \
____longjmp_chk \
+ aprintf_chk \
asprintf_chk \
backtrace \
backtracesyms \
@@ -94,6 +95,7 @@ routines = \
strncpy_chk \
swprintf_chk \
ttyname_r_chk \
+ vaprintf_chk \
vasprintf_chk \
vdprintf_chk \
vfprintf_chk \
@@ -143,6 +145,8 @@ CFLAGS-sprintf_chk.c += $(libio-mtsafe)
CFLAGS-snprintf_chk.c += $(libio-mtsafe)
CFLAGS-vsprintf_chk.c += $(libio-mtsafe)
CFLAGS-vsnprintf_chk.c += $(libio-mtsafe)
+CFLAGS-aprintf_chk.c += $(libio-mtsafe)
+CFLAGS-vaprintf_chk.c += $(libio-mtsafe)
CFLAGS-asprintf_chk.c += $(libio-mtsafe)
CFLAGS-vasprintf_chk.c += $(libio-mtsafe)
CFLAGS-obprintf_chk.c += $(libio-mtsafe)
@@ -71,6 +71,9 @@ libc {
GLIBC_2.43 {
__memset_explicit_chk;
}
+ GLIBC_2.44 {
+ __aprintf_chk; __vaprintf_chk;
+ }
GLIBC_PRIVATE {
__fortify_fail;
}
new file mode 100644
@@ -0,0 +1,51 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+
+/* Write formatted output from FORMAT to a string allocated with malloc. */
+char *
+___aprintf_chk (int flag, const char *fmt, ...)
+{
+ /* For flag > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n
+ can only come from read-only format strings. */
+ unsigned int mode = (flag > 0) ? PRINTF_FORTIFY : 0;
+ va_list ap;
+ char *p;
+
+ va_start (ap, fmt);
+ if (__vasprintf_internal (&p, fmt, ap, mode) < 0)
+ p = NULL;
+ va_end (ap);
+
+ return p;
+}
+#if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+/* This is needed since <bits/stdio-lbdl.h> is included in this case, leading to
+ * multiple asm redirection of the same symbol
+ */
+ldbl_hidden_def (___aprintf_chk, __aprintf_chk)
+ldbl_strong_alias (___aprintf_chk, __aprintf_chk)
+#else
+/* On some systems introduction of ldbl_* macros lead to ABI breakage due to the
+ * long_double_symbol aliasing.
+ */
+strong_alias (___aprintf_chk, __aprintf_chk)
+libc_hidden_def (__aprintf_chk)
+#endif
new file mode 100644
@@ -0,0 +1,39 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>.
+
+ As a special exception, if you link the code in this file with
+ files compiled with a GNU compiler to produce an executable,
+ that does not cause the resulting executable to be covered by
+ the GNU Lesser General Public License. This exception does not
+ however invalidate any other reasons why the executable file
+ might be covered by the GNU Lesser General Public License.
+ This exception applies to code released by its copyright holders
+ in files containing the exception. */
+
+#include <libio/libioP.h>
+
+char *
+__vaprintf_chk (int flag, const char *fmt, va_list ap)
+{
+ /* For flag > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n
+ can only come from read-only format strings. */
+ unsigned int mode = (flag > 0) ? PRINTF_FORTIFY : 0;
+ char *p;
+
+ return __vasprintf_internal (&p, fmt, ap, mode) < 0 ? NULL : p;
+}
+libc_hidden_def (__vaprintf_chk)
@@ -77,6 +77,11 @@ extern int __vfprintf_chk (FILE *, int, const char *, __gnuc_va_list);
stdio_hidden_ldbl_proto (__, vfprintf_chk)
extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);
extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);
+extern char *__aprintf_chk (int, const char *, ...)
+ __THROW __attribute_malloc__;
+extern char *__vaprintf_chk (int, const char *, __gnuc_va_list)
+ __THROW __attribute_malloc__;
+stdio_hidden_ldbl_proto (__, vaprintf_chk)
extern int __asprintf_chk (char **, int, const char *, ...) __THROW;
extern int __vasprintf_chk (char **, int, const char *, __gnuc_va_list) __THROW;
stdio_hidden_ldbl_proto (__, vasprintf_chk)
@@ -239,6 +244,7 @@ extern const size_t _sys_errlist_internal_len attribute_hidden;
extern const char *__get_errlist (int) attribute_hidden;
extern const char *__get_errname (int) attribute_hidden;
+libc_hidden_ldbl_proto (__aprintf)
libc_hidden_ldbl_proto (__asprintf)
# if IS_IN (libc)
@@ -317,8 +323,10 @@ rtld_hidden_proto (__libc_fatal)
libc_hidden_proto (__fgets_unlocked_chk)
#if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+libc_hidden_ldbl_proto (__aprintf_chk)
libc_hidden_ldbl_proto (__asprintf_chk)
#else
+libc_hidden_proto (__aprintf_chk)
libc_hidden_proto (__asprintf_chk)
#endif
@@ -43,7 +43,7 @@ routines := \
\
clearerr feof ferror fileno fputc freopen fseek getc getchar \
memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \
- iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello \
+ vaprintf iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello \
freopen64 fseeko64 ftello64 \
\
__fbufsize __freading __fwriting __freadable __fwritable __flbf \
@@ -62,6 +62,7 @@ routines_no_fortify += \
iofgetws_u \
iovdprintf \
swprintf \
+ vaprintf \
vasprintf \
vsnprintf \
vswprintf \
@@ -89,6 +90,7 @@ tests = \
test-fmemopen \
test-fputs-unbuffered-full \
test-fputws-unbuffered-full \
+ tst-aprintf \
tst-asprintf-null \
tst-atime \
tst-bz22415 \
@@ -155,6 +155,9 @@ libc {
# f*
fmemopen;
}
+ GLIBC_2.44 {
+ vaprintf;
+ }
GLIBC_PRIVATE {
# Used by NPTL and librt
__libc_fatal;
@@ -99,6 +99,9 @@ __LDBL_REDIR_DECL (dprintf)
#endif
#ifdef __USE_GNU
+__LDBL_REDIR_DECL (vaprintf)
+__LDBL_REDIR2_DECL (aprintf)
+__LDBL_REDIR_DECL (aprintf)
__LDBL_REDIR_DECL (vasprintf)
__LDBL_REDIR2_DECL (asprintf)
__LDBL_REDIR_DECL (asprintf)
@@ -123,6 +126,8 @@ __LDBL_REDIR2_DECL (dprintf_chk)
__LDBL_REDIR2_DECL (vdprintf_chk)
# endif
# ifdef __USE_GNU
+__LDBL_REDIR2_DECL (aprintf_chk)
+__LDBL_REDIR2_DECL (vaprintf_chk)
__LDBL_REDIR2_DECL (asprintf_chk)
__LDBL_REDIR2_DECL (vasprintf_chk)
__LDBL_REDIR2_DECL (obstack_printf_chk)
@@ -66,6 +66,14 @@ extern int __vdprintf_chk (int __fd, int __flag,
# ifdef __USE_GNU
+extern char *__aprintf_chk (int __flag,
+ const char *__restrict __fmt, ...)
+ __THROW __attribute__ ((__format__ (__printf__, 2, 3)))
+ __attribute_malloc__;
+extern char *__vaprintf_chk (int __flag,
+ const char *__restrict __fmt, __gnuc_va_list __ap)
+ __THROW __attribute__ ((__format__ (__printf__, 2, 0)))
+ __attribute_malloc__;
extern int __asprintf_chk (char **__restrict __ptr, int __flag,
const char *__restrict __fmt, ...)
__THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur;
@@ -200,6 +200,18 @@ vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __ap)
# ifdef __USE_GNU
# ifdef __va_arg_pack
+__fortify_function char *
+__NTH (aprintf (const char *__restrict __fmt, ...))
+{
+ return __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
+}
+
+__fortify_function char *
+__NTH (__aprintf (const char *__restrict __fmt, ...))
+{
+ return __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
+}
+
__fortify_function int
__NTH (asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...))
{
@@ -223,6 +235,26 @@ __NTH (obstack_printf (struct obstack *__restrict __obstack,
__va_arg_pack ());
}
# elif __fortify_use_clang
+__fortify_function char *
+__NTH (aprintf (const char *__restrict __fmt, ...))
+{
+ __gnuc_va_list __fortify_ap;
+ __builtin_va_start (__fortify_ap, __fmt);
+ char * __p = __vaprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __fortify_ap);
+ __builtin_va_end (__fortify_ap);
+ return __p;
+}
+
+__fortify_function char *
+__NTH (__aprintf (const char *__restrict __fmt, ...))
+{
+ __gnuc_va_list __fortify_ap;
+ __builtin_va_start (__fortify_ap, __fmt);
+ char *__p = __vaprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __fortify_ap);
+ __builtin_va_end (__fortify_ap);
+ return __p;
+}
+
__fortify_function_error_function __attribute_overloadable__ int
__NTH (asprintf (__fortify_clang_overload_arg (char **, __restrict, __ptr),
const char *__restrict __fmt, ...))
@@ -260,6 +292,10 @@ __NTH (obstack_printf (__fortify_clang_overload_arg (struct obstack *,
return __r;
}
# elif !defined __cplusplus
+# define aprintf(...) \
+ __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
+# define __aprintf(...) \
+ __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# define asprintf(ptr, ...) \
__asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# define __asprintf(ptr, ...) \
@@ -268,6 +304,12 @@ __NTH (obstack_printf (__fortify_clang_overload_arg (struct obstack *,
__obstack_printf_chk (obstack, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
# endif
+__fortify_function char *
+__NTH (vaprintf (const char *__restrict __fmt, __gnuc_va_list __ap))
+{
+ return __vaprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
+}
+
__fortify_function int
__NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt,
__gnuc_va_list __ap))
@@ -412,6 +412,19 @@ extern int asprintf (char **__restrict __ptr,
__THROWNL __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
#endif
+#ifdef __USE_GNU
+/* Write formatted output to a string dynamically allocated with `malloc'. */
+extern char *vaprintf (const char *__restrict __fmt, __gnuc_va_list __ap)
+ __THROWNL __attribute__ ((__format__ (__printf__, 1, 0)))
+ __attribute_malloc__;
+extern char *__aprintf (const char *__restrict __fmt, ...)
+ __THROWNL __attribute__ ((__format__ (__printf__, 1, 2)))
+ __attribute_malloc__;
+extern char *aprintf (const char *__restrict __fmt, ...)
+ __THROWNL __attribute__ ((__format__ (__printf__, 1, 2)))
+ __attribute_malloc__;
+#endif
+
#ifdef __USE_XOPEN2K8
/* Write formatted output to a file descriptor. */
extern int vdprintf (int __fd, const char *__restrict __fmt,
new file mode 100644
@@ -0,0 +1,57 @@
+/* Test aprintf.
+ Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <support/check.h>
+#include <sys/resource.h>
+
+static int
+do_test (void)
+{
+ char *buf;
+
+ /* Success */
+ buf = aprintf ("foo %d", 42);
+ TEST_COMPARE_STRING (buf, "foo 42");
+ free(buf);
+
+ {
+ /* Avoid -Wformat-overflow warning. */
+ const char *volatile format = "%2000000000d %2000000000d";
+ buf = aprintf (format, 1, 2);
+ TEST_VERIFY (buf == NULL);
+ }
+ if (errno != ENOMEM)
+ TEST_COMPARE (errno, EOVERFLOW);
+
+ /* Force ENOMEM in the test below. */
+ struct rlimit rl;
+ TEST_COMPARE (getrlimit (RLIMIT_AS, &rl), 0);
+ rl.rlim_cur = 10 * 1024 * 1024;
+ TEST_COMPARE (setrlimit (RLIMIT_AS, &rl), 0);
+
+ buf = aprintf ("%20000000d", 1);
+ TEST_VERIFY (buf == NULL);
+ TEST_COMPARE (errno, ENOMEM);
+
+ return 0;
+}
+
+#include <support/test-driver.c>
new file mode 100644
@@ -0,0 +1,39 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>.
+
+ As a special exception, if you link the code in this file with
+ files compiled with a GNU compiler to produce an executable,
+ that does not cause the resulting executable to be covered by
+ the GNU Lesser General Public License. This exception does not
+ however invalidate any other reasons why the executable file
+ might be covered by the GNU Lesser General Public License.
+ This exception applies to code released by its copyright holders
+ in files containing the exception. */
+
+#include <libioP.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+
+char *
+__vaprintf (const char *fmt, va_list ap)
+{
+ char *p;
+
+ return __vasprintf_internal (&p, fmt, ap, 0) < 0 ? NULL : p;
+}
+ldbl_weak_alias (__vaprintf, vaprintf)
@@ -2578,6 +2578,32 @@ other systems offer this function as an async-signal-safe alternative to
The functions in this section do formatted output and place the results
in dynamically allocated memory.
+@deftypefun {char *} aprintf (const char *@var{template}, @dots{})
+@standards{GNU, stdio.h}
+@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
+This function is similar to @code{sprintf},
+except that it dynamically allocates a string
+(as with @code{malloc}; @pxref{Unconstrained Allocation})
+to hold the output,
+instead of putting the output in a buffer you allocate in advance.
+A successful call to @code{aprintf} returns
+a pointer to the newly allocated string.
+
+Here is how to use @code{aprintf}
+to get the same result as the @code{snprintf} example,
+but more easily:
+
+@smallexample
+/* @r{Construct a message describing the value of a variable}
+ @r{whose name is @var{name} and whose value is @var{value}.} */
+char *
+make_message (char *name, char *value)
+@{
+ return aprintf ("value of %s is %s", name, value);
+@}
+@end smallexample
+@end deftypefun
+
@deftypefun int asprintf (char **@var{ptr}, const char *@var{template}, @dots{})
@standards{GNU, stdio.h}
@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
@@ -89,6 +89,7 @@ routines := \
_fitoa_word \
_itoa \
_itowa \
+ aprintf \
asprintf \
ctermid \
cuserid \
@@ -177,6 +178,7 @@ routines := \
# Exclude fortified routines from being built with _FORTIFY_SOURCE
routines_no_fortify += \
+ aprintf \
asprintf \
dprintf \
fprintf \
@@ -70,6 +70,8 @@ libc {
__isoc23_vfscanf;
__isoc23_sscanf;
__isoc23_vsscanf;
+ GLIBC_2.44 {
+ aprintf;
}
GLIBC_PRIVATE {
# global variables
new file mode 100644
@@ -0,0 +1,40 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libioP.h>
+
+/* Write formatted output from FORMAT to a string which is
+ allocated with malloc. */
+/* VARARGS1 */
+char *
+___aprintf (const char *fmt, ...)
+{
+ char *p;
+ va_list ap;
+
+ va_start (ap, fmt);
+ if (__vasprintf_internal (&p, fmt, ap, 0) < 0)
+ p = NULL;
+ va_end (ap);
+
+ return p;
+}
+ldbl_hidden_def (___aprintf, __aprintf)
+
+ldbl_strong_alias (___aprintf, __aprintf)
+ldbl_weak_alias (___aprintf, aprintf)
@@ -5,6 +5,7 @@ ldbl-extra-routines += fwscanf \
swscanf \
swprintf \
wscanf \
+ vaprintf \
vasprintf \
vdprintf \
vscanf \
@@ -40,6 +41,7 @@ endif
ifeq ($(subdir),stdio-common)
ldbl-extra-routines += printf_size \
+ aprintf \
asprintf \
dprintf \
fprintf \
@@ -250,12 +252,14 @@ $(objpfx)test-printf-size-ibm128.out: \
endif
ifeq ($(subdir),debug)
-ldbl-extra-routines += asprintf_chk \
+ldbl-extra-routines += aprintf_chk \
+ asprintf_chk \
dprintf_chk \
fprintf_chk \
printf_chk \
snprintf_chk \
sprintf_chk \
+ vaprintf_chk \
vasprintf_chk \
vdprintf_chk \
vfprintf_chk \
@@ -480,6 +484,7 @@ endif
routines += $(foreach r,$(ldbl-extra-routines),ieee128-$(r))
routines_no_fortify += \
+ ieee128-aprintf \
ieee128-asprintf \
ieee128-dprintf \
ieee128-fprintf \
@@ -490,6 +495,7 @@ routines_no_fortify += \
ieee128-sprintf \
ieee128-swprintf \
ieee128-syslog \
+ ieee128-vaprintf \
ieee128-vasprintf \
ieee128-vdprintf \
ieee128-vfprintf \
new file mode 100644
@@ -0,0 +1,36 @@
+/* Wrapper for aprintf. IEEE128 version.
+ Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern char *
+___ieee128___aprintf (const char *fmt, ...)
+{
+ va_list ap;
+ char *p;
+
+ va_start (ap, fmt);
+ if (__vasprintf_internal (&p, fmt, ap, PRINTF_LDBL_USES_FLOAT128) < 0)
+ p = NULL;
+ va_end (ap);
+
+ return p;
+}
+hidden_def (___ieee128___aprintf)
+strong_alias (___ieee128___aprintf, __aprintfieee128)
new file mode 100644
@@ -0,0 +1,40 @@
+/* Wrapper for __aprintf_chk. IEEE128 version.
+ Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern char *
+___ieee128___aprintf_chk (int flag, const char *fmt, ...)
+{
+ va_list ap;
+ char *p;
+
+ unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
+ if (flag > 0)
+ mode |= PRINTF_FORTIFY;
+
+ va_start (ap, fmt);
+ if (__vasprintf_internal (&p, fmt, ap, mode) < 0)
+ p = NULL;
+ va_end (ap);
+
+ return p;
+}
+hidden_def (___ieee128___aprintf_chk)
+strong_alias (___ieee128___aprintf_chk, __aprintf_chkieee128)
new file mode 100644
@@ -0,0 +1,29 @@
+/* Wrapper for vaprintf. IEEE128 version.
+ Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <libio/libioP.h>
+
+extern char *
+___ieee128_vaprintf (const char *fmt, va_list ap)
+{
+ char *p;
+ if (__vasprintf_internal (&p, fmt, ap, PRINTF_LDBL_USES_FLOAT128) < 0)
+ p = NULL;
+ return p;
+}
+strong_alias (___ieee128_vaprintf, __vaprintfieee128)
new file mode 100644
@@ -0,0 +1,31 @@
+/* Wrapper for __vaprintf_chk. IEEE128 version.
+ Copyright (C) 2026 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <libio/libioP.h>
+
+extern char *
+___ieee128___vaprintf_chk (int flag, const char *fmt, va_list ap)
+{
+ char *p;
+ unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
+ if (flag > 0)
+ mode |= PRINTF_FORTIFY;
+
+ return __vasprintf_internal (&p, fmt, ap, mode) < 0 ? NULL : p;
+}
+strong_alias (___ieee128___vaprintf_chk, __vaprintf_chkieee128)
@@ -15,6 +15,8 @@ libnldbl-calls = \
acos \
acosh \
acospi \
+ aprintf \
+ aprintf_chk \
asin \
asinh \
asinpi \
@@ -223,6 +225,8 @@ libnldbl-calls = \
trunc \
ufromfp \
ufromfpx \
+ vaprintf \
+ vaprintf_chk \
vasprintf \
vasprintf_chk \
vdprintf \
@@ -556,6 +560,7 @@ CFLAGS-tst-nldbl-wscanf-binary-gnu89.c += -mlong-double-64 -std=gnu89 \
endif
routines_no_fortify += \
+ nldbl-aprintf \
nldbl-asprintf \
nldbl-dprintf \
nldbl-fprintf \
@@ -567,6 +572,7 @@ routines_no_fortify += \
nldbl-sprintf \
nldbl-swprintf \
nldbl-syslog \
+ nldbl-vaprintf \
nldbl-vasprintf \
nldbl-vdprintf \
nldbl-vfprintf \
new file mode 100644
@@ -0,0 +1,17 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+char *
+__aprintf (const char *fmt, ...)
+{
+ va_list ap;
+ char *p;
+
+ va_start (ap, fmt);
+ p = __nldbl_vaprintf (fmt, ap);
+ va_end (ap);
+
+ return p;
+}
+extern __typeof (__aprintf) aprintf attribute_hidden;
+weak_alias (__aprintf, aprintf)
new file mode 100644
@@ -0,0 +1,15 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+char *
+__aprintf_chk (int flag, const char *fmt, ...)
+{
+ va_list ap;
+ char *p;
+
+ va_start (ap, fmt);
+ p = __nldbl___vaprintf_chk (flag, fmt, ap);
+ va_end (ap);
+
+ return p;
+}
new file mode 100644
@@ -0,0 +1,9 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+weak_function
+char *
+vaprintf (const char *fmt, va_list ap)
+{
+ return __nldbl_vaprintf (fmt, ap);
+}
new file mode 100644
@@ -0,0 +1,8 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+char *
+__vaprintf_chk (int flag, const char *fmt, va_list ap)
+{
+ return __nldbl___vaprintf_chk (flag, fmt, ap);
+}