[ipxe-devel] [PATCH] [efi] use correct bound in strncpy to ensure NUL-termination

Bruce Rogers brogers at suse.com
Thu May 3 17:43:45 UTC 2018


>>> On 4/23/2018 at 2:30 PM, Michael Brown <mcb30 at ipxe.org> wrote:
> 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.

As an additional follow up, now that gcc8 is released, I decided on the
following patch for us in the SUSE/openSUSE qemu package, which also
builds ipxe from source.

https://build.opensuse.org/package/view_file/openSUSE:Factory/qemu/ipxe-efi-guard-strncpy-with-gcc-warning-ignore-pragma.patch?expand=1

As you can see, it simply guards this one offending instance of strncpy()
with GCC specific macros to avoid the warning. I didn't think this would
be the solution you would want for the upstream ipxe codebase, so I
didn't send this patch to the mailing list.

Bruce




More information about the ipxe-devel mailing list