changeset 88092:7fe1dca6c680

(CCL_WRITE_CHAR): Increment extra_bytes only when ccl->eight_bit_control. Fix check for buffer overflow. (CCL_WRITE_MULTIBYTE_CHAR): Fix check for buffer overflow. (ccl_driver): Initialize extra_bytes to 0.
author Kenichi Handa <handa@m17n.org>
date Thu, 31 Jan 2008 11:27:46 +0000
parents 5260343f5526
children fa454b3c5b7b
files src/ccl.c
diffstat 1 files changed, 7 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/ccl.c	Thu Jan 31 10:59:14 2008 +0000
+++ b/src/ccl.c	Thu Jan 31 11:27:46 2008 +0000
@@ -748,16 +748,13 @@
     int bytes = SINGLE_BYTE_CHAR_P (ch) ? 1: CHAR_BYTES (ch);		\
     if (!dst)								\
       CCL_INVALID_CMD;							\
-    else if (dst + bytes + extra_bytes < (dst_bytes ? dst_end : src))	\
+    if (ccl->eight_bit_control						\
+	&& bytes == 1 && (ch) >= 0x80 && (ch) < 0xA0)			\
+      extra_bytes++;							\
+    if (dst + bytes + extra_bytes <= (dst_bytes ? dst_end : src))	\
       {									\
 	if (bytes == 1)							\
-	  {								\
-	    *dst++ = (ch);						\
-	    if (extra_bytes && (ch) >= 0x80 && (ch) < 0xA0)		\
-	      /* We may have to convert this eight-bit char to		\
-		 multibyte form later.  */				\
-	      extra_bytes++;						\
-	  }								\
+	  *dst++ = (ch);						\
 	else if (CHAR_VALID_P (ch, 0))					\
 	  dst += CHAR_STRING (ch, dst);					\
 	else								\
@@ -775,7 +772,7 @@
     int bytes = CHAR_BYTES (ch);					\
     if (!dst)								\
       CCL_INVALID_CMD;							\
-    else if (dst + bytes + extra_bytes < (dst_bytes ? dst_end : src))	\
+    else if (dst + bytes + extra_bytes <= (dst_bytes ? dst_end : src))	\
       {									\
 	if (CHAR_VALID_P ((ch), 0))					\
 	  dst += CHAR_STRING ((ch), dst);				\
@@ -919,7 +916,7 @@
      each of them will be converted to multibyte form of 2-byte
      sequence.  For that conversion, we remember how many more bytes
      we must keep in DESTINATION in this variable.  */
-  int extra_bytes = ccl->eight_bit_control;
+  int extra_bytes = 0;
   int eof_ic = ccl->eof_ic;
   int eof_hit = 0;