[ipxe-devel] [PATCH] [efi] use correct bound in strncpy to ensure NUL-termination
Michael Brown
mcb30 at ipxe.org
Mon Apr 23 20:30:04 UTC 2018
On 23/04/18 21:01, Bruce Rogers wrote:
>> This is a fixed-length string field that is not supposed to be
>> NUL-terminated. The use of strncpy() here is deliberate in order to be
>> able to completely fill the field.
>>
>> Is there a (clean) way to indicate to gcc to ignore this false positive
>> warning?
>
> I don't know if there is a way to do that.
>
> It looks like this is not the only instance of this type of usage of strncpy()
> (I should have checked). This new check in gcc8 also covers strncat() and
> stpncpy(). I find one instance of strncat(), but it's usage looks fine. No usage
> of stpncpy(). Perhaps we need an audit of all these strncpy()'s to properly
> avoid this issue as gcc8 is coming soon.
From a very quick review of the instances of strncpy(), all appear to
be deliberate. They are all used to copy a NUL-terminated source string
into a non-NUL-terminated fixed-size buffer that requires NUL-padding.
This is precisely what strncpy() is defined to do (and we have unit
tests to ensure that this is what our implementation does!).
Note that using memcpy() alone is insufficient, since you would need a
separate calculation to determine the correct length to be copied (which
depends on both the source string and the destination buffer size) and
also a call to memset() to perform the NUL-padding (in those cases where
the destination buffer is not already guaranteed to be initialised to
all NULs).
We could reimplement each instance using a call to strlen(), an explicit
check to ensure that the destination length is not exceeded, a call to
memcpy(), and a (possible) call to memset() to perform the padding.
This would basically be reimplementing strncpy() at each call site,
which is not a sensible solution.
I'll happily accept patches to alter gcc's behaviour so that it does not
report false positive warnings for these 100% correct usages of
strncpy(). There may be a clean way to do this; if not then I'll accept
an alternative patch to disable stringop-truncation warnings completely.
Thanks,
Michael
More information about the ipxe-devel
mailing list