X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fmetadata-verify.c;h=72991f977fa567f2167123bdefe4cb6c15f6323e;hb=01ea58cbd474d4a9230acbba5571738896539d42;hp=8b09a3f77c737e51c4afd20d66942c524713b611;hpb=96c3489edfcec8a49705241a106bc61513815658;p=mono.git diff --git a/mono/metadata/metadata-verify.c b/mono/metadata/metadata-verify.c index 8b09a3f77c7..72991f977fa 100644 --- a/mono/metadata/metadata-verify.c +++ b/mono/metadata/metadata-verify.c @@ -138,7 +138,7 @@ const static unsigned char coded_index_desc[] = { 5, /*tables*/ MONO_TABLE_TYPEDEF, MONO_TABLE_TYPEREF, - MONO_TABLE_MODULE, + MONO_TABLE_MODULEREF, MONO_TABLE_METHOD, MONO_TABLE_TYPESPEC, @@ -2434,6 +2434,9 @@ verify_typedef_table (VerifyContext *ctx) if (data [MONO_TYPEDEF_EXTENDS] && !is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, data [MONO_TYPEDEF_EXTENDS])) ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d extend field coded index 0x%08x", i, data [MONO_TYPEDEF_EXTENDS])); + if (data [MONO_TYPEDEF_EXTENDS] && !get_coded_index_token (TYPEDEF_OR_REF_DESC, data [MONO_TYPEDEF_EXTENDS])) + ADD_ERROR (ctx, g_strdup_printf ("Invalid typedef row %d zero coded extend field coded index 0x%08x", i, data [MONO_TYPEDEF_EXTENDS])); + visibility = data [MONO_TYPEDEF_FLAGS] & TYPE_ATTRIBUTE_VISIBILITY_MASK; if ((visibility >= TYPE_ATTRIBUTE_NESTED_PUBLIC && visibility <= TYPE_ATTRIBUTE_NESTED_FAM_OR_ASSEM) && search_sorted_table (ctx, MONO_TABLE_NESTEDCLASS, MONO_NESTED_CLASS_NESTED, i + 1) == -1) @@ -2586,7 +2589,7 @@ verify_field_table_full (VerifyContext *ctx) } /*bits 8,9,10,11,13,14,15*/ -#define INVALID_METHOD_IMPLFLAG_BITS ((1 << 8) | (1 << 9) | (1 << 10) | (1 << 11) | (1 << 13) | (1 << 14) | (1 << 15)) +#define INVALID_METHOD_IMPLFLAG_BITS ((1 << 9) | (1 << 10) | (1 << 11) | (1 << 13) | (1 << 14) | (1 << 15)) static void verify_method_table (VerifyContext *ctx) { @@ -2682,8 +2685,8 @@ verify_method_table (VerifyContext *ctx) //TODO check signature contents if (rva) { - if (flags & METHOD_ATTRIBUTE_ABSTRACT) - ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d has RVA != 0 but is Abstract", i)); + if ((flags & (METHOD_ATTRIBUTE_ABSTRACT | METHOD_ATTRIBUTE_PINVOKE_IMPL)) || (implflags & METHOD_IMPL_ATTRIBUTE_INTERNAL_CALL)) + ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d has RVA != 0 but is either Abstract, InternalCall or PinvokeImpl", i)); if (code_type == METHOD_IMPL_ATTRIBUTE_OPTIL) ADD_ERROR (ctx, g_strdup_printf ("Invalid method row %d has RVA != 0 but is CodeTypeMask is neither Native, CIL or Runtime", i)); } else { @@ -3366,7 +3369,7 @@ verify_fieldrva_table (VerifyContext *ctx) } } -#define INVALID_ASSEMBLY_FLAGS_BITS ~((1 << 0) | (1 << 4) | (1 << 8) | (1 << 14) | (1 << 15)) +#define INVALID_ASSEMBLY_FLAGS_BITS ~((1 << 0) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7) | (1 << 8) | (1 << 14) | (1 << 15)) static void verify_assembly_table (VerifyContext *ctx) { @@ -3398,7 +3401,7 @@ verify_assembly_table (VerifyContext *ctx) } } -#define INVALID_ASSEMBLYREF_FLAGS_BITS ~(1) +#define INVALID_ASSEMBLYREF_FLAGS_BITS ~((1 << 0) | (1 << 8) | (1 << 14) | (1 << 15)) static void verify_assemblyref_table (VerifyContext *ctx) { @@ -4281,14 +4284,14 @@ mono_verifier_verify_methodimpl_row (MonoImage *image, guint32 row, MonoError *e mono_metadata_decode_row (table, row, data, MONO_METHODIMPL_SIZE); body = method_from_method_def_or_ref (image, data [MONO_METHODIMPL_BODY], NULL); - if (mono_loader_get_last_error ()) { + if (!body || mono_loader_get_last_error ()) { mono_loader_clear_error (); mono_error_set_bad_image (error, image, "Invalid methodimpl body for row %x", row); return FALSE; } declaration = method_from_method_def_or_ref (image, data [MONO_METHODIMPL_DECLARATION], NULL); - if (mono_loader_get_last_error ()) { + if (!declaration || mono_loader_get_last_error ()) { mono_loader_clear_error (); mono_error_set_bad_image (error, image, "Invalid methodimpl declaration for row %x", row); return FALSE;