[icedtea-web] RFC: Patch to fix PR794 (Class-Path element processing)

Deepak Bhole dbhole at redhat.com
Tue Sep 27 15:07:59 PDT 2011


Hi,

Attached patch fixes PR794:
http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=794

ChangeLog:
2011-09-27  Deepak Bhole <dbhole at redhat.com>

    PR794: IcedTea-Web does not work if a Web Start app jar has a Class-Path
    element in the manifest.
    * netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
    (retrieve): Blank out the Class-Path elements in manifest.
    * netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
    (activateJars): Only load Class-Path elements if this is an applet. Add a
    security mapping for jars from the Class-Path.

Okay for HEAD and 1.1?

1.0 needs a fix as well, but it is slightly different and not a priority so I will do it later.

Cheers,
Deepak
-------------- next part --------------
diff -r 0a1733685325 NEWS
--- a/NEWS	Fri Sep 23 12:14:39 2011 -0400
+++ b/NEWS	Tue Sep 27 18:02:12 2011 -0400
@@ -11,6 +11,8 @@
 New in release 1.1.3 (2011-XX-XX):
 * Plugin
   - PR782: Support building against npapi-sdk as well
+* Common
+  - PR794: IcedTea-Web does not work if a Web Start app jar has a Class-Path element in the manifest
 
 New in release 1.1.2 (2011-08-31):
 * Plugin
diff -r 0a1733685325 netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java
--- a/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java	Fri Sep 23 12:14:39 2011 -0400
+++ b/netx/net/sourceforge/jnlp/runtime/CachedJarFileCallback.java	Tue Sep 27 18:02:12 2011 -0400
@@ -94,7 +94,24 @@
 
         if (UrlUtils.isLocalFile(localUrl)) {
             // if it is known to us, just return the cached file
-            return new JarFile(localUrl.getPath());
+            JarFile returnFile = new JarFile(localUrl.getPath());
+            
+            try {
+                
+                // Blank out the class-path because:
+                // 1) Web Start does not support it
+                // 2) For the plug-in, we want to cache files from class-path so we do it manually
+                returnFile.getManifest().getMainAttributes().putValue("Class-Path", "");
+
+                if (JNLPRuntime.isDebug()) {
+                    System.err.println("Class-Path attribute cleared for " + returnFile.getName());
+                }
+
+            } catch (NullPointerException npe) {
+                // Discard NPE here. Maybe there was no manifest, maybe there were no attributes, etc.
+            }
+
+            return returnFile;
         } else {
             // throw new IllegalStateException("a non-local file in cache");
             return null;
diff -r 0a1733685325 netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java
--- a/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java	Fri Sep 23 12:14:39 2011 -0400
+++ b/netx/net/sourceforge/jnlp/runtime/JNLPClassLoader.java	Tue Sep 27 18:02:12 2011 -0400
@@ -669,6 +669,7 @@
                     // add jar
                     File localFile = tracker.getCacheFile(jar.getLocation());
                     try {
+                        SecurityDesc jarSecurity = file.getSecurity();
                         URL location = jar.getLocation(); // non-cacheable, use source location
                         if (localFile != null) {
                             // TODO: Should be toURI().toURL()
@@ -736,8 +737,6 @@
                                         CachedJarFileCallback.getInstance().addMapping(fakeRemote, fileURL);
                                         addURL(fakeRemote);
 
-                                        SecurityDesc jarSecurity = file.getSecurity();
-
                                         if (file instanceof PluginBridge) {
 
                                             URL codebase = null;
@@ -779,7 +778,15 @@
 
                             JarFile jarFile = new JarFile(localFile.getAbsolutePath());
                             Manifest mf = jarFile.getManifest();
-                            classpaths.addAll(getClassPathsFromManifest(mf, jar.getLocation().getPath()));
+
+                            if (file instanceof PluginBridge) {
+                                for (String classpath: getClassPathsFromManifest(mf, jar.getLocation().getPath())) {
+                                    URL codebaseURL = file.getCodeBase();
+                                    jarLocationSecurityMap.put(new URL(codebaseURL.getProtocol() + "://" + codebaseURL.getHost() + classpath), jarSecurity);
+                                    classpaths.add(classpath);
+                                }
+                            }
+
                             JarIndex index = JarIndex.getJarIndex(jarFile, null);
                             if (index != null)
                                 jarIndexes.add(index);


More information about the distro-pkg-dev mailing list