From bd0fde71d9113bad902e71b61f0ca44c650809ef Mon Sep 17 00:00:00 2001 From: Jaikiran Pai Date: Sun, 29 Dec 2024 08:37:25 +0000 Subject: [PATCH] 8302293: jar --create fails with IllegalArgumentException if archive name is shorter than 3 characters Reviewed-by: lancea --- .../share/classes/sun/tools/jar/Main.java | 13 ++-- test/jdk/tools/jar/JarCreateFileNameTest.java | 70 +++++++++++++++++++ 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 test/jdk/tools/jar/JarCreateFileNameTest.java diff --git a/src/jdk.jartool/share/classes/sun/tools/jar/Main.java b/src/jdk.jartool/share/classes/sun/tools/jar/Main.java index 02afd5fdbcb..ae6893c021b 100644 --- a/src/jdk.jartool/share/classes/sun/tools/jar/Main.java +++ b/src/jdk.jartool/share/classes/sun/tools/jar/Main.java @@ -315,11 +315,13 @@ public class Main { // error("Warning: -v option ignored"); vflag = false; } - final String tmpbase = (fname == null) + String tmpFilePrefix = (fname == null) ? "tmpjar" : fname.substring(fname.indexOf(File.separatorChar) + 1); - - tmpFile = createTemporaryFile(tmpbase, ".jar"); + if (tmpFilePrefix.length() < 3) { + tmpFilePrefix = "tmpjar" + tmpFilePrefix; + } + tmpFile = createTemporaryFile(tmpFilePrefix, ".jar"); try (OutputStream out = new FileOutputStream(tmpFile)) { create(new BufferedOutputStream(out, 4096), manifest); } @@ -1775,11 +1777,12 @@ public class Main { // Unable to create file due to permission violation or security exception } if (tmpfile == null) { - // Were unable to create temporary file, fall back to temporary file in the same folder + // We were unable to create temporary file, fall back to temporary file in the + // same folder as the JAR file if (fname != null) { try { File tmpfolder = new File(fname).getAbsoluteFile().getParentFile(); - tmpfile = File.createTempFile(fname, ".tmp" + suffix, tmpfolder); + tmpfile = File.createTempFile(tmpbase, ".tmp" + suffix, tmpfolder); } catch (IOException ioe) { // Last option failed - fall gracefully fatalError(ioe); diff --git a/test/jdk/tools/jar/JarCreateFileNameTest.java b/test/jdk/tools/jar/JarCreateFileNameTest.java new file mode 100644 index 00000000000..fb2b6a2e732 --- /dev/null +++ b/test/jdk/tools/jar/JarCreateFileNameTest.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2024, 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. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.jar.JarFile; +import java.util.spi.ToolProvider; +import java.util.zip.ZipEntry; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +/* + * @test + * @bug 8302293 + * @summary verify that a JAR file creation through "jar --create" operation + * works fine if the JAR file name is less than 3 characters in length + * @run junit JarCreateFileNameTest + */ +public class JarCreateFileNameTest { + + private static final ToolProvider JAR_TOOL = ToolProvider.findFirst("jar") + .orElseThrow(() -> + new RuntimeException("jar tool not found") + ); + + /* + * Launches "jar --create --file" with file names of varying lengths and verifies + * that the JAR file was successfully created. + */ + @ParameterizedTest + @ValueSource(strings = {"abcd", "abc", "ab", "a", "d.jar", "ef.jar"}) + void testCreate(final String targetJarFileName) throws Exception { + final Path cwd = Path.of("."); + final Path tmpFile = Files.createTempFile(cwd, "8302293", ".txt"); + final String fileName = tmpFile.getFileName().toString(); + final int exitCode = JAR_TOOL.run(System.out, System.err, + "--create", "--file", targetJarFileName, fileName); + assertEquals(0, exitCode, "jar command failed"); + // verify the JAR file is created and contains the expected entry + try (final JarFile jarFile = new JarFile(new File(targetJarFileName))) { + final ZipEntry entry = jarFile.getEntry(fileName); + assertNotNull(entry, "missing " + fileName + " entry in JAR file " + targetJarFileName); + } + } +} +