From: Kenichi Handa Date: Sun, 30 Sep 2012 13:25:11 +0000 (+0900) Subject: coding.c (decode_coding_ccl, encode_coding_ccl): Pay attention to the buffer relocati... X-Git-Tag: emacs-24.2.90~245 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=95402d5faa114a311cabfb8c64cf22a93787a066;p=emacs.git coding.c (decode_coding_ccl, encode_coding_ccl): Pay attention to the buffer relocation which may be caused by ccl_driver. --- diff --git a/src/ChangeLog b/src/ChangeLog index 676f4127ba5..508ac9925a8 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2012-09-30 Kenichi Handa + + * coding.c (decode_coding_ccl, encode_coding_ccl): Pay attention + to the buffer relocation which may be caused by ccl_driver. + 2012-09-22 Paul Eggert * .gdbinit: Just stop at fatal_error_backtrace. diff --git a/src/coding.c b/src/coding.c index 4b3d22f956c..40e67b9a6c8 100644 --- a/src/coding.c +++ b/src/coding.c @@ -5106,6 +5106,7 @@ decode_coding_ccl (struct coding_system *coding) while (1) { const unsigned char *p = src; + ptrdiff_t offset; int i = 0; if (multibytep) @@ -5123,8 +5124,17 @@ decode_coding_ccl (struct coding_system *coding) if (p == src_end && coding->mode & CODING_MODE_LAST_BLOCK) ccl->last_block = 1; + /* As ccl_driver calls DECODE_CHAR, buffer may be relocated. */ + charset_map_loaded = 0; ccl_driver (ccl, source_charbuf, charbuf, i, charbuf_end - charbuf, charset_list); + if (charset_map_loaded + && (offset = coding_change_source (coding))) + { + p += offset; + src += offset; + src_end += offset; + } charbuf += ccl->produced; if (multibytep) src += source_byteidx[ccl->consumed]; @@ -5177,8 +5187,15 @@ encode_coding_ccl (struct coding_system *coding) do { + ptrdiff_t offset; + + /* As ccl_driver calls DECODE_CHAR, buffer may be relocated. */ + charset_map_loaded = 0; ccl_driver (ccl, charbuf, destination_charbuf, charbuf_end - charbuf, 1024, charset_list); + if (charset_map_loaded + && (offset = coding_change_destination (coding))) + dst += offset; if (multibytep) { ASSURE_DESTINATION (ccl->produced * 2);