diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-05-24 08:01:28 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2017-05-24 08:01:28 +0000 |
commit | 8a0d6c8961f6215033b1a02dd875f3f5264f793b (patch) | |
tree | e53877f05cf1269ab6fd5df6d65bed1445294451 | |
parent | f84cf91e0706c46730716f592ac68fc842aa6ba1 (diff) | |
download | mpfr-8a0d6c8961f6215033b1a02dd875f3f5264f793b.tar.gz |
[src/vasprintf.c] Fixed some parts of overflow tracking.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@11527 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r-- | src/vasprintf.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/vasprintf.c b/src/vasprintf.c index 2c97669e5..ae414a71e 100644 --- a/src/vasprintf.c +++ b/src/vasprintf.c @@ -563,7 +563,10 @@ buffer_incr_len (struct string_buffer *b, size_t len) has newlen < len in case of overflow. */ if (MPFR_UNLIKELY (newlen < len || newlen > MPFR_INTMAX_MAX)) - return 1; + { + b->len = -1; + return 1; + } else { b->len = newlen; @@ -1888,7 +1891,10 @@ sprnt_fp (struct string_buffer *buf, mpfr_srcptr p, length = partition_number (&np, p, spec); if (length < 0) - return -1; + { + buf->len = -1; + return -1; + } if (spec.size == 0) { @@ -2204,7 +2210,7 @@ mpfr_vasnprintf_aux (char **ptr, char *Buf, size_t size, const char *fmt, err = buffer_cat (&buf, s, length); mpfr_free_str (s); if (err) - goto overflow_error; + goto error; } else if (spec.arg_type == MPFR_ARG) /* output a mpfr_t variable */ @@ -2231,7 +2237,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 overflow_error; + goto error; } else /* gmp_printf specification, step forward in the va_list */ @@ -2274,13 +2280,15 @@ mpfr_vasnprintf_aux (char **ptr, char *Buf, size_t size, const char *fmt, written had 'size' be sufficiently large, not counting the terminating null character */ - overflow_error: - MPFR_SAVE_EXPO_UPDATE_FLAGS(expo, MPFR_FLAGS_ERANGE); + error: + if (buf.len == -1) /* overflow */ + { + MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, MPFR_FLAGS_ERANGE); #ifdef EOVERFLOW - errno = EOVERFLOW; + errno = EOVERFLOW; #endif + } - error: MPFR_SAVE_EXPO_FREE (expo); *ptr = NULL; (*__gmp_free_func) (buf.start, buf.size); |