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.