pgsql: Make snprintf.c follow the C99 standard for snprintf's resultva - Mailing list pgsql-committers

From Tom Lane
Subject pgsql: Make snprintf.c follow the C99 standard for snprintf's resultva
Date
Msg-id E1fq3Iu-0004Nv-8Z@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Make snprintf.c follow the C99 standard for snprintf's result value.

C99 says that the result should be the number of bytes that would have
been emitted given a large enough buffer, not the number we actually
were able to put in the buffer.  It's time to make our substitute
implementation comply with that.  Not doing so results in inefficiency
in buffer-enlargement cases, and also poses a portability hazard for
third-party code that might expect C99-compliant snprintf behavior
within Postgres.

In passing, remove useless tests for str == NULL; neither C99 nor
predecessor standards ever allowed that except when count == 0,
so I see no reason to expend cycles on making that a non-crash case
for this implementation.  Also, don't waste a byte in pg_vfprintf's
local I/O buffer; this might have performance benefits by allowing
aligned writes during flushbuffer calls.

Back-patch of commit 805889d7d.  There was some concern about this
possibly breaking code that assumes pre-C99 behavior, but there is
much more risk (and reality, in our own code) of code that assumes
C99 behavior and hence fails to detect buffer overrun without this.

Discussion: https://postgr.es/m/17245.1534289329@sss.pgh.pa.us

Branch
------
REL9_4_STABLE

Details
-------
https://git.postgresql.org/pg/commitdiff/27c4b0899c0e44259b0ab27ced56490c669e329c

Modified Files
--------------
src/port/snprintf.c | 94 +++++++++++++++++++++++++++++++++++------------------
1 file changed, 63 insertions(+), 31 deletions(-)


pgsql-committers by date:

Previous
From: Alvaro Herrera
Date:
Subject: pgsql: Update FSM on WAL replay of page all-visible/frozen
Next
From: Thomas Munro
Date:
Subject: pgsql: Improve comment in GetNewObjectId().