diff options
author | Bud Davis <bdavis9659@comcast.net> | 2004-05-13 10:11:02 +0000 |
---|---|---|
committer | Bud Davis <bdavis@gcc.gnu.org> | 2004-05-13 10:11:02 +0000 |
commit | 92fbb7592bbd3899a7b2ca98b4ac0e9f857fe114 (patch) | |
tree | 6b9d1350b0d987f11cd8edd85e5f95c559f990bd | |
parent | 014251eae30e30a6cc960f41c939d24ffed00066 (diff) | |
download | gcc-92fbb7592bbd3899a7b2ca98b4ac0e9f857fe114.zip gcc-92fbb7592bbd3899a7b2ca98b4ac0e9f857fe114.tar.gz gcc-92fbb7592bbd3899a7b2ca98b4ac0e9f857fe114.tar.bz2 |
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
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.fortran-torture/execute/adjustr.f90 | 46 | ||||
-rw-r--r-- | libgfortran/ChangeLog | 5 | ||||
-rw-r--r-- | libgfortran/intrinsics/string_intrinsics.c | 5 |
4 files changed, 58 insertions, 3 deletions
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 <bdavis9659@comcast.net> + + PR fortran/15294 + * gfortran.fortran-torture/execute/adjustr.f90: New file. + 2004-05-13 Diego Novillo <dnovillo@redhat.com> 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 <bdavis9659@comcast.net> + + PR fortran/15294 + * io/intrinsic/string_intrinsics.c(adjustr): rework logic. + 2004-05-06 Rainer Orth <ro@TechFak.Uni-Bielefeld.DE> Steven Bosscher <stevenb@suse.de> 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 ); } |