|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] Convert hvmloader sprintf() into snprintf()
On 29/11/11 14:12, Paul Durrant wrote:
>> -----Original Message-----
>> From: David Vrabel
>> Sent: 29 November 2011 13:57
>> To: Paul Durrant
>> Cc: xen-devel@xxxxxxxxxxxxxxxxxxx
>> Subject: Re: [Xen-devel] [PATCH] Convert hvmloader sprintf() into
>> snprintf()
>>
> [snip]
>>> +static void __copy(void *arg, char c)
>>> {
>>> - **buf = c;
>>> - (*buf)++;
>>> + struct __copy_context *ctxt = arg;
>>> +
>>> + ctxt->emitted++;
>>> +
>>> + if (ctxt->remaining == 0)
>>> + return;
>>> +
>>> + *(ctxt->ptr++) = c;
>>> + --ctxt->remaining;
>>> }
>>>
>>> -int sprintf(char *buf, const char *fmt, ...)
>>> +int snprintf(char *buf, size_t size, const char *fmt, ...)
>>> {
>>> va_list ap;
>>> + struct __copy_context ctxt;
>>> +
>>> + ctxt.ptr = buf;
>>> + ctxt.emitted = 0;
>>> + ctxt.remaining = size;
>>>
>>> va_start(ap, fmt);
>>> - _doprint(__copy, &buf, fmt, ap);
>>> + _doprint(__copy, &ctxt, fmt, ap);
>>> va_end(ap);
>>>
>>> - *buf = '\0';
>>> - return 0;
>>> + if (ctxt.remaining != 0)
>>> + *ctxt.ptr = '\0';
>>> +
>>> + return ctxt.emitted;
>>> }
>>
>> This doesn't return the correct value according the C99. From the
>> snprintf() man page:
>>
>> "The functions snprintf() and vsnprintf() do not write more than
>> size bytes (including the trailing '\0'). If the output was
>> truncated due to this limit then the return value is the number of
>> characters (not including the trailing '\0') 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."
>>
>
> Actually, reading the code again, it is correct isn't it?
> ctxt.emitted is bumped for every character emitted by _doprint()
> regardless of whether it makes it into the buffer or not so in an
> overflow case the value returned will be the number of characters
> which would have been written not including the nul terminator.
Er. Yes, it is correct. My mistake.
David
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |