haikuports: dev-lang/openjdk NetworkInterface.isLoopback() crashes with java.net.SocketException
Description
NetworkInterface methods that call native code (e.g. isLoopback(), isUp(), getMTU()) crash with an exception.
Original issue
Gradle build tool cannot be run on Haiku’s OpenJDK. Upon startup Gradle 6.x searches for a loopback interface and fails with a crash:
java.net.SocketException: Invalid Argument (getFlags() failed)
at java.net.NetworkInterface.isLoopback0(Native Method)
at java.net.NetworkInterface.isLoopback(NetworkInterface.java:411)
at org.gradle.internal.remote.internal.inet.InetAddresses.analyzeNetworkInterface(InetAddresses.java:55)
at org.gradle.internal.remote.internal.inet.InetAddresses.analyzeNetworkInterfaces(InetAddresses.java:47)
at org.gradle.internal.remote.internal.inet.InetAddresses.<init>(InetAddresses.java:40)
at org.gradle.internal.remote.internal.inet.InetAddressFactory.init(InetAddressFactory.java:99)
at org.gradle.internal.remote.internal.inet.InetAddressFactory.getWildcardBindingAddress(InetAddressFactory.java:84)
at org.gradle.cache.internal.locklistener.FileLockCommunicator.<init>(FileLockCommunicator.java:49)
at org.gradle.cache.internal.locklistener.DefaultFileLockContentionHandler.getCommunicator(DefaultFileLockContentionHandler.java:263)
at org.gradle.cache.internal.locklistener.DefaultFileLockContentionHandler.reservePort(DefaultFileLockContentionHandler.java:255)
at org.gradle.cache.internal.DefaultFileLockManager.lock(DefaultFileLockManager.java:108)
…
Sample to reproduce
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class Net {
public static void main(String[] args) throws Exception {
Net net = new Net();
net.analyze();
}
public void analyze() throws Exception {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
if (interfaces == null) {
log("No network interfaces found");
return;
}
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
log("Network interface %s", networkInterface.getDisplayName());
try {
// NetworkInterface.isLoopback() throws
// "java.net.SocketException: Invalid Argument (getFlags() failed)"
log("Is this a loopback interface? %s", networkInterface.isLoopback());
// NetworkInterface.isUp() also throws the same exception
log("Is this a interface up? %s", networkInterface.isUp());
} catch (Throwable e) {
log("Error while querying interface %s", networkInterface);
e.printStackTrace();
}
}
}
private void log(String message, Object... args) {
System.out.println(String.format(message, args));
}
}
When that code is run on my Haiku installation, it outputs the following exceptions:
Network interface loop
Error while querying interface name:loop (loop)
java.net.SocketException: Invalid Argument (getFlags() failed)
at java.base/java.net.NetworkInterface.isLoopback0(Native Method)
at java.base/java.net.NetworkInterface.isLoopback(NetworkInterface.java:458)
at Net.analyze(Net.java:28)
at Net.main(Net.java:12)
Network interface /dev/net/pcnet/0
Error while querying interface name:/dev/net/pcnet/0 (/dev/net/pcnet/0)
java.net.SocketException: Invalid Argument (getFlags() failed)
at java.base/java.net.NetworkInterface.isLoopback0(Native Method)
at java.base/java.net.NetworkInterface.isLoopback(NetworkInterface.java:458)
at Net.analyze(Net.java:28)
at Net.main(Net.java:12)
Environment
Haiku x86_64 Walter (Revision hrev 54672) Kernel 23.10.2020 6:34:17
VM VMWare Fusion 12 on macOS 10.15.7 2 CPUs, 8192 Mb
OpenJDK Reproduces on various versions: 1.8.u242_b8-2, 11.0.4.11-1, 13.0.2.8-1
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Comments: 17 (17 by maintainers)
all versions are rebuilt with the patch.
I added a patch in 0c53275807ec4873d69691f30c0482773237909e
@volo-droid indeed sorry for the mix-up The Haiku change is needed because the OpenJDK code should work as is. Now yes, we need a workaround for the current Haiku release. Probably at Haikuports.
Yup.