aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBud Davis <bdavis9659@comcast.net>2004-05-13 10:11:02 +0000
committerBud Davis <bdavis@gcc.gnu.org>2004-05-13 10:11:02 +0000
commit92fbb7592bbd3899a7b2ca98b4ac0e9f857fe114 (patch)
tree6b9d1350b0d987f11cd8edd85e5f95c559f990bd
parent014251eae30e30a6cc960f41c939d24ffed00066 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.fortran-torture/execute/adjustr.f9046
-rw-r--r--libgfortran/ChangeLog5
-rw-r--r--libgfortran/intrinsics/string_intrinsics.c5
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 );
}