When printing near the end of the buffer, there was an overflow in two cases:
(1) %c and size is zero
(2) %1N, %1I, %1I4, %1I6 (auto-fill field_width for Net or IP), size is
more than actual length of the net/ip but less than the auto-filled
field width.
Manual code examination showed that nothing could have ever triggered
this behavior. All older versions of BIRD, including BIRD 3 development
versions, are totally safe. This exact overflow has been found while
implementing a new feature in later commits.
int qualifier; /* 'h' or 'l' for integer fields */
for (start=str=buf ; *fmt ; ++fmt, size-=(str-start), start=str) {
+ if (!size)
+ return -1;
if (*fmt != '%') {
- if (!size)
- return -1;
*str++ = *fmt;
continue;
}
len = strlen(s);
if (precision >= 0 && len > precision)
len = precision;
- if (len > size)
+ if ((len > size) || (field_width > size))
return -1;
if (!(flags & LEFT))