| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/2] tools: use memcpy instead of strncpy in getBridge
 Hi Jurgen,
> On 7 Oct 2020, at 09:39, Jürgen Groß <jgross@xxxxxxxx> wrote:
> 
> On 07.10.20 10:28, Bertrand Marquis wrote:
>> Use memcpy in getBridge to prevent gcc warnings about truncated
>> strings. We know that we might truncate it, so the gcc warning
>> here is wrong.
>> Revert previous change changing buffer sizes as bigger buffers
>> are not needed.
>> Signed-off-by: Bertrand Marquis <bertrand.marquis@xxxxxxx>
>> ---
>> Changes in v2:
>>  Use MIN between string length of de->d_name and resultLen to copy only
>>  the minimum size required and prevent crossing to from an unallocated
>>  space.
>> ---
>>  tools/libs/stat/xenstat_linux.c | 11 +++++++++--
>>  1 file changed, 9 insertions(+), 2 deletions(-)
>> diff --git a/tools/libs/stat/xenstat_linux.c 
>> b/tools/libs/stat/xenstat_linux.c
>> index d2ee6fda64..0ace03af1b 100644
>> --- a/tools/libs/stat/xenstat_linux.c
>> +++ b/tools/libs/stat/xenstat_linux.c
>> @@ -29,6 +29,7 @@
>>  #include <string.h>
>>  #include <unistd.h>
>>  #include <regex.h>
>> +#include <xen-tools/libs.h>
>>    #include "xenstat_priv.h"
>>  @@ -78,7 +79,13 @@ static void getBridge(char *excludeName, char *result, 
>> size_t resultLen)
>>                              sprintf(tmp, "/sys/class/net/%s/bridge", 
>> de->d_name);
>>                              if (access(tmp, F_OK) == 0) {
>> -                                    strncpy(result, de->d_name, resultLen);
>> +                                    /*
>> +                                     * Do not use strncpy to prevent 
>> compiler warning with
>> +                                     * gcc >= 10.0
>> +                                     * If de->d_name is longer then 
>> resultLen we truncate it
> 
> s/then/than/
Will fix
> 
>> +                                     */
>> +                                    memcpy(result, de->d_name, 
>> MIN(strnlen(de->d_name,
>> +                                                                    
>> sizeof(de->d_name)),resultLen - 1));
> 
> You can't use sizeof(de->d_name) here, as AFAIK there is no guarantee
> that de->d_name isn't e.g. defined like "char d_name[]".
> 
> My suggestion to use NAME_MAX as upper boundary for the length was
> really meant to be used that way.
> 
> And additionally you might want to add 1 to the strnlen() result in
> order to copy the trailing 0-byte, too (or you should zero out the
> result buffer before and omit writing the final zero byte).
> 
> Thinking more about it zeroing the result buffer is better as it even
> covers the theoretical case of NAME_MAX being shorter than resultLen.
Setting the result buffer completely to 0 and doing after a copy sounds like
a big complexity.
How about:
copysize = MIN(strnlen(de->d_name,NAME_MAX), resultLen - 1);
memcpy(result, de->d_name, copysize);
result[copysize + 1] = 0
This would cover the case where NAME_MAX is shorter then resultLen.
Cheers
Bertrand
> 
> 
> Juergen
 
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |