JDK-8165665 : Method NetworkInterface.getNetworkInterfaces() might fail
  • Type: Bug
  • Component: core-libs
  • Sub-Component: java.net
  • Affected Version: 7,8,9
  • Priority: P4
  • Status: Closed
  • Resolution: Duplicate
  • OS: windows
  • CPU: generic
  • Submitted: 2016-05-31
  • Updated: 2024-04-03
  • Resolved: 2024-04-03
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
Other
tbdResolved
Related Reports
Duplicate :  
Relates :  
Relates :  
Description
FULL PRODUCT VERSION :
java version "1.7.0_75"
Java(TM) SE Runtime Environment (build 1.7.0_75-b13)
Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode)

ADDITIONAL OS VERSION INFORMATION :
The bug was found on Windows 7 64-bit, but can occur on all supported Windows versions.

A DESCRIPTION OF THE PROBLEM :
Method NetworkInterface.getNetworkInterfaces() might throw java.lang.Error with error message "IP Helper Library GetIfTable function failed", if it is called at the same time as a new network interface shows up in Windows.

The reason is a subtle race condition. Function enumInterfaces in NetworkInterface.c first calls GetIfTable(...) with a NULL buffer to retrieve the buffer size. Then it allocates a buffer of this size and calls GetIfTable(...) again. If a new network interface has appeared between these two calls, the buffer will be too small and the last GetIfTable(...) call will fail (that is, return ERROR_INSUFFICIENT_BUFFER instead of 0). Then the function throws a java.lang.Error with the above error message.

The solution is to call GetIfEntry again with a new buffer if it returns ERROR_INSUFFICIENT_BUFFER, and give up first after a reasonable number of reattempts.

STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Start a Java application that calls NetworkInterface.getNetworkInterfaces() in a loop. Plug out and in a USB wi-fi adapter until the error occurs.

EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
No NetworkInterface.getNetworkInterfaces() calls should throw java.lang.Error.
ACTUAL -
java.lang.Error: IP Helper Library GetIfTable function failed
        at java.net.NetworkInterface.getAll(Native Method)
        at java.net.NetworkInterface.getNetworkInterfaces(NetworkInterface.java:334)
        ...

ERROR MESSAGES/STACK TRACES THAT OCCUR :
The bug was found when a client connected to an RMI server, at the same time as a mobile broadband dongle was plugged in to the PC:

Exception in thread "RMI TCP Accept-0" java.lang.Error: IP Helper Library GetIfTable function failed
        at java.net.NetworkInterface.getAll(Native Method)
        at java.net.NetworkInterface.getNetworkInterfaces(NetworkInterface.java:334)
        at sun.management.jmxremote.LocalRMIServerSocketFactory$1.accept(LocalRMIServerSocketFactory.java:86)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.executeAcceptLoop(TCPTransport.java:399)
        at sun.rmi.transport.tcp.TCPTransport$AcceptLoop.run(TCPTransport.java:371)
        at java.lang.Thread.run(Thread.java:745)

REPRODUCIBILITY :
This bug can be reproduced rarely.


Comments
New implementation from JDK-8302659 does not have this problem
15-03-2023