This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: Patch: java.io.ObjectInputStream.java


Hi list,


I commited the attached patch from Guilhem Lavaux to merge more with classpath 
again. This patch lets the set*Field methods throw an InvalidClassException 
if the field hasn't the required type.


Michael
Index: ChangeLog
===================================================================
RCS file: /cvs/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2442
diff -u -b -B -r1.2442 ChangeLog
--- ChangeLog	16 Dec 2003 11:35:39 -0000	1.2442
+++ ChangeLog	16 Dec 2003 11:44:53 -0000
@@ -1,3 +1,17 @@
+ 2003-12-16 Guilhem Lavaux <guilhem@kaffe.org>
+  
+	* java/io/ObjectInputStream.java (setBooleanField):
+	Throw an InvalidClassException if the field hasn't the required type,
+	documentation added.
+	(setByteField) Likewise.
+	(setCharField) Likewise.
+	(setDoubleField) Likewise.
+	(setFloatField) Likewise.
+	(setIntField) Likewise.
+	(setShortField) Likewise.
+	(setLongField) Likewise.
+	(setObjectField) Likewise.
+
 2003-12-16 Guilhem Lavaux <guilhem@kaffe.org>
            Helmer Kraemer <hkraemer@freenet.de>
  
Index: java/io/ObjectInputStream.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/io/ObjectInputStream.java,v
retrieving revision 1.20
diff -u -b -B -r1.20 ObjectInputStream.java
--- java/io/ObjectInputStream.java	1 Aug 2003 03:34:52 -0000	1.20
+++ java/io/ObjectInputStream.java	16 Dec 2003 11:44:53 -0000
@@ -1482,125 +1482,260 @@
 
   private native void callConstructor (Class clazz, Object obj);
 
+  /**
+   * This method writes a "boolean" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The boolean value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setBooleanField (Object obj, Class klass, String field_name,
-				boolean val)
+				boolean val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setBoolean (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
+  /**
+   * This method writes a "byte" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The byte value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setByteField (Object obj, Class klass, String field_name,
-			     byte val)
+			     byte val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setByte (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
+  /**
+   * This method writes a "character" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The character value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setCharField (Object obj, Class klass, String field_name,
-			     char val)
+			     char val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setChar (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
+  /**
+   * This method writes a "double" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The double value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setDoubleField (Object obj, Class klass, String field_name,
-			       double val)
+			       double val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setDouble (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
+  /**
+   * This method writes a "float" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The float value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setFloatField (Object obj, Class klass, String field_name,
-			      float val)
+			      float val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setFloat (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
+  /**
+   * This method writes an "integer" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The integer value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setIntField (Object obj, Class klass, String field_name,
-			    int val)
+			    int val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setInt (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
-
+  /**
+   * This method writes the long value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The long value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setLongField (Object obj, Class klass, String field_name,
-			     long val)
+			     long val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setLong (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
-
+  /**
+   * This method writes a "short" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The short value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setShortField (Object obj, Class klass, String field_name,
-			      short val)
+			      short val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
 	f.setShort (obj, val);
       }
+    catch (IllegalArgumentException _)
+      {
+	throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
+      }
     catch (Exception _)
       {
       }    
   }
 
-
+  /**
+   * This method writes an "object" value <code>val</code> in the specified field
+   * of the instance <code>obj</code> of the type <code>klass</code>.
+   *
+   * @param obj Instance to setup.
+   * @param klass Class type of the specified instance.
+   * @param field_name Name of the field in the specified class type.
+   * @param val The "object" value to write into the field.
+   * @throws InvalidClassException if the specified field has not the required type.
+   * @throws IOException if there is no field of that name in the specified class.
+   */
   private void setObjectField (Object obj, Class klass, String field_name,
-			       String type_code, Object val)
+			       String type_code, Object val) throws IOException, InvalidClassException
   {
     try
       {
 	Field f = getField (klass, field_name);
-	// FIXME: We should check the type_code here
+	ObjectStreamField of = new ObjectStreamField(field_name, f.getType());
+	
+	if (of.getTypeString() == null ||
+	    !of.getTypeString().equals(type_code))
+          throw new InvalidClassException("incompatible field type for " + klass.getName() + "." + field_name);
 	f.set (obj, val);
       }
-    catch (Exception _)
+    catch (InvalidClassException e)
       {
+	throw e;
       }    
+    catch (Exception _)
+      {}
   }
 
   private static final int BUFFER_SIZE = 1024;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]