summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-05-24 08:30:55 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2017-05-24 08:30:55 +0000
commit6d09b01b9b23c950aa9068da7e673763747dae36 (patch)
tree93ec4edd298b521e26375b81db54e68ad607327f
parent8f017a3993ea925b8db1e13e858cf3106a6bda48 (diff)
downloadmpfr-6d09b01b9b23c950aa9068da7e673763747dae36.tar.gz
[src/vasprintf.c] In case of overflow, do not stop before everything has
been processed, allowing the %...n arguments to be filled, as decided. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@11529 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--src/vasprintf.c32
1 files changed, 9 insertions, 23 deletions
diff --git a/src/vasprintf.c b/src/vasprintf.c
index ae414a71e..4515785d0 100644
--- a/src/vasprintf.c
+++ b/src/vasprintf.c
@@ -505,16 +505,21 @@ typedef wint_t mpfr_va_wint;
/* previous specifiers are understood by gmp_printf */ \
{ \
MPFR_TMP_DECL (marker); \
- char *fmt_copy; \
+ char *fmt_copy, *s; \
+ int length; \
+ \
MPFR_TMP_MARK (marker); \
fmt_copy = (char*) MPFR_TMP_ALLOC (n + 1); \
strncpy (fmt_copy, (start), n); \
fmt_copy[n] = '\0'; \
- if (sprntf_gmp ((buf_ptr), (fmt_copy), (ap)) == -1) \
+ length = gmp_vasprintf (&s, fmt_copy, (ap)); \
+ if (length < 0) \
{ \
MPFR_TMP_FREE (marker); \
goto error; \
} \
+ buffer_cat ((buf_ptr), s, length); \
+ mpfr_free_str (s); \
(flag) = 0; \
MPFR_TMP_FREE (marker); \
} \
@@ -744,21 +749,6 @@ buffer_sandwich (struct string_buffer *b, char *str, size_t len,
}
}
-/* let gmp_xprintf process the part it can understand */
-static int
-sprntf_gmp (struct string_buffer *b, const char *fmt, va_list ap)
-{
- int length;
- char *s;
-
- length = gmp_vasprintf (&s, fmt, ap);
- if (length > 0 && buffer_cat (b, s, length))
- length = -1; /* overflow in buffer_cat */
-
- mpfr_free_str (s);
- return length;
-}
-
/* Helper struct and functions for temporary strings management */
/* struct for easy string clearing */
struct string_list
@@ -2187,7 +2177,6 @@ mpfr_vasnprintf_aux (char **ptr, char *Buf, size_t size, const char *fmt,
char format[MPFR_PREC_FORMAT_SIZE + 6]; /* see examples below */
size_t length;
mpfr_prec_t prec;
- int err;
prec = va_arg (ap, mpfr_prec_t);
@@ -2207,10 +2196,8 @@ mpfr_vasnprintf_aux (char **ptr, char *Buf, size_t size, const char *fmt,
format[5 + MPFR_PREC_FORMAT_SIZE] = '\0';
length = gmp_asprintf (&s, format, spec.width, spec.prec, prec);
MPFR_ASSERTN (length >= 0); /* guaranteed by GMP 6 */
- err = buffer_cat (&buf, s, length);
+ buffer_cat (&buf, s, length);
mpfr_free_str (s);
- if (err)
- goto error;
}
else if (spec.arg_type == MPFR_ARG)
/* output a mpfr_t variable */
@@ -2236,8 +2223,7 @@ mpfr_vasnprintf_aux (char **ptr, char *Buf, size_t size, const char *fmt,
if (ptr == NULL)
spec.size = size;
- if (sprnt_fp (&buf, p, spec) < 0)
- goto error;
+ sprnt_fp (&buf, p, spec);
}
else
/* gmp_printf specification, step forward in the va_list */