From 6545ef83c162894776c23e0a9811d6cadc1bff66 Mon Sep 17 00:00:00 2001
From: Thomas Koenig <Thomas.Koenig@online.de>
Date: Sun, 28 May 2006 20:25:15 +0000
Subject: [PATCH] string_intrinsics.c (compare_string): Use memcmp instead of
 strncmp to avoid tripping over CHAR(0) in a string.

2006-05-28  Thomas Koenig  <Thomas.Koenig@online.de>

	* intrinsics/string_intrinsics.c (compare_string):
	Use memcmp instead of strncmp to avoid tripping over
	CHAR(0) in a string.

2006-05-28  Thomas Koenig  <Thomas.Koenig@online.de>

	* gfortran.dg/string_null_compare_1.f:  New test case.

From-SVN: r114175
---
 gcc/testsuite/ChangeLog                           |  6 ++++++
 gcc/testsuite/gfortran.dg/string_null_compare_1.f | 15 +++++++++++++++
 libgfortran/ChangeLog                             |  6 ++++++
 libgfortran/intrinsics/string_intrinsics.c        |  2 +-
 4 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gfortran.dg/string_null_compare_1.f

diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 786b6cae445c..96c5729e5341 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2006-05-28  Thomas Koenig  <Thomas.Koenig@online.de>
+
+	* intrinsics/string_intrinsics.c (compare_string):
+	Use memcmp instead of strncmp to avoid tripping over
+	CHAR(0) in a string.
+
 2006-05-27  Richard Guenther  <rguenther@suse.de>
 
 	PR middle-end/27773
diff --git a/gcc/testsuite/gfortran.dg/string_null_compare_1.f b/gcc/testsuite/gfortran.dg/string_null_compare_1.f
new file mode 100644
index 000000000000..2e6eb1b2b88f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/string_null_compare_1.f
@@ -0,0 +1,15 @@
+! { dg-do run }
+! PR 27784 - Different strings should compare unequal even if they
+!            have CHAR(0) in them.
+
+      program main
+      character*3 str1, str2
+      call setval(str1, str2)
+      if (str1 == str2) call abort
+      end
+
+      subroutine setval(str1, str2)
+      character*3 str1, str2
+      str1 = 'a' // CHAR(0) // 'a'
+      str2 = 'a' // CHAR(0) // 'c'
+      end
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 4a31e484a2c1..50ebaf230c06 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,9 @@
+2006-05-28  Thomas Koenig  <Thomas.Koenig@online.de>
+
+	* intrinsics/string_intrinsics.c (compare_string):
+	Use memcmp instead of strncmp to avoid tripping over
+	CHAR(0) in a string.
+
 2006-05-27  Janne Blomqvist  <jb@gcc.gnu.org>
 
 	* io/io.h (find_or_create_unit): Correct export declaration.
diff --git a/libgfortran/intrinsics/string_intrinsics.c b/libgfortran/intrinsics/string_intrinsics.c
index eed41d71c8a0..1bc4ff220122 100644
--- a/libgfortran/intrinsics/string_intrinsics.c
+++ b/libgfortran/intrinsics/string_intrinsics.c
@@ -109,7 +109,7 @@ compare_string (GFC_INTEGER_4 len1, const char * s1,
   const char *s;
   int len;
 
-  res = strncmp (s1, s2, (len1 < len2) ? len1 : len2);
+  res = memcmp (s1, s2, (len1 < len2) ? len1 : len2);
   if (res != 0)
     return res;
 
-- 
GitLab