mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-04 11:00:45 -08:00
Fix bug in decoding emacs-mule encoding.
coding.c (decode_coding_emacs_mule): Fixup pointers to buffer text that could be relocated inside the call to emacs_mule_char. (emacs_mule_char): Use CODING_DECODE_CHAR instead of DECODE_CHAR. (CODING_DECODE_CHAR): Add a comment describing its purpose.
This commit is contained in:
parent
9cf3544e3b
commit
75f80e63ca
2 changed files with 26 additions and 1 deletions
|
|
@ -1,3 +1,10 @@
|
||||||
|
2010-03-02 Eli Zaretskii <eliz@gnu.org>
|
||||||
|
|
||||||
|
* coding.c (decode_coding_emacs_mule): Fixup pointers to buffer
|
||||||
|
text that could be relocated inside the call to emacs_mule_char.
|
||||||
|
(emacs_mule_char): Use CODING_DECODE_CHAR instead of DECODE_CHAR.
|
||||||
|
(CODING_DECODE_CHAR): Add a comment describing its purpose.
|
||||||
|
|
||||||
2010-03-02 Kenichi Handa <handa@m17n.org>
|
2010-03-02 Kenichi Handa <handa@m17n.org>
|
||||||
|
|
||||||
* character.c (parse_str_as_multibyte): Fix handling of the
|
* character.c (parse_str_as_multibyte): Fix handling of the
|
||||||
|
|
|
||||||
20
src/coding.c
20
src/coding.c
|
|
@ -1005,6 +1005,10 @@ record_conversion_result (struct coding_system *coding,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This wrapper macro is used to preserve validity of pointers into
|
||||||
|
buffer text across calls to decode_char, which could cause
|
||||||
|
relocation of buffers if it loads a charset map, because loading a
|
||||||
|
charset map allocates large structures. */
|
||||||
#define CODING_DECODE_CHAR(coding, src, src_base, src_end, charset, code, c) \
|
#define CODING_DECODE_CHAR(coding, src, src_base, src_end, charset, code, c) \
|
||||||
do { \
|
do { \
|
||||||
charset_map_loaded = 0; \
|
charset_map_loaded = 0; \
|
||||||
|
|
@ -2178,7 +2182,7 @@ emacs_mule_char (coding, src, nbytes, nchars, id, cmp_status)
|
||||||
default:
|
default:
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
c = DECODE_CHAR (charset, code);
|
CODING_DECODE_CHAR (coding, src, src_base, src_end, charset, code, c);
|
||||||
if (c < 0)
|
if (c < 0)
|
||||||
goto invalid_code;
|
goto invalid_code;
|
||||||
}
|
}
|
||||||
|
|
@ -2525,9 +2529,23 @@ decode_coding_emacs_mule (coding)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int nchars, nbytes;
|
int nchars, nbytes;
|
||||||
|
/* emacs_mule_char can load a charset map from a file, which
|
||||||
|
allocates a large structure and might cause buffer text
|
||||||
|
to be relocated as result. Thus, we need to remember the
|
||||||
|
original pointer to buffer text, and fixup all related
|
||||||
|
pointers after the call. */
|
||||||
|
const unsigned char *orig = coding->source;
|
||||||
|
EMACS_INT offset;
|
||||||
|
|
||||||
c = emacs_mule_char (coding, src_base, &nbytes, &nchars, &id,
|
c = emacs_mule_char (coding, src_base, &nbytes, &nchars, &id,
|
||||||
cmp_status);
|
cmp_status);
|
||||||
|
offset = coding->source - orig;
|
||||||
|
if (offset)
|
||||||
|
{
|
||||||
|
src += offset;
|
||||||
|
src_base += offset;
|
||||||
|
src_end += offset;
|
||||||
|
}
|
||||||
if (c < 0)
|
if (c < 0)
|
||||||
{
|
{
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue