summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKenichi Handa <handa@m17n.org>2008-01-31 11:27:46 +0000
committerKenichi Handa <handa@m17n.org>2008-01-31 11:27:46 +0000
commit8d99a0b354137e307fc729ec31cd65088e324adf (patch)
treefa5d5cea5b0412a6e75e3553972c7d98bb238829
parent08cf830bbd55a241619a6d0a4b53ad44c8d187c6 (diff)
downloademacs-8d99a0b354137e307fc729ec31cd65088e324adf.tar.gz
(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.
-rw-r--r--src/ccl.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/ccl.c b/src/ccl.c
index 0b0439933f9..9f7baf0b4ff 100644
--- a/src/ccl.c
+++ b/src/ccl.c
@@ -748,16 +748,13 @@ while(0)
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 @@ while(0)
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 @@ ccl_driver (ccl, source, destination, src_bytes, dst_bytes, consumed)
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;