Debian patches that really belong to upstream

ellie timoney ellie at fastmail.com
Sun Sep 27 22:35:03 EDT 2015


On Mon, Sep 28, 2015, at 10:30 AM, ellie timoney wrote:
> > AFAIK snprintf() doesn't write the final \0 in the case the string would
> > overflow the buffer, so with size 6 you might end with "foobar" instead
> > of "fooba\0". I think this was the problem the patch was trying to
> > remedy. But perhaps it's not an issue anyway.
> 
> I sat down and tested this, and you're correct: it won't zero-terminate
> if it runs out of space to do so, so we need to do so ourselves.
>
> I've fixed this now (ff4e6c7), and also fixed the function immediately
> above it that had the same problems :P

Would you believe I just had another look at my own test code... and it
had a bug in it (doh!)

So snprintf() is actually working the way I first thought it worked, and
the way the documentation implies that it works: (using your example) it
correctly produces "fooba\0" for "foobar", length 6.

So there's no documentation bug here, and the fix was unnecessary -- at
least on Debian.  I'll leave it in place though, in case some other
platform (or older libc, etc) exhibits the behaviour you originally
expected.
 
> The man page for snprintf on Debian is a bit vague/misleading about
> this.  Reading it, I was under the impression that it would always
> zero-terminate, even if that would lead to truncation.  It talks a bit
> about detecting truncation, but doesn't mention that it doesn't always
> zero-terminate (and, to my eyes, sort of implies that it actually does):
> 
> > DESCRIPTION:
> >        The  functions  snprintf()  and vsnprintf() write at most size bytes (including the terminating null
> >        byte ('\0')) to str.
> > 
> > Return value:
> >        The  functions snprintf() and vsnprintf() do not write more than size bytes (including the terminat‐
> >        ing null byte ('\0')).  If the output was truncated due to this limit, then the return value is  the
> >        number  of  characters  (excluding  the  terminating null byte) which would have been written to the
> >        final string if enough space had been available.  Thus, a return value of size or  more  means  that
> >        the output was truncated.  (See also below under NOTES.)
> > 
> > NOTES:
> >        (talks about overlapping src/dest buffers and return values)
> > 
> > BUGS:
> >        (talks about snprintf and vsnprintf as solutions to overflow problems, but doesn't mention they have their own)
> 
> The man page for strncpy, which exhibits the same behaviour, talks at
> length about the need to ensure zero termination yourself.  Not sure if
> this is an snprintf bug or a documentation bug (or both) ...



More information about the Cyrus-devel mailing list