[jdk8u-dev] RFR: 8173339: AArch64: Fix minimum stack size computations

Dongbo He dongbohe at openjdk.java.net
Mon May 30 03:29:19 UTC 2022


Hi,

I would like to backport this patch to fix minimum stack size computations on AArch64.
I updated the value directly on `define_pd_global` because [JDK-8078556](https://bugs.openjdk.java.net/browse/JDK-8078556) is not in 8u.

Testing: Following test case worked correctly after patch.
Before patch:
$ java TLSStackOverflow
[1]    35476 segmentation fault (core dumped) java TLSStackOverflow
After patch:
$ java TLSStackOverflow
got expected stackoverflow, passed

$ keytool -genkey -keyalg RSA -keystore localhost-rsa.jks -storepass changeit -storetype pkcs12
$ cat TLSStackOverflow.java

import javax.net.ServerSocketFactory;
import javax.net.SocketFactory;
import javax.net.ssl.*;
import java.io.*;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

public class TLSStackOverflow
{

    private static final String keystore = "/home/hedongbo/myprojects/study/stackoverflow/new/localhost-rsa.jks";
    private static final char[] passphrase = "changeit".toCharArray();
    private static final int port = 8447;

    private static KeyStore pfx = null;

    public static void doWrite(OutputStream out) throws Exception {
        out.write("hello".getBytes(), 0, 3);
        out.flush();
        doWrite(out);
    }

    public TLSStackOverflow()
    {}

    public static void main(String[] args) throws Exception
    {
        new Thread(() -> {
            try {
                pfx = KeyStore.getInstance("PKCS12");
                pfx.load(new FileInputStream(keystore), passphrase);
                SSLContext ctx = SSLContext.getInstance("TLS");
                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
                kmf.init(pfx, passphrase);
                KeyManager[] kms = kmf.getKeyManagers();
                ctx.init(kms, null, null);
                ServerSocketFactory fact = ctx.getServerSocketFactory();
                SSLServerSocket serversocket = (SSLServerSocket) fact.createServerSocket(port);
                while (true)
                {
                    Socket socket = null;
                    try
                    {
                        socket = serversocket.accept();

                        DataInputStream in = new DataInputStream(socket.getInputStream());
                        DataOutputStream out = new DataOutputStream(socket.getOutputStream());

                        byte[] buf = new byte[8192];
                        int len = in.read(buf);
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                    finally
                    {
//                        try
//                        {
//                            socket.close();
//                        }
//                        catch (Exception e) {
//                            e.printStackTrace();
//                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }).start();

        Thread.sleep(2000);

        new Thread(() -> {
            SSLSocket socket = null;
            try {
                pfx = KeyStore.getInstance("PKCS12");
                pfx.load(new FileInputStream(keystore), passphrase);
                SSLContext ctx = SSLContext.getInstance("TLS");
                KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
                kmf.init(pfx, passphrase);
                TrustAllManager[] trust = { new TrustAllManager() };
                ctx.init(null, trust, null);
                SocketFactory fact = ctx.getSocketFactory();
                socket = (SSLSocket) fact.createSocket();
                socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(), port), 2000);
                socket.setTcpNoDelay(true);
                socket.startHandshake();

                DataInputStream in = new DataInputStream(socket.getInputStream());
                DataOutputStream out = new DataOutputStream(socket.getOutputStream());

                String s = "GET " + " HTTP/1.1\r\n";
                s+= "Accept: */*\r\n";
                s+= "User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)\r\n";
                s+= "Connection: Close\r\n";
                s+= "\r\n";
                try {
                    doWrite(out);
                } catch (StackOverflowError e) {
                    System.out.println("got expected stackoverflow, passed");
                    System.exit(0);
                }

                byte[] buf = new byte[8192];
                int len = in.read(buf);
                if (len == -1)
                {
                    System.out.println("eof");
                    return;
                }
                System.out.println(new String(buf, 0, len));
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                try
                {
                    socket.close();
                }
                catch (Exception e)
                {}
            }

        }).start();

    }

}


class TrustAllManager implements X509TrustManager
{
    private X509Certificate[] issuers;

    public TrustAllManager()
    {
        this.issuers = new X509Certificate[0];
    }

    public X509Certificate[] getAcceptedIssuers()
    {
        return issuers ;
    }

    public void checkClientTrusted(X509Certificate[] chain, String authType)
    {}

    public void checkServerTrusted(X509Certificate[] chain, String authType)
    {}
}

-------------

Commit messages:
 - Backport 540ec375c30e973ceb1a944d5cc60cc8532e88ec

Changes: https://git.openjdk.java.net/jdk8u-dev/pull/66/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk8u-dev&pr=66&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8173339
  Stats: 4 lines in 1 file changed: 3 ins; 0 del; 1 mod
  Patch: https://git.openjdk.java.net/jdk8u-dev/pull/66.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk8u-dev pull/66/head:pull/66

PR: https://git.openjdk.java.net/jdk8u-dev/pull/66


More information about the jdk8u-dev mailing list