6485027: javac incorrectly handles relative paths in manifest classpath
authorjjg
Thu, 10 Feb 2011 15:05:33 -0800
changeset 8424 5e31b2eb5aa3
parent 8423 4f9cb86f8e39
child 8425 176cfc2713a4
6485027: javac incorrectly handles relative paths in manifest classpath Reviewed-by: mcimadamore
langtools/src/share/classes/com/sun/tools/javac/file/Paths.java
langtools/test/tools/javac/Paths/Class-Path.sh
langtools/test/tools/javac/Paths/Class-Path2.sh
langtools/test/tools/javac/Paths/Diagnostics.sh
--- a/langtools/src/share/classes/com/sun/tools/javac/file/Paths.java	Thu Feb 10 14:27:34 2011 -0800
+++ b/langtools/src/share/classes/com/sun/tools/javac/file/Paths.java	Thu Feb 10 15:05:33 2011 -0800
@@ -247,10 +247,16 @@
         public Path() { super(); }
 
         public Path addDirectories(String dirs, boolean warn) {
-            if (dirs != null)
-                for (File dir : getPathEntries(dirs))
-                    addDirectory(dir, warn);
-            return this;
+            boolean prev = expandJarClassPaths;
+            expandJarClassPaths = true;
+            try {
+                if (dirs != null)
+                    for (File dir : getPathEntries(dirs))
+                        addDirectory(dir, warn);
+                return this;
+            } finally {
+                expandJarClassPaths = prev;
+            }
         }
 
         public Path addDirectories(String dirs) {
--- a/langtools/test/tools/javac/Paths/Class-Path.sh	Thu Feb 10 14:27:34 2011 -0800
+++ b/langtools/test/tools/javac/Paths/Class-Path.sh	Thu Feb 10 15:05:33 2011 -0800
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 #
-# Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2011, 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
@@ -24,7 +24,7 @@
 #
 
 
-# @test @(#)Class-Path.sh	1.3 03/10/31
+# @test
 # @bug 4212732
 # @summary Test handling of the Class-Path attribute in jar file manifests
 # @author Martin Buchholz
@@ -184,8 +184,8 @@
 #
 Success "$jar" cfe "Hello.jar" "Hello" Bye.class
 
-# Jar creation and update when there is no manifest and inputfiles
-specified
+# Jar creation and update when there is no manifest and inputfiles 
+# specified
 Failure "$jar" cvf "A.jar"
 Failure "$jar" uvf "A.jar"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/Paths/Class-Path2.sh	Thu Feb 10 15:05:33 2011 -0800
@@ -0,0 +1,111 @@
+#!/bin/sh
+#
+# Copyright (c) 2011, 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 
+# @bug 4212732 6485027
+# @summary Test handling of the Class-Path attribute in jar file manifests
+# @author Martin Buchholz
+#
+# @run shell Class-Path2.sh
+
+# To run this test manually, simply do ./Class-Path2.sh
+
+. ${TESTSRC-.}/Util.sh
+
+set -u
+
+Cleanup() {
+    Sys rm -rf pkg Main.java Main.class Main.jar jars
+    Sys rm -rf MANIFEST.MF A.jar B.zip
+}
+
+Cleanup
+Sys mkdir pkg
+
+#----------------------------------------------------------------
+# Create mutually referential jar files
+#----------------------------------------------------------------
+cat >pkg/A.java <<EOF
+package pkg;
+import pkg.B;
+public class A {
+    public static int f() { return B.g(); }
+    public static int g() { return 0; }
+}
+EOF
+
+cat >pkg/B.java <<EOF
+package pkg;
+import pkg.A;
+public class B {
+    public static int f() { return A.g(); }
+    public static int g() { return 0; }
+}
+EOF
+
+Sys "$javac" pkg/A.java pkg/B.java
+
+MkManifestWithClassPath "./sub/B.zip"
+Sys "$jar" cmf MANIFEST.MF A.jar pkg/A.class
+
+MkManifestWithClassPath "../A.jar"
+Sys "$jar" cmf MANIFEST.MF B.zip pkg/B.class
+
+cat >Main.java <<EOF
+import pkg.*;
+public class Main {
+    public static void main(String []a) { System.exit(A.f() + B.f()); }
+}
+EOF
+
+Sys rm -rf pkg
+
+Sys mkdir jars
+Sys mkdir jars/sub/
+Sys mv A.jar jars/.
+Sys mv B.zip jars/sub/.
+
+#
+# Test 1: Compiling 
+#
+
+Success "$javac" ${TESTTOOLVMOPTS} -cp "jars/A.jar" Main.java
+Success "$java"  ${TESTVMOPTS}     -cp "jars/A.jar${PS}." Main
+
+Success "$javac" ${TESTTOOLVMOPTS} -cp "jars/sub/B.zip"       Main.java
+Success "$java"  ${TESTVMOPTS}     -cp "jars/sub/B.zip${PS}." Main
+
+#
+# Test 2: Use of extension directories is incorrect
+#
+
+Success "$javac" ${TESTTOOLVMOPTS} -extdirs jars          -cp None Main.java
+Success "$java"  ${TESTVMOPTS}     -Djava.ext.dirs="jars" -cp .    Main
+
+Success "$javac" ${TESTTOOLVMOPTS} -extdirs jars/sub          -cp None Main.java
+Success "$java"  ${TESTVMOPTS}     -Djava.ext.dirs="jars/sub" -cp .    Main
+
+Cleanup
+
+Bottom Line
--- a/langtools/test/tools/javac/Paths/Diagnostics.sh	Thu Feb 10 14:27:34 2011 -0800
+++ b/langtools/test/tools/javac/Paths/Diagnostics.sh	Thu Feb 10 15:05:33 2011 -0800
@@ -1,7 +1,7 @@
 #!/bin/sh
 
 #
-# Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved.
+# Copyright (c) 2003, 2011, 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
@@ -182,12 +182,12 @@
 No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -Xbootclasspath/p:classesRefRef.jar Main.java
 
 #----------------------------------------------------------------
-# Class-Path attribute ignored in extdirs or endorseddirs
+# Class-Path attribute followed in extdirs or endorseddirs
 #----------------------------------------------------------------
 Sys mkdir jars
 Sys cp -p classesRefRef.jar jars/.
-No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -extdirs      jars Main.java
-No Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -endorseddirs jars Main.java
+   Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -extdirs      jars Main.java
+   Warning "$javac" ${TESTTOOLVMOPTS} -Xlint -endorseddirs jars Main.java
 
 #----------------------------------------------------------------
 # Bad Jar file in extdirs and endorseddirs should not be ignored