From: Bud Davis Date: Thu, 13 May 2004 10:11:02 +0000 (+0000) Subject: re PR libfortran/15204 (ADJUSTR intrinsic accesses corrupted pointer) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=92fbb7592bbd3899a7b2ca98b4ac0e9f857fe114;p=platform%2Fupstream%2Fgcc.git re PR libfortran/15204 (ADJUSTR intrinsic accesses corrupted pointer) PR fortran/15294 * gfortran.fortran-torture/execute/adjustr.f90: New file. * io/intrinsic/string_intrinsics.c(adjustr): rework logic. From-SVN: r81771 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7f62d4b..be4920e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-05-13 Bud Davis + + PR fortran/15294 + * gfortran.fortran-torture/execute/adjustr.f90: New file. + 2004-05-13 Diego Novillo Merge from tree-ssa-20020619-branch. See diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/adjustr.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/adjustr.f90 new file mode 100644 index 0000000..8264ba7 --- /dev/null +++ b/gcc/testsuite/gfortran.fortran-torture/execute/adjustr.f90 @@ -0,0 +1,46 @@ +! pr 15294 - [gfortran] ADJUSTR intrinsic accesses corrupted pointer +! + program test_adjustr + implicit none + integer test_cases + parameter (test_cases=13) + integer i + character(len=10) s1(test_cases), s2(test_cases) + s1(1)='A' + s2(1)=' A' + s1(2)='AB' + s2(2)=' AB' + s1(3)='ABC' + s2(3)=' ABC' + s1(4)='ABCD' + s2(4)=' ABCD' + s1(5)='ABCDE' + s2(5)=' ABCDE' + s1(6)='ABCDEF' + s2(6)=' ABCDEF' + s1(7)='ABCDEFG' + s2(7)=' ABCDEFG' + s1(8)='ABCDEFGH' + s2(8)=' ABCDEFGH' + s1(9)='ABCDEFGHI' + s2(9)=' ABCDEFGHI' + s1(10)='ABCDEFGHIJ' + s2(10)='ABCDEFGHIJ' + s1(11)='' + s2(11)='' + s1(12)=' ' + s2(12)=' ' + s1(13)=' ' + s2(13)=' ' + do I = 1,test_cases + print*,i + print*, 's1 = "', s1(i), '"' + print*, 's2 = "', s2(i), '"' + print*, 'adjustr(s1) = "', adjustr(s1(i)), '"' + if (adjustr(s1(i)).ne.s2(i)) then + print*,'fail' + call abort + endif + enddo + + end program test_adjustr diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog index 1f4dd23..b597f52 100644 --- a/libgfortran/ChangeLog +++ b/libgfortran/ChangeLog @@ -1,3 +1,8 @@ +2004-05-13 Bud Davis + + PR fortran/15294 + * io/intrinsic/string_intrinsics.c(adjustr): rework logic. + 2004-05-06 Rainer Orth Steven Bosscher diff --git a/libgfortran/intrinsics/string_intrinsics.c b/libgfortran/intrinsics/string_intrinsics.c index 999807e..2cd07a2 100644 --- a/libgfortran/intrinsics/string_intrinsics.c +++ b/libgfortran/intrinsics/string_intrinsics.c @@ -276,12 +276,11 @@ adjustr (char *dest, GFC_INTEGER_4 len, const char *src) i = len; while (i > 0 && src[i - 1] == ' ') - i++; + i--; if (i < len) - memcpy (&dest[len - i], &src, i); - if (i < len) memset (dest, ' ', len - i); + memcpy (dest + (len - i), src, i ); }