I'm checking this in.

Lillian and others have run into problems with our URLClassLoader not
handling the Class-Path attribute correctly.  I caused this regression
when I implemented index.list handling.

I tracked the problem down to 2 bugs.  One is that we weren't clearing
the index map if we didn't see an index.  Fixing this exposed another
bug, namely that sometimes a Class-Path attribute in a jar will
include the jar itself (this occurs in the jfreechart demo, for
instance), yielding infinite recursion.

Tom

2006-06-14  Tom Tromey  <[EMAIL PROTECTED]>

        * gnu/java/net/loader/JarURLLoader.java (initialize): Skip our own
        jar.
        * gnu/java/net/IndexListParser.java (IndexListParser): Call clearAll
        when index entry does not exist.

Index: gnu/java/net/IndexListParser.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/net/IndexListParser.java,v
retrieving revision 1.3
diff -u -r1.3 IndexListParser.java
--- gnu/java/net/IndexListParser.java   19 May 2006 20:58:59 -0000      1.3
+++ gnu/java/net/IndexListParser.java   14 Jun 2006 14:27:29 -0000
@@ -125,7 +125,11 @@
 
         br.close();
       }
-    // else INDEX.LIST does not exist
+    else
+      {
+        // INDEX.LIST does not exist
+        clearAll();
+      }
     }
     catch (Exception ex)
     {
Index: gnu/java/net/loader/JarURLLoader.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/net/loader/JarURLLoader.java,v
retrieving revision 1.4
diff -u -r1.4 JarURLLoader.java
--- gnu/java/net/loader/JarURLLoader.java       21 May 2006 11:35:08 -0000      
1.4
+++ gnu/java/net/loader/JarURLLoader.java       14 Jun 2006 14:27:29 -0000
@@ -135,6 +135,11 @@
                 try
                   {
                     URL subURL = new URL(baseURL, e);
+                    // We've seen at least one jar file whose Class-Path
+                    // attribute includes the original jar.  If we process
+                    // that normally we end up with infinite recursion.
+                    if (subURL.equals(baseURL))
+                      continue;
                     JarURLLoader subLoader = new JarURLLoader(classloader,
                                                               cache, factory,
                                                               subURL, subURL);

Reply via email to