assertion failure in snprntffuns.c:79 for i686-w64-mingw32

Marco Bodrato bodrato at mail.dm.unipi.it
Mon Jan 13 08:54:32 UTC 2020


Il 2020-01-10 17:04 Vincent Lefevre ha scritto:
> BTW, I still notice in printf/vasprintf.c:
> 
>       ret = vsnprintf (d->buf + d->size, space, fmt, ap);
>       if (ret == -1)
>         {
>           ASSERT (strlen (d->buf + d->size) == space-1);
>           ret = space-1;
>         }

I believe that also here GMP should assume that a return value -1 means 
an unrecoverable error, and should return.

That's why I propose also here a small patch, similar to the one applied 
to printf/snprntffuns.c:

diff -r f66635cf2968 printf/vasprintf.c
--- a/printf/vasprintf.c	Fri Jan 10 15:13:59 2020 +0100
+++ b/printf/vasprintf.c	Mon Jan 13 09:38:16 2020 +0100
@@ -81,10 +81,7 @@
        va_copy (ap, orig_ap);
        ret = vsnprintf (d->buf + d->size, space, fmt, ap);
        if (ret == -1)
-        {
-          ASSERT (strlen (d->buf + d->size) == space-1);
-          ret = space-1;
-        }
+	return ret;

        /* done if output fits in our space */
        if (ret < space-1)


Also here, there is a comment that says "glibc 2.0.x vsnprintf returns 
either -1 or size-1 for an overflow,[...] It's necessary to re-run to 
determine that size." and the case ret == size -1 is still handled as a 
special case.

But here the size is doubled twice. Here in the code by the lines:
       if (ret == space-1)
         space *= 2;     /* possible glibc 2.0.x, so double */
and again in the GMP_ASPRINTF_T_NEED macro, containing:
      newalloc = 2*newsize;

And I fear that size overflows are not detected in any way...

Ĝis,
m


More information about the gmp-devel mailing list