Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: src/sys/dev/pci



In article <Pine.NEB.4.64.1610260555490.23300%speedy.whooppee.com@localhost>,
Paul Goyette  <paul%whooppee.com@localhost> wrote:
>On Wed, 26 Oct 2016, matthew green wrote:
>
>> i think you're right that the 'cp' manipulation is the problem.
>> snprintf() will return the "desired" size, so upon the first
>> attempted overflow the 'cp' is moved beyond 'ep', and then the
>> next snprintf() gets a negative aka extremely massive value
>> for the buffer length and actual overflow happens here, and ssp
>> detects it.
>>
>> the fix would be to change this:
>>
>> 	cp += snprintf(cp, ep - cp, ...);
>>
>> into this:
>>
>> 	len = snprintf(cp, ep - cp, ...);
>> 	if (len > ep - cp)
>> 		return;
>> 	cp += len;
>>
>> which is annoying because there are a lot of the former.
>
>There's only 9 snprintf() calls.  I could simply provide a macro:
>
>#define ADD_TEXT(dest, end, format, ...)			\
> 	{							\
> 		int len, max = (end) - (dest);			\
>
> 		len = snprintf((dest), max, (format), __VA_ARGS__); \
> 		if (len > max)					\
> 			return;					\
> 		(dest) += len;					\
> 	}
>
>
>Then all of the snprintf() calls become simply
>
> 	ADD_TEXT(cp, ep, <format>, ...);
>
>(Of course, after last use I'd add a #undef ADD_TEXT to clean up...)

Do you really want to stop from attaching the driver because you could
not print it's name? I think that perhaps a variant that returns the
number of characters appended would be more useful. like
if (len >= max)
	dest = end;
else
	dest += len;
	
but, I would leave the whole thing alone instead :-)
or write a function that appends and moves the pointer, like

snappendprintf(char **dest, const char *end, fmt, ...) 

christos



Home | Main Index | Thread Index | Old Index