Build error with GCC 10 in NetworkInterface.c and k_standard.c

Koichi Sakata sakatakui at oss.nttdata.com
Thu Jul 9 07:48:36 UTC 2020


Hi Daniel,

Thank you for your response.

 >  > +    if (sizeof(if2.ifr_name) < sizeof(name)) {
 >  > +        return -1;
 >  > +    }
 >
 > If I'm not mistaken `sizeof(name)` where name is a const char*
 > will always be 8 (on 64 bits architecture) - so this is probably
 > not doing what you want.

I'm sorry. That is my mistake.

 > Also you don't want to trust that `name` is null terminated.
 > Calling strncpy in that case is much safer than calling strcpy
 > even if guarded by strlen.
 > I'm not sure what the compiler is warning you about here.
 >
 > I'd suggest to experiment changing:
 >
 >  >       memset((char *)&if2, 0, sizeof(if2));
 >  > -     strncpy(if2.ifr_name, name, sizeof(if2.ifr_name) - 1);
 >    +     strncpy(if2.ifr_name, name, sizeof(if2.ifr_name));
 >    +     if2.ifr_name[sizeof(if2.ifr_name) - 1] = 0;

I've written the code same as your suggestion. Certainly that can 
resolve the warnings. But I think it could cut off the name in the 
middle when length of the name longer than the if2.ifr_name length. I 
would say I might as well return the error code under the circumstances. 
  So I added the if statement. The code that reflect my intention 
correctly is as follows.


