On 05/24/2013 06:57 AM, Michal Privoznik wrote:
On 24.05.2013 11:53, Michal Privoznik wrote:
> With previous patch, we accept negative value as length of string to
> duplicate. So there is no need to pass strlen(src) in case we want to do
> duplicate the whole string.
> ---
> - if (VIR_STRNDUP(arg, curr, next ? next - curr :
strlen(curr)) < 0)
> + if (VIR_STRNDUP(arg, curr, next ? next - curr : -1) < 0)
Or we can even go with 'VIR_STRNDUP(arg, curr, next - curr) < 0' but
that's not so easy to read. The rationale behind is: I intentionally
made VIR_STRNDUP to accept *any* negative value, not just -1. Because if
strrchr(cur, '\n') just a few lines above fails, next is just NULL.
Deducting from NULL will get a negative value. Which will make
VIR_STRNDUP duplicate the while string. But I worry that it would be an
ugly code, wouldn't it?
It would be undefined behavior according to the C standard. Pointer
subtraction is only well-defined within the bounds of a single object;
your object (in C terminology) starts at 'curr' and ends at the NUL byte
that terminates 'curr'. NULL falls outside that bounds. 'next - curr'
is not guaranteed to be negative, since C says the behavior is
undefined. Stick with the long form.
--
Eric Blake eblake redhat com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org