summaryrefslogtreecommitdiffstats
path: root/gl/vsnprintf.c
diff options
context:
space:
mode:
authorLorenz Kästle <12514511+RincewindsHat@users.noreply.github.com>2025-12-28 12:50:39 +0100
committerGitHub <noreply@github.com>2025-12-28 12:50:39 +0100
commite7dd07c8025b169b7b43b955066a7200d9cdf244 (patch)
tree6e8c927cfc67f3708b91ac79df07707af26e4929 /gl/vsnprintf.c
parent828a9720b10814c5836d03aa35af05d196c4104b (diff)
parentb0afb8fe0ff1d87165af9df61501197a06240dda (diff)
downloadmonitoring-plugins-e7dd07c8025b169b7b43b955066a7200d9cdf244.tar.gz
Merge pull request #2213 from RincewindsHat/update/gnulib
Sync with Gnulib stable-202507 code (a8ac9f9ce5)
Diffstat (limited to 'gl/vsnprintf.c')
-rw-r--r--gl/vsnprintf.c41
1 files changed, 7 insertions, 34 deletions
diff --git a/gl/vsnprintf.c b/gl/vsnprintf.c
index e6676a1f..d3d7ef7a 100644
--- a/gl/vsnprintf.c
+++ b/gl/vsnprintf.c
@@ -1,6 +1,5 @@
1/* Formatted output to strings. 1/* Formatted output to strings.
2 Copyright (C) 2004, 2006-2024 Free Software Foundation, Inc. 2 Copyright (C) 2004, 2006-2025 Free Software Foundation, Inc.
3 Written by Simon Josefsson and Yoann Vandoorselaere <yoann@prelude-ids.org>.
4 3
5 This file is free software: you can redistribute it and/or modify 4 This file is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as 5 it under the terms of the GNU Lesser General Public License as
@@ -25,46 +24,20 @@
25#include <errno.h> 24#include <errno.h>
26#include <limits.h> 25#include <limits.h>
27#include <stdarg.h> 26#include <stdarg.h>
28#include <stdlib.h> 27#include <stdint.h>
29#include <string.h>
30 28
31#include "vasnprintf.h"
32
33/* Print formatted output to string STR. Similar to vsprintf, but
34 additional length SIZE limit how much is written into STR. Returns
35 string length of formatted string (which may be larger than SIZE).
36 STR may be NULL, in which case nothing will be written. On error,
37 return a negative value. */
38int 29int
39vsnprintf (char *str, size_t size, const char *format, va_list args) 30vsnprintf (char *str, size_t size, const char *format, va_list args)
40{ 31{
41 char *output; 32 ptrdiff_t ret = vsnzprintf (str, size, format, args);
42 size_t len;
43 size_t lenbuf = size;
44
45 output = vasnprintf (str, &lenbuf, format, args);
46 len = lenbuf;
47
48 if (!output)
49 return -1;
50
51 if (output != str)
52 {
53 if (size)
54 {
55 size_t pruned_len = (len < size ? len : size - 1);
56 memcpy (str, output, pruned_len);
57 str[pruned_len] = '\0';
58 }
59
60 free (output);
61 }
62 33
63 if (len > INT_MAX) 34#if PTRDIFF_MAX > INT_MAX
35 if (ret > INT_MAX)
64 { 36 {
65 errno = EOVERFLOW; 37 errno = EOVERFLOW;
66 return -1; 38 return -1;
67 } 39 }
40#endif
68 41
69 return len; 42 return ret;
70} 43}