Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2004-09-08 01:06:24 +0400
committerZoltan Varga <vargaz@gmail.com>2004-09-08 01:06:24 +0400
commit71d75502b25da18717ef43bab6fd71b7b72ee469 (patch)
treecd9f4d2d16b237bd94419e36fb3047de58a5c6ce
parenta8069eda9496233b69e91abbb6c6fe188ad9e52e (diff)
Merge from HEAD.
svn path=/branches/mono-1-0/mono/; revision=33543
-rw-r--r--mono/metadata/ChangeLog8
-rw-r--r--mono/metadata/image.c21
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);