summaryrefslogtreecommitdiff
path: root/lib/vasnprintf.c
diff options
context:
space:
mode:
authorBruno Haible <bruno@clisp.org>2018-09-23 14:13:52 +0200
committerBruno Haible <bruno@clisp.org>2018-09-23 14:15:03 +0200
commit278b4175c9d7dd47c1a3071554aac02add3b3c35 (patch)
tree7bf2ed8b084f6fecbd1c78e946ece9d7211e233b /lib/vasnprintf.c
parent9e43f06a96907348ac6729dcddf8fddc08469ab3 (diff)
downloadgnulib-278b4175c9d7dd47c1a3071554aac02add3b3c35.tar.gz
vasnprintf: Fix heap memory overrun bug.
Reported by Ben Pfaff <blp@cs.stanford.edu> in <https://lists.gnu.org/archive/html/bug-gnulib/2018-09/msg00107.html>. * lib/vasnprintf.c (convert_to_decimal): Allocate one more byte of memory. * tests/test-vasnprintf.c (test_function): Add another test.
Diffstat (limited to 'lib/vasnprintf.c')
-rw-r--r--lib/vasnprintf.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c
index 56ffbe308a..30d021b284 100644
--- a/lib/vasnprintf.c
+++ b/lib/vasnprintf.c
@@ -860,7 +860,9 @@ convert_to_decimal (mpn_t a, size_t extra_zeroes)
size_t a_len = a.nlimbs;
/* 0.03345 is slightly larger than log(2)/(9*log(10)). */
size_t c_len = 9 * ((size_t)(a_len * (GMP_LIMB_BITS * 0.03345f)) + 1);
- char *c_ptr = (char *) malloc (xsum (c_len, extra_zeroes));
+ /* We need extra_zeroes bytes for zeroes, followed by c_len bytes for the
+ digits of a, followed by 1 byte for the terminating NUL. */
+ char *c_ptr = (char *) malloc (xsum (xsum (extra_zeroes, c_len), 1));
if (c_ptr != NULL)
{
char *d_ptr = c_ptr;