Skip to content

Commit c5d9507

Browse files
author
Doug Simon
committed
8257220: [JVMCI] option validation should not result in a heavy-weight VM crash
Reviewed-by: kvn
1 parent c2af27b commit c5d9507

File tree

2 files changed

+66
-4
lines changed

2 files changed

+66
-4
lines changed

src/jdk.internal.vm.ci/share/classes/jdk.vm.ci.hotspot/src/jdk/vm/ci/hotspot/HotSpotJVMCIRuntime.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -379,8 +379,10 @@ static float stringSimiliarity(String str1, String str2) {
379379
/**
380380
* Parses all system properties starting with {@value #JVMCI_OPTION_PROPERTY_PREFIX} and
381381
* initializes the options based on their values.
382+
*
383+
* @param compilerToVm
382384
*/
383-
static void parse() {
385+
static void parse(CompilerToVM compilerToVm) {
384386
Map<String, String> savedProps = jdk.vm.ci.services.Services.getSavedProperties();
385387
for (Map.Entry<String, String> e : savedProps.entrySet()) {
386388
String name = e.getKey();
@@ -395,14 +397,17 @@ static void parse() {
395397
}
396398
}
397399
Formatter msg = new Formatter();
398-
msg.format("Could not find option %s", name);
400+
msg.format("Error parsing JVMCI options: Could not find option %s", name);
399401
if (!matches.isEmpty()) {
400402
msg.format("%nDid you mean one of the following?");
401403
for (String match : matches) {
402404
msg.format("%n %s=<value>", match);
403405
}
404406
}
405-
throw new IllegalArgumentException(msg.toString());
407+
msg.format("%nError: A fatal exception has occurred. Program will exit.%n");
408+
byte[] msgBytes = msg.toString().getBytes();
409+
compilerToVm.writeDebugOutput(msgBytes, 0, msgBytes.length, true, true);
410+
compilerToVm.callSystemExit(1);
406411
} else if (value instanceof Option) {
407412
Option option = (Option) value;
408413
option.init(e.getValue());
@@ -531,7 +536,7 @@ private HotSpotJVMCIRuntime() {
531536
}
532537

533538
// Initialize the Option values.
534-
Option.parse();
539+
Option.parse(compilerToVm);
535540

536541
String hostArchitecture = config.getHostArchitectureName();
537542

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
24+
/*
25+
* @test TestInvalidJVMCIOption
26+
* @bug 8257220
27+
* @summary Ensures invalid JVMCI options do not crash the VM with a hs-err log.
28+
* @requires vm.jvmci & vm.compMode == "Xmixed"
29+
* @library /test/lib
30+
* @run driver TestInvalidJVMCIOption
31+
*/
32+
33+
import jdk.test.lib.process.ProcessTools;
34+
import jdk.test.lib.process.OutputAnalyzer;
35+
36+
public class TestInvalidJVMCIOption {
37+
38+
public static void main(String[] args) throws Exception {
39+
ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
40+
"-XX:+UnlockExperimentalVMOptions",
41+
"-XX:+EagerJVMCI",
42+
"-XX:+UseJVMCICompiler",
43+
"-Djvmci.XXXXXXXXX=true");
44+
OutputAnalyzer output = new OutputAnalyzer(pb.start());
45+
String expectStdout = String.format(
46+
"Error parsing JVMCI options: Could not find option jvmci.XXXXXXXXX%n" +
47+
"Error: A fatal exception has occurred. Program will exit.%n");
48+
String actualStdout = output.getStdout();
49+
if (!actualStdout.equals(expectStdout)) {
50+
throw new RuntimeException(String.format("Invalid STDOUT:%nExpect:%n%s%nActual:%n%s", expectStdout, actualStdout));
51+
}
52+
if (!output.getStderr().isEmpty()) {
53+
throw new RuntimeException("STDERR was not empty: " + output.getStderr());
54+
}
55+
output.shouldHaveExitValue(1);
56+
}
57+
}

0 commit comments

Comments
 (0)