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)

Most upvoted comments

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.