# HG changeset patch # User ksrini # Date 1387391794 28800 # Node ID f2133b498789b81bb3cf45afb623b6fd9a1b901c # Parent 0b2684d4f49ff3d21b4686ad2183564d37d0c2ce 8029388: java.exe consumes argument intended for launched java class Reviewed-by: mchung diff -r 0b2684d4f49f -r f2133b498789 jdk/src/windows/bin/java_md.c --- 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); diff -r 0b2684d4f49f -r f2133b498789 jdk/test/tools/launcher/ChangeDataModel.java --- 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 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()); + } }