diff options
author | Zoltan Varga <vargaz@gmail.com> | 2004-09-08 01:06:24 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2004-09-08 01:06:24 +0400 |
commit | 71d75502b25da18717ef43bab6fd71b7b72ee469 (patch) | |
tree | cd9f4d2d16b237bd94419e36fb3047de58a5c6ce | |
parent | a8069eda9496233b69e91abbb6c6fe188ad9e52e (diff) |
Merge from HEAD.
svn path=/branches/mono-1-0/mono/; revision=33543
-rw-r--r-- | mono/metadata/ChangeLog | 8 | ||||
-rw-r--r-- | mono/metadata/image.c | 21 |
2 files changed, 25 insertions, 4 deletions
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog index b1069f1191d..dae3a475786 100644 --- a/mono/metadata/ChangeLog +++ b/mono/metadata/ChangeLog @@ -1,3 +1,11 @@ +2004-09-08 Zoltan Varga <vargaz@freemail.hu> + + * image.c (mono_image_close): Applied patch from + vasantha.paulraj@honeywell.com (Vasantha selvi). Fix crash when an + assembly is loaded multiple times from data. + + * image.c (mono_image_open): Fix warning. + 2004-09-07 Zoltan Varga <vargaz@freemail.hu> * reflection.c (mono_reflection_create_runtime_class): Initialize diff --git a/mono/metadata/image.c b/mono/metadata/image.c index 8b0473429ed..01c9644be34 100644 --- a/mono/metadata/image.c +++ b/mono/metadata/image.c @@ -849,12 +849,12 @@ MonoImage * mono_image_open (const char *fname, MonoImageOpenStatus *status) { MonoImage *image, *image2; - const char *absfname; + char *absfname; g_return_val_if_fail (fname != NULL, NULL); if (g_path_is_absolute (fname)) - absfname = fname; + absfname = (char*)fname; else { gchar *path = g_get_current_dir (); absfname = g_build_filename (path, fname, NULL); @@ -960,9 +960,22 @@ mono_image_close (MonoImage *image) if (image->f) fclose (image->f); - if (image->raw_data_allocated) - g_free (image->raw_data); + if (image->raw_data_allocated) { + /* image->raw_metadata and cli_sections might lie inside image->raw_data */ + MonoCLIImageInfo *ii = image->image_info; + int i; + + if ((image->raw_metadata > image->raw_data) && + (image->raw_metadata <= (image->raw_data + image->raw_data_len))) + image->raw_metadata = NULL; + for (i = 0; i < ii->cli_section_count; i++) + if (((char*)(ii->cli_sections [i]) > image->raw_data) && + ((char*)(ii->cli_sections [i]) <= ((char*)image->raw_data + image->raw_data_len))) + ii->cli_sections [i] = NULL; + + g_free (image->raw_data); + } g_free (image->name); g_free (image->files); |