8029388: java.exe consumes argument intended for launched java class
Reviewed-by: mchung
--- a/jdk/src/windows/bin/java_md.c Wed Dec 18 10:19:05 2013 -0800
+++ b/jdk/src/windows/bin/java_md.c Wed Dec 18 10:36:34 2013 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2013, 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
@@ -179,7 +179,7 @@
int wanted = running;
char** argv = *pargv;
- for (i = 0; i < *pargc ; i++) {
+ for (i = 1; i < *pargc ; i++) {
if (JLI_StrCmp(argv[i], "-J-d64") == 0 || JLI_StrCmp(argv[i], "-d64") == 0) {
wanted = 64;
continue;
@@ -188,6 +188,11 @@
wanted = 32;
continue;
}
+
+ if (IsJavaArgs() && argv[i][0] != '-')
+ continue;
+ if (argv[i][0] != '-')
+ break;
}
if (running != wanted) {
JLI_ReportErrorMessage(JRE_ERROR2, wanted);
--- a/jdk/test/tools/launcher/ChangeDataModel.java Wed Dec 18 10:19:05 2013 -0800
+++ b/jdk/test/tools/launcher/ChangeDataModel.java Wed Dec 18 10:36:34 2013 -0800
@@ -23,41 +23,43 @@
/**
* @test
- * @bug 4894330 4810347 6277269
+ * @bug 4894330 4810347 6277269 8029388
* @compile -XDignore.symbol.file ChangeDataModel.java
* @run main ChangeDataModel
* @summary Verify -d32 and -d64 options are accepted(rejected) on all platforms
* @author Joseph D. Darcy, ksrini
*/
import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
public class ChangeDataModel extends TestHelper {
private static final File TestJar = new File("test" + JAR_FILE_EXT);
+ private static final String OptionName = "Args";
+ private static final File TestOptionJar = new File(OptionName + JAR_FILE_EXT);
private static final String OPT_PREFIX = "ARCH_OPT:";
- public static void main(String... args) throws Exception {
+ static void createTestJar() throws Exception {
String[] code = {
" public static void main(String argv[]) {",
" System.out.println(\"" + OPT_PREFIX + "-d\" + System.getProperty(\"sun.arch.data.model\", \"none\"));",
- " }",
- };
+ " }",};
createJar(TestJar, code);
+ }
+ public static void main(String... args) throws Exception {
+ createTestJar();
+ createOptionsJar();
- // verify if data model flag for default data model is accepted
+ // verify if data model flag for default data model is accepted, also
+ // verify if the complimentary data model is rejected.
if (is32Bit) {
checkAcceptance(javaCmd, "-d32");
+ checkRejection(javaCmd, "-d64");
+ checkOption(javaCmd, "-d64");
} else if (is64Bit) {
checkAcceptance(javaCmd, "-d64");
- } else {
- throw new Error("unsupported data model");
- }
-
- // Negative tests: ensure that non-dual mode systems reject the
- // complementary (other) data model
- if (is32Bit) {
- checkRejection(javaCmd, "-d64");
- } else if (is64Bit) {
checkRejection(javaCmd, "-d32");
+ checkOption(javaCmd, "-d32");
} else {
throw new Error("unsupported data model");
}
@@ -81,4 +83,44 @@
throw new RuntimeException(message);
}
}
+
+ static void checkOption(String cmd, String dmodel) throws Exception {
+ TestResult tr = doExec(cmd, "-jar", TestOptionJar.getAbsolutePath(), dmodel);
+ verifyOption(tr, dmodel);
+
+ tr = doExec(cmd, "-cp", ".", OptionName, dmodel);
+ verifyOption(tr, dmodel);
+ }
+
+ static void verifyOption(TestResult tr, String dmodel) {
+ if (!tr.contains(OPT_PREFIX + dmodel)) {
+ System.out.println(tr);
+ String message = "app argument: " + dmodel + " not found.";
+ throw new RuntimeException(message);
+ }
+ if (!tr.isOK()) {
+ System.out.println(tr);
+ String message = "app argument: " + dmodel + " interpreted ?";
+ throw new RuntimeException(message);
+ }
+ }
+
+ static void createOptionsJar() throws Exception {
+ List<String> code = new ArrayList<>();
+ code.add("public class Args {");
+ code.add(" public static void main(String argv[]) {");
+ code.add(" for (String x : argv)");
+ code.add(" System.out.println(\"" + OPT_PREFIX + "\" + x);");
+ code.add(" }");
+ code.add("}");
+ File optionsJava = new File(OptionName + JAVA_FILE_EXT);
+ createFile(optionsJava, code);
+ File optionsClass = new File(OptionName + CLASS_FILE_EXT);
+
+ compile(optionsJava.getName());
+ createJar("cvfe",
+ TestOptionJar.getName(),
+ OptionName,
+ optionsClass.getName());
+ }
}