diff -Naurd mpfr-2.4.0-a/PATCHES mpfr-2.4.0-b/PATCHES --- mpfr-2.4.0-a/PATCHES 2009-02-25 13:27:38.000000000 +0000 +++ mpfr-2.4.0-b/PATCHES 2009-02-25 13:42:26.000000000 +0000 @@ -0,0 +1 @@ +mpfr_snprintf diff -Naurd mpfr-2.4.0-a/VERSION mpfr-2.4.0-b/VERSION --- mpfr-2.4.0-a/VERSION 2009-02-20 17:27:44.000000000 +0000 +++ mpfr-2.4.0-b/VERSION 2009-02-25 13:41:31.000000000 +0000 @@ -1 +1 @@ -2.4.0-p1 +2.4.0-p2 diff -Naurd mpfr-2.4.0-a/mpfr.h mpfr-2.4.0-b/mpfr.h --- mpfr-2.4.0-a/mpfr.h 2009-02-20 17:27:44.000000000 +0000 +++ mpfr-2.4.0-b/mpfr.h 2009-02-25 13:41:31.000000000 +0000 @@ -27,7 +27,7 @@ #define MPFR_VERSION_MAJOR 2 #define MPFR_VERSION_MINOR 4 #define MPFR_VERSION_PATCHLEVEL 0 -#define MPFR_VERSION_STRING "2.4.0-p1" +#define MPFR_VERSION_STRING "2.4.0-p2" /* Macros dealing with MPFR VERSION */ #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) diff -Naurd mpfr-2.4.0-a/printf.c mpfr-2.4.0-b/printf.c --- mpfr-2.4.0-a/printf.c 2009-01-26 12:52:01.000000000 +0000 +++ mpfr-2.4.0-b/printf.c 2009-02-25 13:41:22.000000000 +0000 @@ -154,16 +154,16 @@ int ret; size_t min_size; - /* C99 allows SIZE to be null */ - if (size == 0) - return 0; - - MPFR_ASSERTD (buf != NULL); - GET_STR (ret, str, fmt); - min_size = (size_t)ret < size ? (size_t)ret : size - 1; - strncpy (buf, str, min_size); - buf[min_size + 1] = '\0'; + + /* C99 allows SIZE to be zero */ + if (size != 0) + { + MPFR_ASSERTN (buf != NULL); + min_size = (size_t)ret < size ? (size_t)ret : size - 1; + strncpy (buf, str, min_size); + buf[min_size] = '\0'; + } mpfr_free_str (str); return ret; @@ -176,16 +176,17 @@ int ret; int min_size; - /* C99 allows SIZE to be null */ - if (size == 0) - return 0; + GET_STR_VA (ret, str, fmt, ap); - MPFR_ASSERTD (buf != NULL); + /* C99 allows SIZE to be zero */ + if (size != 0) + { + MPFR_ASSERTN (buf != NULL); + min_size = (size_t)ret < size ? (size_t)ret : size - 1; + strncpy (buf, str, min_size); + buf[min_size] = '\0'; + } - GET_STR_VA (ret, str, fmt, ap); - min_size = (size_t)ret < size ? (size_t)ret : size - 1; - strncpy (buf, str, min_size); - buf[min_size + 1] = '\0'; mpfr_free_str (str); return ret; } diff -Naurd mpfr-2.4.0-a/tests/tsprintf.c mpfr-2.4.0-b/tests/tsprintf.c --- mpfr-2.4.0-a/tests/tsprintf.c 2009-01-26 12:52:00.000000000 +0000 +++ mpfr-2.4.0-b/tests/tsprintf.c 2009-02-25 13:41:22.000000000 +0000 @@ -72,21 +72,37 @@ /* test mpfr_snprintf */ p = (int) (randlimb () % n0); - n1 = mpfr_snprintf (buffer, p, fmt, x); - if ((p != 0 && n0 != n1) || (p == 0 && n1 != 0)) + if (p == 0 && (randlimb () & 1) == 0) + { + n1 = mpfr_snprintf (NULL, 0, fmt, x); + } + else + { + buffer[p] = 17; + n1 = mpfr_snprintf (buffer, p, fmt, x); + if (buffer[p] != 17) + { + printf ("Buffer overflow in mpfr_snprintf for p = %d!\n", p); + exit (1); + } + } + if (n0 != n1) { printf ("Error in mpfr_snprintf (s, %d, \"%s\", x) return value\n", p, fmt); printf ("expected: %d\ngot: %d\n", n0, n1); exit (1); } - if (strncmp (expected, buffer, p) != 0) + if ((p > 1 && strncmp (expected, buffer, p-1) != 0) + || (p == 1 && buffer[0] != '\0')) { - printf ("Error in mpfr_snprintf (s, %d, \"%s\", x);\n", p, fmt); - printf ("expected: \"%s\"\ngot: \"%s\"\n", expected, buffer); + char part_expected[p]; + strncpy (part_expected, expected, p); + part_expected[p-1] = '\0'; + printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n", p, fmt); + printf ("expected: \"%s\"\ngot: \"%s\"\n", part_expected, buffer); exit (1); } - return n0; } @@ -116,8 +132,21 @@ /* test mpfr_snprintf */ p = (int) (randlimb () % n0); - n1 = mpfr_vsnprintf (buffer, p, fmt, ap1); - if ((p != 0 && n0 != n1) || (p == 0 && n1 != 0)) + if (p == 0 && (randlimb () & 1) == 0) + { + n1 = mpfr_vsnprintf (NULL, 0, fmt, ap1); + } + else + { + buffer[p] = 17; + n1 = mpfr_vsnprintf (buffer, p, fmt, ap1); + if (buffer[p] != 17) + { + printf ("Buffer overflow in mpfr_vsnprintf for p = %d!\n", p); + exit (1); + } + } + if (n0 != n1) { printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...) return value\n", p, fmt); @@ -126,10 +155,14 @@ va_end (ap1); exit (1); } - if (strncmp (expected, buffer, p) != 0) + if ((p > 1 && strncmp (expected, buffer, p-1) != 0) + || (p == 1 && buffer[0] != '\0')) { + char part_expected[p]; + strncpy (part_expected, expected, p); + part_expected[p-1] = '\0'; printf ("Error in mpfr_vsnprintf (s, %d, \"%s\", ...);\n", p, fmt); - printf ("expected: \"%s\"\ngot: \"%s\"\n", expected, buffer); + printf ("expected: \"%s\"\ngot: \"%s\"\n", part_expected, buffer); va_end (ap1); exit (1); diff -Naurd mpfr-2.4.0-a/version.c mpfr-2.4.0-b/version.c --- mpfr-2.4.0-a/version.c 2009-02-20 17:27:44.000000000 +0000 +++ mpfr-2.4.0-b/version.c 2009-02-25 13:41:31.000000000 +0000 @@ -25,5 +25,5 @@ const char * mpfr_get_version (void) { - return "2.4.0-p1"; + return "2.4.0-p2"; }