diff options
author | Janne Blomqvist <jb@gcc.gnu.org> | 2009-06-04 00:07:19 +0300 |
---|---|---|
committer | Janne Blomqvist <jb@gcc.gnu.org> | 2009-06-04 00:07:19 +0300 |
commit | 0c40d2340abd3c04b3134c0719dbfc79ee871209 (patch) | |
tree | b47a5d4594631fea4f6b7a382efb4bab88cddbcd | |
parent | 9e0667cd3a217c480333130a07cdb9641eada30e (diff) | |
download | gcc-0c40d2340abd3c04b3134c0719dbfc79ee871209.zip gcc-0c40d2340abd3c04b3134c0719dbfc79ee871209.tar.gz gcc-0c40d2340abd3c04b3134c0719dbfc79ee871209.tar.bz2 |
re PR libfortran/40330 (incorrect IO)
PR libfortran/40330
Use heap memory for cached format strings.
From-SVN: r148149
-rw-r--r-- | libgfortran/ChangeLog | 6 | ||||
-rw-r--r-- | libgfortran/io/format.c | 13 |
2 files changed, 17 insertions, 2 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 2d27d03..c120493 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,9 @@ +2009-06-04 Janne Blomqvist <jb@gcc.gnu.org> + + PR libfortran/40330 + * io/format.c (free_format_hash_table): Also free and nullify hash key. + (save_parsed_format): Copy string rather than pointer copy. + 2009-05-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org> PR fortran/40019 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; } |