From 37aa7c165dac13b7d6bb2b3c9814e1ec3fc4a730 Mon Sep 17 00:00:00 2001
From: Harold Seigel <hseigel@openjdk.org>
Date: Fri, 19 Aug 2022 12:19:35 +0000
Subject: [PATCH] 8292559: Add test for -XX:+CheckJNICalls showing changed
 signal handlers

Reviewed-by: stuefe, coleenp
---
 make/test/JtregNativeHotspot.gmk              |  2 +-
 .../jtreg/runtime/posixSig/TestPosixSig.java  | 69 +++++++++++++++++++
 .../jtreg/runtime/posixSig/libTestPsig.c      | 44 ++++++++++++
 3 files changed, 114 insertions(+), 1 deletion(-)
 create mode 100644 test/hotspot/jtreg/runtime/posixSig/TestPosixSig.java
 create mode 100644 test/hotspot/jtreg/runtime/posixSig/libTestPsig.c

diff --git a/make/test/JtregNativeHotspot.gmk b/make/test/JtregNativeHotspot.gmk
index 94349ed0f5a..ba21e1f60e6 100644
--- a/make/test/JtregNativeHotspot.gmk
+++ b/make/test/JtregNativeHotspot.gmk
@@ -874,7 +874,7 @@ BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exesigtest := -ljvm
 
 ifeq ($(call isTargetOs, windows), true)
   BUILD_HOTSPOT_JTREG_EXECUTABLES_CFLAGS_exeFPRegs := -MT
-  BUILD_HOTSPOT_JTREG_EXCLUDE += exesigtest.c libterminatedThread.c libTestJNI.c libCompleteExit.c
+  BUILD_HOTSPOT_JTREG_EXCLUDE += exesigtest.c libterminatedThread.c libTestJNI.c libCompleteExit.c libTestPsig.c
   BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libatExit := jvm.lib
   BUILD_HOTSPOT_JTREG_EXECUTABLES_LIBS_exedaemonDestroy := jvm.lib
 else
diff --git a/test/hotspot/jtreg/runtime/posixSig/TestPosixSig.java b/test/hotspot/jtreg/runtime/posixSig/TestPosixSig.java
new file mode 100644
index 00000000000..52402ebe83f
--- /dev/null
+++ b/test/hotspot/jtreg/runtime/posixSig/TestPosixSig.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test TestPosixSig.java
+ * @bug 8292559
+ * @summary test that -XX:+CheckJNICalss displays changed signal handlers.
+ * @requires os.family != "windows"
+ * @library /test/lib
+ * @run driver TestPosixSig
+ */
+
+import jdk.test.lib.process.ProcessTools;
+import jdk.test.lib.process.OutputAnalyzer;
+
+public class TestPosixSig {
+
+    private static native void changeSigActionFor(int val);
+
+    public static void main(String[] args) throws Throwable {
+        // Get the library path property.
+        String libpath = System.getProperty("java.library.path");
+
+        if (args.length == 0) {
+
+            // Create a new java process for the TestPsig Java/JNI test.
+            ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
+                "-XX:+CheckJNICalls",
+                "-Djava.library.path=" + libpath + ":.",
+                "TestPosixSig", "dummy");
+
+            // Start the process and check the output.
+            OutputAnalyzer output = new OutputAnalyzer(pb.start());
+            String outputString = output.getOutput();
+            if (!outputString.contains("Warning: SIGILL handler modified!") ||
+                !outputString.contains("Warning: SIGFPE handler modified!")) {
+                System.out.println("output: " + outputString);
+                throw new RuntimeException("Test failed, missing signal Warning");
+            }
+            output.shouldHaveExitValue(0);
+
+        } else {
+            System.loadLibrary("TestPsig");
+            TestPosixSig.changeSigActionFor(8); // SIGFPE
+            TestPosixSig.changeSigActionFor(4); // SIGILL
+            Thread.sleep(600);
+        }
+    }
+}
diff --git a/test/hotspot/jtreg/runtime/posixSig/libTestPsig.c b/test/hotspot/jtreg/runtime/posixSig/libTestPsig.c
new file mode 100644
index 00000000000..ba7f39f1319
--- /dev/null
+++ b/test/hotspot/jtreg/runtime/posixSig/libTestPsig.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <stdio.h>
+#include <jni.h>
+#include <signal.h>
+#include <sys/ucontext.h>
+#include <errno.h>
+#include <string.h>
+
+static void sig_handler(int sig, siginfo_t *info, ucontext_t *context) {
+    printf( " HANDLER (1) " );
+}
+
+JNIEXPORT void JNICALL Java_TestPosixSig_changeSigActionFor(JNIEnv *env, jclass klass, jint val) {
+    struct sigaction act;
+    act.sa_handler = (void (*)())sig_handler;
+    sigemptyset(&act.sa_mask);
+    act.sa_flags = 0;
+    int retval = sigaction(val, &act, 0);
+    if (retval != 0) {
+        printf("ERROR: failed to set %d signal handler error=%s\n", val, strerror(errno));
+    }
+}