[kaffe] CVS kaffe (guilhem): RMI/Serialization fix. resolveClass called after reading fields in

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Tue Aug 19 23:22:02 2003


PatchSet 3963 
Date: 2003/08/20 06:19:15
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
RMI/Serialization fix. resolveClass called after reading fields in
readClassDescriptor.

This fix includes also a slight code cleanup in the method.

Members: 
	ChangeLog:1.1561->1.1562 
	libraries/javalib/java/io/ObjectInputStream.java:1.23->1.24 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1561 kaffe/ChangeLog:1.1562
--- kaffe/ChangeLog:1.1561	Tue Aug 19 10:30:22 2003
+++ kaffe/ChangeLog	Wed Aug 20 06:19:15 2003
@@ -1,3 +1,10 @@
+2003-08-20  Guilhem Lavaux <guilhem@kaffe.org>
+
+	* libraries/javalib/java/io/ObjectInputStream.java:
+	(readClassDescriptor) call resolveClass(ObjectStreamClass)
+	at the right moment ant not resolveClass(String) at the top of
+	the method. This could cause problems in RMI.
+
 2003-08-19  Guilhem Lavaux <guilhem@kaffe.org>
 
 	* libraries/javalib/java/text/RuleBasedCollator.java:
Index: kaffe/libraries/javalib/java/io/ObjectInputStream.java
diff -u kaffe/libraries/javalib/java/io/ObjectInputStream.java:1.23 kaffe/libraries/javalib/java/io/ObjectInputStream.java:1.24
--- kaffe/libraries/javalib/java/io/ObjectInputStream.java:1.23	Thu Aug 14 17:07:51 2003
+++ kaffe/libraries/javalib/java/io/ObjectInputStream.java	Wed Aug 20 06:19:16 2003
@@ -426,12 +426,13 @@
     byte flags = this.realInputStream.readByte ();
     short field_count = this.realInputStream.readShort ();
     ObjectStreamField[] fields = new ObjectStreamField[field_count];
-    Class clazz = resolveClass(name);
     ObjectStreamClass osc = new ObjectStreamClass (name, uid,
                                                    flags, fields);
     assignNewHandle (osc);
 
-    dumpElementln("CLASSDESC NAME=" + name + "; UID=" + Long.toHexString(uid) + "; FLAGS=" + Integer.toHexString(flags) + "; FIELD COUNT=" + field_count);
+    dumpElementln("CLASSDESC NAME=" + name + "; UID=" + Long.toHexString(uid)
+		  + "; FLAGS=" + Integer.toHexString(flags) + "; FIELD COUNT="
+		  + field_count);
     
     int real_count = 0;
     for (int i=0; i < field_count; i++)
@@ -469,38 +470,32 @@
 	  class_name = String.valueOf (type_code);
 	  of = new ObjectStreamField (field_name, class_name);
 	}
-		  
+	
+	fields[i] = of;
+      }
+
+    /* Now that fields have been read we may resolve the class
+     * (and read annotation if needed). */
+    Class clazz = resolveClass(osc);
+    
+    for (int i=0; i < field_count; i++)
+      {
 	Field f;
+	
 	try
-	{
-	  f = clazz.getDeclaredField (field_name);
-	  if (f == null)
-	    throw new NoSuchFieldException();
-	  if (!f.getType().equals(of.getType()))
-	    throw new InvalidClassException("invalid field type for " + field_name + " in class " + class_name + " (requested was \"" + of.getType() + " and found \"" + f.getType() + "\")"); 
-	}
+	  {
+	    f = clazz.getDeclaredField (fields[i].getName());
+	    if (f != null && !f.getType().equals(fields[i].getType()))
+	      throw new InvalidClassException("invalid field type for " +
+			      fields[i].getName() + " in class " + name +
+			      " (requested was \"" + fields[i].getType() +
+			      " and found \"" + f.getType() + "\")"); 
+	  }
 	catch (NoSuchFieldException _)
-	{
-	}
-
-	fields[real_count] = of;
-	real_count++;
-
+	  {
+	  }
       }
-    if (real_count != fields.length)
-    {
-      ObjectStreamField[] new_fields = new ObjectStreamField[real_count];
-	    
-      System.arraycopy(fields, 0, new_fields, 0, real_count);
-      fields = new_fields;
-    }
 
-    /* Just before computing fields related parameters we must
-     * update it in the descriptor according to the just computed
-     * adaptation.
-     */
-    osc.fields = fields;
- 
     boolean oldmode = setBlockDataMode (true);
     osc.setClass (clazz, lookupClass(clazz.getSuperclass()));
     classLookupTable.put (clazz, osc);