about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--iconvdata/ibm937.c20
2 files changed, 16 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index ebd6a3889f..19a36067e8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2001-01-06  Ulrich Drepper  <drepper@redhat.com>
+
+	* iconvdata/ibm937.c (BODY to IBM937): Correct several mistakes in
+	buffer and table handling.
+
 2001-01-05  H.J. Lu  <hjl@gnu.org>
 
 	* elf/dl-support.c (non_dynamic_init): Move the auxiliary
diff --git a/iconvdata/ibm937.c b/iconvdata/ibm937.c
index 6da55ae883..4fee56a506 100644
--- a/iconvdata/ibm937.c
+++ b/iconvdata/ibm937.c
@@ -188,13 +188,15 @@ enum
 									      \
     /* Use the UCS4 table for single byte.  */				      \
     cp = __ucs4_to_ibm937sb[ch];					      \
-    if (__builtin_expect (ch >= sizeof (__ucs4_to_ibm937sb)		      \
-			  / sizeof (__ucs4_to_ibm937sb[0]), 0)		      \
+    if (__builtin_expect (ch >= (sizeof (__ucs4_to_ibm937sb)		      \
+				 / sizeof (__ucs4_to_ibm937sb[0])), 0)	      \
 	|| (__builtin_expect (cp[0], '\1') == '\0' && ch != 0))		      \
       {									      \
 	/* Use the UCS4 table for double byte.  */			      \
 	cp = __ucs4_to_ibm937db[ch];					      \
-	if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)		      \
+	if (__builtin_expect (ch >= (sizeof (__ucs4_to_ibm937db)	      \
+				     / sizeof (__ucs4_to_ibm937db[0])), 0)    \
+	    || __builtin_expect (cp[0], '\1') == '\0')			      \
 	  {								      \
 	    /* This is an illegal character.  */			      \
 	    if (! ignore_errors_p ())					      \
@@ -209,13 +211,13 @@ enum
 	    if (curcs == sb)						      \
 	      {								      \
 		*outptr++ = SO;						      \
-		if (__builtin_expect (outptr == outend, 0))		      \
-		  {							      \
-		    result = __GCONV_FULL_OUTPUT;			      \
-		    break;						      \
-		  }							      \
 		curcs = db;						      \
 	      }								      \
+	    if (__builtin_expect (outptr + 1 >= outend, 0))		      \
+	      {								      \
+		result = __GCONV_FULL_OUTPUT;				      \
+		break;							      \
+	      }								      \
 	    *outptr++ = cp[0];						      \
 	    *outptr++ = cp[1];						      \
 	  }								      \
@@ -225,13 +227,13 @@ enum
 	if (curcs == db)						      \
 	  {								      \
 	    *outptr++ = SI;						      \
+	    curcs = sb;							      \
 	    if (__builtin_expect (outptr == outend, 0))			      \
 	      {								      \
 		result = __GCONV_FULL_OUTPUT;				      \
 		break;							      \
 	      }								      \
 	  }								      \
-	curcs = sb;							      \
 	*outptr++ = cp[0];						      \
       }									      \
 									      \