On Tue, Dec 31, 2002 at 11:07:31AM -0500, Ronald Henderson wrote:
> The attached patch cleans up processing return values for most of the
> snprintf and vsnprintf functions in "proto.c".
Checked in.
> Different C runtime libraries
> may produce different results for these functions when the size limit is
> exceeded. The char buffer may not be null terminated ('\0') as a result.
I assume one of the different results is the lack of null termination;
the FreeBSD 3.4 man page says
Snprintf() and vsnprintf() will write at most size-1 of the characters
printed into the output string (the size'th character then gets the ter-
minating `\0');
indicating that the last '\0' is put in even if the string is truncated.
The Red Hat 7.3 man page at
http://www.FreeBSD.org/cgi/man.cgi?query=printf&apropos=0&sektion=3&manpath=Red+Hat+Linux%2Fi386+7.3&format=html
doesn't seem to clearly state whether the '\0' is put in or not. The
Solaris 8 man page at
http://www.FreeBSD.org/cgi/man.cgi?query=snprintf&apropos=0&sektion=0&manpath=SunOS+5.8&format=html
does, however, say it's put in:
The snprintf() function is identical to sprintf() with the
addition of the argument n, which specifies the size of
the buffer referred to by s. The buffer is always termi-
nated with the null byte.
It's harmless (other than wasting a few cycles, which probably won't be
noticed) to put the '\0' in there if it's already there, though, so we
might as well do it unless we're *absolutely certain* that *all*
versions of "snprintf()"/"vsnprintf()" that would *ever* be used with
Ethereal put it in.