Merge branch 'sync-gnulib' into 'main'

glib/gnulib/printf.c: Sync with gnulib

See merge request GNOME/glib!4560
This commit is contained in:
Philip Withnall
2025-06-10 13:55:12 +00:00

View File

@@ -23,12 +23,18 @@
*/ */
#include <config.h> #include <config.h>
#include <string.h>
#include <stdlib.h> #include <errno.h>
#include <limits.h> /* for INT_MAX */
#include <stdint.h> /* for uintptr_t, SIZE_MAX */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "printf.h"
#include "g-gnulib.h" #include "g-gnulib.h"
#include "vasnprintf.h" #include "vasnprintf.h"
#include "printf.h"
int _g_gnulib_printf (char const *format, ...) int _g_gnulib_printf (char const *format, ...)
{ {
@@ -98,39 +104,71 @@ int _g_gnulib_vfprintf (FILE *file, char const *format, va_list args)
return rlength; return rlength;
} }
int _g_gnulib_vsprintf (char *string, char const *format, va_list args) int _g_gnulib_vsprintf (char *str, char const *format, va_list args)
{ {
char *result; char *output;
size_t length; size_t len;
size_t lenbuf;
result = vasnprintf (NULL, &length, format, args); /* Set lenbuf = min (SIZE_MAX, - (uintptr_t) str - 1). */
if (result == NULL) lenbuf = SIZE_MAX;
if (lenbuf >= ~ (uintptr_t) str)
lenbuf = ~ (uintptr_t) str;
output = vasnprintf (str, &lenbuf, format, args);
len = lenbuf;
if (!output)
return -1; return -1;
memcpy (string, result, length + 1); if (output != str)
free (result); {
/* len is near SIZE_MAX. */
return length; free (output);
errno = ENOMEM;
return -1;
} }
int _g_gnulib_vsnprintf (char *string, size_t n, char const *format, va_list args) if (len > INT_MAX)
{ {
char *result; errno = EOVERFLOW;
size_t length; return -1;
}
result = vasnprintf (NULL, &length, format, args); return len;
if (result == NULL) }
int _g_gnulib_vsnprintf (char *str, size_t size, char const *format, va_list args)
{
char *output;
size_t len;
size_t lenbuf = size;
output = vasnprintf (str, &lenbuf, format, args);
len = lenbuf;
if (!output)
return -1; return -1;
if (n > 0) if (output != str)
{ {
memcpy (string, result, MIN(length + 1, n)); if (size)
string[n - 1] = 0; {
size_t pruned_len = (len < size ? len : size - 1);
memcpy (str, output, pruned_len);
str[pruned_len] = '\0';
} }
free (result); free (output);
}
return length; if (len > INT_MAX)
{
errno = EOVERFLOW;
return -1;
}
return len;
} }
int _g_gnulib_vasprintf (char **result, char const *format, va_list args) int _g_gnulib_vasprintf (char **result, char const *format, va_list args)