Commit a47c20a7 by Tom Tromey Committed by Tom Tromey

defineclass.cc (handleField): Throw exception if field name is duplicated.

	* defineclass.cc (handleField): Throw exception if field name is
	duplicated.
	(handleMethod): Throw exception for duplicate method.

From-SVN: r69928
parent b33ab7a9
2003-07-29 Tom Tromey <tromey@redhat.com> 2003-07-29 Tom Tromey <tromey@redhat.com>
* defineclass.cc (handleField): Throw exception if field name is
duplicated.
(handleMethod): Throw exception for duplicate method.
2003-07-29 Tom Tromey <tromey@redhat.com>
* gnu/gcj/convert/natIconv.cc (write): Handle case where * gnu/gcj/convert/natIconv.cc (write): Handle case where
output buffer is too small. output buffer is too small.
......
...@@ -75,7 +75,7 @@ struct _Jv_ClassReader { ...@@ -75,7 +75,7 @@ struct _Jv_ClassReader {
// allways on. You always want this as far as I can see, but it also // allways on. You always want this as far as I can see, but it also
// controls weither identifiers and type descriptors/signatures are // controls weither identifiers and type descriptors/signatures are
// verified as legal. This could be somewhat more expensive since it // verified as legal. This could be somewhat more expensive since it
// will call Characher.isJavaIdentifier{Start,Part} for each character // will call Character.isJavaIdentifier{Start,Part} for each character
// in any identifier (field name or method name) it comes by. Thus, // in any identifier (field name or method name) it comes by. Thus,
// it might be useful to turn off this verification for classes that // it might be useful to turn off this verification for classes that
// come from a trusted source. However, for GCJ, trusted classes are // come from a trusted source. However, for GCJ, trusted classes are
...@@ -403,15 +403,15 @@ void _Jv_ClassReader::read_fields () ...@@ -403,15 +403,15 @@ void _Jv_ClassReader::read_fields ()
int name_index = read2u (); int name_index = read2u ();
int descriptor_index = read2u (); int descriptor_index = read2u ();
int attributes_count = read2u (); int attributes_count = read2u ();
check_tag (name_index, JV_CONSTANT_Utf8); check_tag (name_index, JV_CONSTANT_Utf8);
prepare_pool_entry (name_index, JV_CONSTANT_Utf8); prepare_pool_entry (name_index, JV_CONSTANT_Utf8);
check_tag (descriptor_index, JV_CONSTANT_Utf8); check_tag (descriptor_index, JV_CONSTANT_Utf8);
prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8); prepare_pool_entry (descriptor_index, JV_CONSTANT_Utf8);
handleField (i, access_flags, name_index, descriptor_index); handleField (i, access_flags, name_index, descriptor_index);
for (int j = 0; j < attributes_count; j++) for (int j = 0; j < attributes_count; j++)
{ {
read_one_field_attribute (i); read_one_field_attribute (i);
...@@ -1071,14 +1071,25 @@ void _Jv_ClassReader::handleField (int field_no, ...@@ -1071,14 +1071,25 @@ void _Jv_ClassReader::handleField (int field_no,
field->nameIndex = name; field->nameIndex = name;
#endif #endif
if (verify) // Ignore flags we don't know about.
verify_identifier (field_name);
// ignore flags we don't know about.
field->flags = flags & Modifier::ALL_FLAGS; field->flags = flags & Modifier::ALL_FLAGS;
_Jv_Utf8Const* sig = pool_data[desc].utf8;
if (verify) if (verify)
{ {
verify_identifier (field_name);
for (int i = 0; i < field_no; ++i)
{
if (_Jv_equalUtf8Consts (field_name, def->fields[i].name)
&& _Jv_equalUtf8Consts (sig,
// We know the other fields are
// unresolved.
(_Jv_Utf8Const *) def->fields[i].type))
throw_class_format_error ("duplicate field name");
}
if (field->flags & (Modifier::SYNCHRONIZED if (field->flags & (Modifier::SYNCHRONIZED
| Modifier::NATIVE | Modifier::NATIVE
| Modifier::INTERFACE | Modifier::INTERFACE
...@@ -1091,8 +1102,6 @@ void _Jv_ClassReader::handleField (int field_no, ...@@ -1091,8 +1102,6 @@ void _Jv_ClassReader::handleField (int field_no,
throw_class_format_error ("erroneous field access flags"); throw_class_format_error ("erroneous field access flags");
} }
_Jv_Utf8Const* sig = pool_data[desc].utf8;
if (verify) if (verify)
_Jv_VerifyFieldSignature (sig); _Jv_VerifyFieldSignature (sig);
...@@ -1233,6 +1242,14 @@ void _Jv_ClassReader::handleMethod ...@@ -1233,6 +1242,14 @@ void _Jv_ClassReader::handleMethod
_Jv_VerifyMethodSignature (method->signature); _Jv_VerifyMethodSignature (method->signature);
for (int i = 0; i < mth_index; ++i)
{
if (_Jv_equalUtf8Consts (method->name, def->methods[i].name)
&& _Jv_equalUtf8Consts (method->signature,
def->methods[i].signature))
throw_class_format_error ("duplicate method");
}
if (method->accflags & (Modifier::VOLATILE if (method->accflags & (Modifier::VOLATILE
| Modifier::TRANSIENT | Modifier::TRANSIENT
| Modifier::INTERFACE)) | Modifier::INTERFACE))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment