Mercurial > hg > release > icedtea-web-1.7
changeset 1455:de61ea5636e1
Fixed pr3417
* netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: nested jars go into subdirectory instead alongside parent
* tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: test for the issue
* tests/netx/unit/net/sourceforge/jnlp/runtime/pf.jar-orig: jar with nested name clash
author | Jiri Vanek <jvanek@redhat.com> |
---|---|
date | Fri, 07 Jul 2017 16:18:26 +0200 |
parents | 05816fb84c59 |
children | 9562ebf56181 |
files | ChangeLog netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java tests/netx/unit/net/sourceforge/jnlp/runtime/pf.jar-orig |
diffstat | 4 files changed, 68 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Wed Jun 28 19:32:19 2017 +0200 +++ b/ChangeLog Fri Jul 07 16:18:26 2017 +0200 @@ -1,3 +1,10 @@ +2017-07-07 Jiri Vanek <jvanek@redhat.com> + + Fixed pr3417 + * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java: nested jars go into subdirectory instead alongside parent + * tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java: test for the issue + * tests/netx/unit/net/sourceforge/jnlp/runtime/pf.jar-orig: jar with nested name clash + 2017-06-28 Jiri Vanek <jvanek@redhat.com> Tereza Hlavackova <hlavackova.tereza@gmail.com>
--- a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java Wed Jun 28 19:32:19 2017 +0200 +++ b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java Fri Jul 07 16:18:26 2017 +0200 @@ -1263,7 +1263,7 @@ // (inline loading with "jar:..!/..." path will not work // with standard classloader methods) - String extractedJarLocation = localFile.getParent() + "/" + je.getName(); + String extractedJarLocation = localFile + ".nested/" + je.getName(); File parentDir = new File(extractedJarLocation).getParentFile(); if (!parentDir.isDirectory() && !parentDir.mkdirs()) { throw new RuntimeException(R("RNestedJarExtration"));
--- a/tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java Wed Jun 28 19:32:19 2017 +0200 +++ b/tests/netx/unit/net/sourceforge/jnlp/runtime/JNLPClassLoaderTest.java Fri Jul 07 16:18:26 2017 +0200 @@ -33,7 +33,6 @@ obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ - package net.sourceforge.jnlp.runtime; import static net.sourceforge.jnlp.util.FileTestUtils.assertNoFileLeak; @@ -42,11 +41,18 @@ import static org.junit.Assert.fail; import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.nio.file.Files; import java.util.Arrays; +import java.util.List; import java.util.jar.Attributes; import java.util.jar.Manifest; +import net.sourceforge.jnlp.JARDesc; import net.sourceforge.jnlp.LaunchException; +import net.sourceforge.jnlp.annotations.Bug; +import net.sourceforge.jnlp.browsertesting.browsers.firefox.FirefoxProfilesOperator; import net.sourceforge.jnlp.cache.UpdatePolicy; import net.sourceforge.jnlp.config.DeploymentConfiguration; import net.sourceforge.jnlp.mock.DummyJNLPFileWithJar; @@ -60,12 +66,11 @@ import org.junit.Test; -public class JNLPClassLoaderTest extends NoStdOutErrTest{ +public class JNLPClassLoaderTest extends NoStdOutErrTest { private static AppletSecurityLevel level; public static String askUser; - - + @BeforeClass public static void setPermissions() { level = AppletStartupSecuritySettings.getInstance().getSecurityLevel(); @@ -76,16 +81,18 @@ public static void resetPermissions() { JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_LEVEL, level.toChars()); } + @BeforeClass - public static void noDialogs(){ - askUser = JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER); - JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, Boolean.toString(false)); + public static void noDialogs() { + askUser = JNLPRuntime.getConfiguration().getProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER); + JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, Boolean.toString(false)); } - + @AfterClass - public static void restoreDialogs(){ - JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, askUser); + public static void restoreDialogs() { + JNLPRuntime.getConfiguration().setProperty(DeploymentConfiguration.KEY_SECURITY_PROMPT_USER, askUser); } + /* Note: Only does file leak testing for now. */ @Test public void constructorFileLeakTest() throws Exception { @@ -95,7 +102,7 @@ final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); - assertNoFileLeak( new Runnable () { + assertNoFileLeak(new Runnable() { @Override public void run() { try { @@ -118,14 +125,14 @@ final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS); - assertNoFileLeak( new Runnable () { + assertNoFileLeak(new Runnable() { @Override public void run() { - assertFalse(classLoader.isInvalidJar(jnlpFile.getJarDesc())); + assertFalse(classLoader.isInvalidJar(jnlpFile.getJarDesc())); } }); } - + @Test public void getMainClassNameTest() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); @@ -147,7 +154,7 @@ }); } } - + @Test public void getMainClassNameTestEmpty() throws Exception { /* Test with-out any main-class specified */ { @@ -185,10 +192,10 @@ fail(e.toString()); } } - }); + }); assertFalse(classLoader.hasMainJar()); } - + @Test public void getCustomAtributes() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); @@ -263,7 +270,6 @@ Manifest manifest5 = new Manifest(); manifest5.getMainAttributes().put(Attributes.Name.IMPLEMENTATION_URL, "some url1"); //see DummyJNLPFileWithJar constructor with int - FileTestUtils.createJarWithContents(jarLocation1, manifest1); FileTestUtils.createJarWithContents(jarLocation2, manifest2); FileTestUtils.createJarWithContents(jarLocation3, manifest3); @@ -289,8 +295,7 @@ } }); } - - + @Test public void tryNullManifest() throws Exception { File tempDirectory = FileTestUtils.createTempDirectory(); @@ -323,4 +328,39 @@ Assert.assertNull(exs[0]); Assert.assertNull(exs[1]); } + + @Test + @Bug(id = "PR3417") + /** + * The nested jar must be more 1024 bytes long. Better, longer + * then byte[] bytes = new byte[1024] on line 1273 in + * net.sourceforge.jnlp.runtime.JNLPClassLoader otherwise the file + * will not get rewritten while read Also there must be more then + * one item of this size, for same reason + */ + public void testNameClashInNestedJars() throws Exception { + //for this test is enought to not crash jvm + boolean verifyBackup = JNLPRuntime.isVerifying(); + File dirHolder = File.createTempFile("pf-", ".jar"); + dirHolder.deleteOnExit(); + File jarLocation = new File(dirHolder.getParentFile(), "pf.jar"); + jarLocation.deleteOnExit(); + try { + //it is invalid jar, so we have to disable checks first + JNLPRuntime.setVerify(false); + InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("net/sourceforge/jnlp/runtime/pf.jar-orig"); + Files.copy(is, jarLocation.toPath()); + final DummyJNLPFileWithJar jnlpFile = new DummyJNLPFileWithJar(jarLocation); + final JNLPClassLoader classLoader = new JNLPClassLoader(jnlpFile, UpdatePolicy.ALWAYS) { + @Override + protected void activateJars(List<JARDesc> jars) { + super.activateJars(jars); + } + + }; + } finally { + JNLPRuntime.setVerify(verifyBackup); + } + + } }