Hi,

On 17/01/18 15:42, Jaromír Mikeš wrote:
> ​Hi,
> 
> giada unfortunately fail to build on some archs ... I already informed
> upstream but not answer yet.
> Can someone look if fixing this is rather trivial or complicated.
> 
> https://buildd.debian.org/status/package.php?p=giada

The entire function for reference:
> std::string gu_format(const char* format, ...)
> {
>       va_list args;
> 
>       /* Compute the size of the new expanded string (i.e. with replacement 
> taken
>       into account). */
> 
>       size_t size = vsnprintf(nullptr, 0, format, args);
> 
>       /* Create a new temporary char array to hold the new expanded string. */
> 
>       std::unique_ptr<char[]> tmp(new char[size]);
> 
>       /* Fill the temporary string with the formatted data. */
> 
>   va_start(args, format);
>       vsprintf(tmp.get(), format, args);
>   va_end(args);
>   
>       return string(tmp.get(), tmp.get() + size - 1); 
> }

This line (the one the error complains about) reads the uninitialized
args and invokes undefined behavior:
> size_t size = vsnprintf(nullptr, 0, format, args);

It needs to be surrounded in va_start, va_end block.

The second subtle error is that vsnprintf returns the size _excluding
the null byte_. This will cause the vsprintf call to overflow the buffer
by 1 byte.

This might work (untested):
 va_start(args, format);
 size_t size = vsnprintf(nullptr, 0, format, args) + 1;
 va_end(args);

Some alternative implementations. The varardic template solution (the
third one) is similar to this code (and the one I like the most):
https://stackoverflow.com/questions/2342162/stdstring-formatting-like-sprintf

James

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
pkg-multimedia-maintainers mailing list
pkg-multimedia-maintainers@lists.alioth.debian.org
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-multimedia-maintainers

Reply via email to