This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [6 Regession] Usage of unitialized pointer io/list_read.c (
- From: Jerry DeLisle <jvdelisle at charter dot net>
- To: Dominique d'HumiÃres <dominiq at lps dot ens dot fr>
- Cc: fortran at gcc dot gnu dot org, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 16 Feb 2016 17:37:50 -0800
- Subject: Re: [6 Regession] Usage of unitialized pointer io/list_read.c (
- Authentication-results: sourceware.org; auth=none
- References: <B7792191-AC9E-422F-A4CE-27E0D3C8D499 at lps dot ens dot fr> <56C36361 dot 9010909 at charter dot net> <72204906-36E1-4ECF-BA54-20A79463F766 at lps dot ens dot fr>
See patch to fix this below.
On 02/16/2016 11:38 AM, Dominique d'Humières wrote:
> With the following reduced test
>
> program test
> implicit none
> integer :: i, j, k, ios
> integer, parameter :: big = 600
> character(kind=4,len=big) :: str1, str2
>
> do i=1,big, 10
> do j = 0, 9
> k = i + j
> str2(k:k) = char(65+j)
> end do
> end do
> open(15, status='scratch', encoding="utf-8")
> write(15,*) " 'abcdefgh!'", " ", str2
> rewind(15)
> read(15,*,iostat=ios) str1, str2
> close(15)
> end program
>
> valgrind shows a lot of errors before and after the commit.
>
> Dominique
>
>> Le 16 févr. 2016 à 18:58, Jerry DeLisle <jvdelisle@charter.net> a écrit :
>>
>> Up until now we have not had a test case like this for kind=4 testing. I did
>> try -fsanitize=address here and do see the same thing. I will work on this some
>> more.
>>
>> Thanks,
>>
>> Jerry
>
It was all messed up. This patch on current trunk fixes it here. Please test.
diff --git a/libgfortran/io/list_read.c b/libgfortran/io/list_read.c
index fcd4b6e..bebdd8c 100644
--- a/libgfortran/io/list_read.c
+++ b/libgfortran/io/list_read.c
@@ -119,7 +119,10 @@ push_char4 (st_parameter_dt *dtp, int c)
if (dtp->u.p.saved_used >= dtp->u.p.saved_length)
{
dtp->u.p.saved_length = 2 * dtp->u.p.saved_length;
- p = xrealloc (p, dtp->u.p.saved_length * sizeof (gfc_char4_t));
+ dtp->u.p.saved_string =
+ xrealloc (dtp->u.p.saved_string,
+ dtp->u.p.saved_length * sizeof (gfc_char4_t));
+ p = (gfc_char4_t *) dtp->u.p.saved_string;
}
p[dtp->u.p.saved_used++] = c;