[patch, libgfortran] PR47778 reading two arrays of structures from namelist fails

Jerry DeLisle jvdelisle@frontier.com
Sun Feb 27 16:13:00 GMT 2011


On 02/27/2011 07:34 AM, Jerry DeLisle wrote:
> Hi all,
>
> The attached patch fixes this bug by resetting the pprev_nl pointer to NULL when
> the rank of the previous object read was zero. pprev_nl is used to track
> multiple reads from the same namelist variable.
>
> Regression tested on x86-64.
>
> OK for trunk? I suggest we should back port to 4.5 and possibly earlier.
>
> Regards,
>
> Jerry
>
> 2011-02-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
>
> PR libgfortran/47778
> * io/list_read.c (namelist_read): If pprev_nl was used during the
> previous namelist read and the rank was zero, reset the pointer to NULL
> for the next namelist read.
>
>
> Index: io/list_read.c
> ===================================================================
> --- io/list_read.c (revision 170543)
> +++ io/list_read.c (working copy)
> @@ -3058,6 +3058,8 @@
> goto nml_err_ret;
> generate_error (&dtp->common, LIBERROR_READ_VALUE, nml_err_msg);
> }
> + if (prev_nl && prev_nl->var_rank == 0)
> + prev_nl = NULL;
> }
>
> free_saved (dtp);

I am going to add this snippet as obvious.  There are code paths that can lead 
to unexpected calling of the error message without it being initialized as was 
the case with this PR before the fix.  This will prevent accessing uninitialized 
memory. ChangeLog will be adjusted.

Index: io/list_read.c
===================================================================
--- io/list_read.c	(revision 170543)
+++ io/list_read.c	(working copy)
@@ -2985,6 +2985,9 @@
  {
    int c;
    char nml_err_msg[200];
+
+  snprintf (nml_err_msg, sizeof nml_err_msg, "Internal namelist read error");
+
    /* Pointer to the previously read object, in case attempt is made to read
       new object name.  Should this fail, error message can give previous
       name.  */


Jerry



More information about the Fortran mailing list