This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran 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]

Re: [Patch, libgfortran] PR 40330 Fix use of saved format strings


On Wed, Jun 3, 2009 at 22:00, Janne Blomqvist <blomqvist.janne@gmail.com> wrote:
> Hi,
>
> the attached patch fixes PR 40330. The problem was that for the saved
> format strings we were just keeping pointer to the strings that reside
> in the st_parameter_dt structure. However, this lives on the stack so
> once it goes out of scope the cached entries became invalid. Fixed by
> using heap storage.
>
> Regtested on x86_64-unknown-linux-gnu, Ok for trunk and 4.4?

Upon some further though, realloc() is not appropriate here.
Simplified patch attached.

Regtested on x86_64-unknown-linux-gnu, Ok for trunk and 4.4?


-- 
Janne Blomqvist

Attachment: ChangeLog.2
Description: Binary data

diff --git a/libgfortran/io/format.c b/libgfortran/io/format.c
index a1ec43c..2c116d6 100644
--- a/libgfortran/io/format.c
+++ b/libgfortran/io/format.c
@@ -87,7 +87,12 @@ free_format_hash_table (gfc_unit *u)
   for (i = 0; i < FORMAT_HASH_SIZE; i++)
     {
       if (u->format_hash_table[i].hashed_fmt != NULL)
-	free_format_data (u->format_hash_table[i].hashed_fmt);
+	{
+	  free_format_data (u->format_hash_table[i].hashed_fmt);
+	  free_mem (u->format_hash_table[i].key);
+	}
+      u->format_hash_table[i].key = NULL;
+      u->format_hash_table[i].key_len = 0;      
       u->format_hash_table[i].hashed_fmt = NULL;
     }
 }
@@ -164,7 +169,11 @@ save_parsed_format (st_parameter_dt *dtp)
     free_format_data (u->format_hash_table[hash].hashed_fmt);
   u->format_hash_table[hash].hashed_fmt = NULL;
 
-  u->format_hash_table[hash].key = dtp->format;
+  if (u->format_hash_table[hash].key != NULL)
+    free_mem (u->format_hash_table[hash].key);
+  u->format_hash_table[hash].key = get_mem (dtp->format_len);
+  memcpy (u->format_hash_table[hash].key, dtp->format, dtp->format_len);
+
   u->format_hash_table[hash].key_len = dtp->format_len;
   u->format_hash_table[hash].hashed_fmt = dtp->u.p.fmt;
 }

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