gmp_snprintf tries to allocate 18 EB on long strings
Marco Bodrato
bodrato at mail.dm.unipi.it
Sat Feb 3 06:25:16 UTC 2018
Ciao,
Il Gio, 1 Febbraio 2018 11:32 am, Niels Möller ha scritto:
> I think we should be able to rely on C99 vsnprintf. If need, check for
> correct behavior in configure, and fall back to repl_vsnprintf if
I'd try to reject the return value -1 in configure, where a short string
is tested. Then I'd consider the return value -1 as an unrecoverable error
in snprntffuns.c , avoiding repeated calls in this case.
This should heal the issue spotted by Vincent, on systems with a working
vsnprintf. Onthe other side, I'm not sure repl_vsnprintf can really handle
that extremal cases.
A proposed patch:
-------8<------
diff -r df4f222d213c acinclude.m4
--- a/acinclude.m4 Fri Feb 02 17:00:53 2018 +0100
+++ b/acinclude.m4 Fri Feb 02 17:04:47 2018 +0100
@@ -3729,11 +3729,11 @@
ret = vsnprintf (buf, 4, fmt, ap);
- if (strcmp (buf, "hel") != 0)
+ if (ret == -1 || strcmp (buf, "hel") != 0)
return 1;
/* allowed return values */
- if (ret != -1 && ret != 3 && ret != 11)
+ if (ret != 3 && ret != 11)
return 2;
return 0;
diff -r df4f222d213c printf/snprntffuns.c
--- a/printf/snprntffuns.c Fri Feb 02 17:00:53 2018 +0100
+++ b/printf/snprntffuns.c Fri Feb 02 17:04:47 2018 +0100
@@ -75,10 +75,7 @@
va_copy (ap, orig_ap);
ret = vsnprintf (d->buf, avail, fmt, ap);
if (ret == -1)
- {
- ASSERT (strlen (d->buf) == avail-1);
- ret = avail-1;
- }
+ return ret;
step = MIN (ret, avail-1);
d->size -= step;
@@ -104,7 +101,7 @@
ret = vsnprintf (p, alloc, fmt, ap);
__GMP_FREE_FUNC_TYPE (p, alloc, char);
}
- while (ret == alloc-1 || ret == -1);
+ while (ret == alloc-1);
return ret;
}
-------8<------
Ĝis,
m
--
http://bodrato.it/papers/
More information about the gmp-devel
mailing list