diff --git a/src/java.base/unix/native/libnet/NetworkInterface.c 
b/src/java.base/unix/native/libnet/NetworkInterface.c
--- a/src/java.base/unix/native/libnet/NetworkInterface.c
+++ b/src/java.base/unix/native/libnet/NetworkInterface.c
@@ -1295,8 +1295,13 @@
   */
  static int getIndex(int sock, const char *name) {
      struct ifreq if2;
+
+    if (sizeof(if2.ifr_name) < strlen(name) + 1) {
+        return -1;
+    }
+
      memset((char *)&if2, 0, sizeof(if2));
-    strncpy(if2.ifr_name, name, sizeof(if2.ifr_name) - 1);
+    strcpy(if2.ifr_name, name);

      if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) < 0) {
          return -1;
@@ -1358,8 +1363,13 @@

  static int getFlags(int sock, const char *ifname, int *flags) {
      struct ifreq if2;
+
+    if (sizeof(if2.ifr_name) < strlen(ifname) + 1) {
+        return -1;
+    }
+
      memset((char *)&if2, 0, sizeof(if2));
-    strncpy(if2.ifr_name, ifname, sizeof(if2.ifr_name) - 1);
+    strcpy(if2.ifr_name, ifname);

      if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) < 0) {
          return -1;


Thanks,
Koichi

On 2020/07/08 2:57, Daniel Fuchs wrote:
> Hi,
> 
> I will not comment on the changes to libfdlibm/k_standard.c
> 
> Concerning NetworkInterface.c I believe the proposed changes are
> incorrect - and I do not see the issue with the current code.
> 
>  > +    if (sizeof(if2.ifr_name) < sizeof(name)) {
>  > +        return -1;
>  > +    }
> 
> If I'm not mistaken `sizeof(name)` where name is a const char*
> will always be 8 (on 64 bits architecture) - so this is probably
> not doing what you want.
> 
> Also you don't want to trust that `name` is null terminated.
> Calling strncpy in that case is much safer than calling strcpy
> even if guarded by strlen.
> I'm not sure what the compiler is warning you about here.
> 
> I'd suggest to experiment changing:
> 
>  >       memset((char *)&if2, 0, sizeof(if2));
>  > -     strncpy(if2.ifr_name, name, sizeof(if2.ifr_name) - 1);
>    +     strncpy(if2.ifr_name, name, sizeof(if2.ifr_name));
>    +     if2.ifr_name[sizeof(if2.ifr_name) - 1] = 0;
> 
> and see if that makes the warning go away.
> 
> best regards,
> 
> -- daniel
> 
> 
> On 24/06/2020 08:48, Koichi Sakata wrote:
>> Hi all,
>>
>> (I've sent a similar e-mail before to this ML, but I extract the part 
>> only related to core-libs-dev ML from the previous one.)
>>
>> I tried to build OpenJDK fastdebug with GCC 10.1 on Ubuntu 18.04, but 
>> I saw some compiler warnings as follows:
>>
>> /home/jyukutyo/code/jdk/src/java.base/share/native/libfdlibm/: In 
>> function '__j__kernel_standard':
>> /home/jyukutyo/code/jdk/src/java.base/share/native/libfdlibm/k_standard.c:743:19: 
>> error: 'exc.retval' may be used uninitialized in this function 
>> [-Werror=maybe-uninitialized]
>>    743 |         return exc.retval;
>>        |                ~~~^~~~~~~
>>
>> In file included from /usr/include/string.h:494,
>>                   from 
>> /home/jyukutyo/code/jdk/src/java.base/unix/native/libnet/NetworkInterface.c:30: 
>>
>> In function 'strncpy',
>>      inlined from 'getFlags' at 
>> /home/jyukutyo/code/jdk/src/java.base/unix/native/libnet/NetworkInterface.c:1362:5, 
>>
>>      inlined from 'addif' at 
>> /home/jyukutyo/code/jdk/src/java.base/unix/native/libnet/NetworkInterface.c:974:13: 
>>
>> /usr/include/x86_64-linux-gnu/bits/string_fortified.h:106:10: error: 
>> '__builtin_strncpy' output may be truncated copying 15 bytes from a 
>> string of length 15 [-Werror=stringop-truncation]
>>    106 |   return __builtin___strncpy_chk (__dest, __src, __len, __bos 
>> (__dest));
>>        | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>> I can resolve them with the following patch. I believe it fixes those 
>> potential bugs, so I'd like to contribute it.
>> (Our company has signed OCA.)
>>
>> Thanks,
>> Koichi
>>
>> ===== PATCH =====
>> diff -r 20d92fe3ac52 src/java.base/share/native/libfdlibm/k_standard.c
>> --- a/src/java.base/share/native/libfdlibm/k_standard.c Tue Jun 16 
>> 03:16:41 2020 +0000
>> +++ b/src/java.base/share/native/libfdlibm/k_standard.c Thu Jun 18 
>> 07:08:50 2020 +0900
>> @@ -739,6 +739,10 @@
>>                           errno = EDOM;
>>                   }
>>                   break;
>> +            default:
>> +                exc.retval = zero;
>> +                errno = EINVAL;
>> +                break;
>>           }
>>           return exc.retval;
>>   }
>> diff -r 20d92fe3ac52 src/java.base/unix/native/libnet/NetworkInterface.c
>> --- a/src/java.base/unix/native/libnet/NetworkInterface.c       Tue 
>> Jun 16 03:16:41 2020 +0000
>> +++ b/src/java.base/unix/native/libnet/NetworkInterface.c       Thu 
>> Jun 18 07:08:50 2020 +0900
>> @@ -1296,7 +1296,10 @@
>>   static int getIndex(int sock, const char *name) {
>>       struct ifreq if2;
>>       memset((char *)&if2, 0, sizeof(if2));
>> -    strncpy(if2.ifr_name, name, sizeof(if2.ifr_name) - 1);
>> +    if (sizeof(if2.ifr_name) < sizeof(name)) {
>> +        return -1;
>> +    }
>> +    strcpy(if2.ifr_name, name);
>>
>>       if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) < 0) {
>>           return -1;
>> @@ -1359,7 +1362,10 @@
>>   static int getFlags(int sock, const char *ifname, int *flags) {
>>       struct ifreq if2;
>>       memset((char *)&if2, 0, sizeof(if2));
>> -    strncpy(if2.ifr_name, ifname, sizeof(if2.ifr_name) - 1);
>> +    if (sizeof(if2.ifr_name) < sizeof(ifname)) {
>> +        return -1;
>> +    }
>> +    strcpy(if2.ifr_name, ifname);
>>
>>       if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) < 0) {
>>           return -1;
> 


More information about the core-libs-dev mailing list