* CCL_WRITE_CHAR and CCL_WRITE_MULTIBYTE_CHAR
@ 2008-01-17 2:37 YAMAMOTO Mitsuharu
2008-01-31 11:35 ` Kenichi Handa
0 siblings, 1 reply; 4+ messages in thread
From: YAMAMOTO Mitsuharu @ 2008-01-17 2:37 UTC (permalink / raw)
To: emacs-devel
I suspect the boundary checking in CCL_WRITE_CHAR and
CCL_WRITE_MULTIBYTE_CHAR can be relaxed by 1. I mean,
else if (dst + bytes + extra_bytes <= (dst_bytes ? dst_end : src)) \
instead of
else if (dst + bytes + extra_bytes < (dst_bytes ? dst_end : src)) \
I have a situation where the destination buffer size is tight and the
last byte is not filled.
YAMAMOTO Mitsuharu
mituharu@math.s.chiba-u.ac.jp
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: CCL_WRITE_CHAR and CCL_WRITE_MULTIBYTE_CHAR
2008-01-17 2:37 CCL_WRITE_CHAR and CCL_WRITE_MULTIBYTE_CHAR YAMAMOTO Mitsuharu
@ 2008-01-31 11:35 ` Kenichi Handa
2008-01-31 12:37 ` YAMAMOTO Mitsuharu
0 siblings, 1 reply; 4+ messages in thread
From: Kenichi Handa @ 2008-01-31 11:35 UTC (permalink / raw)
To: YAMAMOTO Mitsuharu; +Cc: emacs-devel
In article <wlejchrxch.wl%mituharu@math.s.chiba-u.ac.jp>, YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:
> I suspect the boundary checking in CCL_WRITE_CHAR and
> CCL_WRITE_MULTIBYTE_CHAR can be relaxed by 1. I mean,
> else if (dst + bytes + extra_bytes <= (dst_bytes ? dst_end : src)) \
> instead of
> else if (dst + bytes + extra_bytes < (dst_bytes ? dst_end : src)) \
At least, in CCL_WRITE_CHAR, that change is not safe because
extra_bytes will be incremented after that check. I've just
installed the attached change to the main trunk. I dared
not install that change to EMACS_22_BASE because I'm still
not that confident about the change. In addition the
problem has not been revealed so long, and it can be avoided
by giving a bigger BUFFER_MAGNIFICATION in
define-ccl-program.
---
Kenichi Handa
handa@ni.aist.go.jp
Index: ccl.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/ccl.c,v
retrieving revision 1.102
retrieving revision 1.103
diff -u -r1.102 -r1.103
--- ccl.c 8 Jan 2008 20:44:20 -0000 1.102
+++ ccl.c 31 Jan 2008 11:27:46 -0000 1.103
@@ -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;
> I have a situation where the destination buffer size is tight and the
> last byte is not filled.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: CCL_WRITE_CHAR and CCL_WRITE_MULTIBYTE_CHAR
2008-01-31 11:35 ` Kenichi Handa
@ 2008-01-31 12:37 ` YAMAMOTO Mitsuharu
2008-02-01 1:21 ` Kenichi Handa
0 siblings, 1 reply; 4+ messages in thread
From: YAMAMOTO Mitsuharu @ 2008-01-31 12:37 UTC (permalink / raw)
To: handa; +Cc: emacs-devel
[-- Attachment #1: Type: Text/Plain, Size: 2810 bytes --]
>>>>> On Thu, 31 Jan 2008 20:35:34 +0900, Kenichi Handa <handa@ni.aist.go.jp> said:
> At least, in CCL_WRITE_CHAR, that change is not safe because
> extra_bytes will be incremented after that check.
But in the original code, extra_bytes is initialized to 1, not 0, in
the case that increment occurs.
> I've just installed the attached change to the main trunk. I dared
> not install that change to EMACS_22_BASE because I'm still not that
> confident about the change. In addition the problem has not been
> revealed so long, and it can be avoided by giving a bigger
> BUFFER_MAGNIFICATION in define-ccl-program.
I'm planning to add some event handlers to the Carbon port after the
Emacs 22.2 release so we can look up a word pointed to by the mouse in
dictionaries using Command-Control-D. That hander requires us to fill
a given storage with a specified range of buffer text in UTF-16. (I'm
thinking about BMP-only case.) The size of the storage in bytes is
exactly twice as large as the length of the range. That's the "tight
situation" I mentioned in the previous mail.
YAMAMOTO Mitsuharu
mituharu@math.s.chiba-u.ac.jp
/* Store the text of the buffer BUF from START to END as Unicode
characters in CHARACTERS. Return non-zero if successful. */
int
mac_store_buffer_text_to_unicode_chars (buf, start, end, characters)
struct buffer *buf;
int start, end;
UniChar *characters;
{
int start_byte, end_byte, char_count, byte_count;
struct coding_system coding;
unsigned char *dst = (unsigned char *) characters;
start_byte = buf_charpos_to_bytepos (buf, start);
end_byte = buf_charpos_to_bytepos (buf, end);
char_count = end - start;
byte_count = end_byte - start_byte;
if (setup_coding_system (
#ifdef WORDS_BIG_ENDIAN
intern ("utf-16be")
#else
intern ("utf-16le")
#endif
, &coding) < 0)
return 0;
coding.src_multibyte = !NILP (buf->enable_multibyte_characters);
coding.dst_multibyte = 0;
coding.mode |= CODING_MODE_LAST_BLOCK;
coding.composing = COMPOSITION_DISABLED;
if (BUF_GPT_BYTE (buf) <= start_byte || end_byte <= BUF_GPT_BYTE (buf))
encode_coding (&coding, BUF_BYTE_ADDRESS (buf, start_byte), dst,
byte_count, char_count * sizeof (UniChar));
else
{
int first_byte_count = BUF_GPT_BYTE (buf) - start_byte;
encode_coding (&coding, BUF_BYTE_ADDRESS (buf, start_byte), dst,
first_byte_count, char_count * sizeof (UniChar));
if (coding.result == CODING_FINISH_NORMAL)
encode_coding (&coding,
BUF_BYTE_ADDRESS (buf, start_byte + first_byte_count),
dst + coding.produced,
byte_count - first_byte_count,
char_count * sizeof (UniChar) - coding.produced);
}
if (coding.result != CODING_FINISH_NORMAL)
return 0;
return 1;
}
[-- Attachment #2: image.png --]
[-- Type: Image/Png, Size: 26160 bytes --]
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: CCL_WRITE_CHAR and CCL_WRITE_MULTIBYTE_CHAR
2008-01-31 12:37 ` YAMAMOTO Mitsuharu
@ 2008-02-01 1:21 ` Kenichi Handa
0 siblings, 0 replies; 4+ messages in thread
From: Kenichi Handa @ 2008-02-01 1:21 UTC (permalink / raw)
To: YAMAMOTO Mitsuharu; +Cc: emacs-devel
In article <20080131.213724.217838043.mituharu@math.s.chiba-u.ac.jp>, YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp> writes:
> [1 <text/plain; us-ascii (7bit)>]
>>>>>> On Thu, 31 Jan 2008 20:35:34 +0900, Kenichi Handa <handa@ni.aist.go.jp> said:
> > At least, in CCL_WRITE_CHAR, that change is not safe because
> > extra_bytes will be incremented after that check.
> But in the original code, extra_bytes is initialized to 1, not 0, in
> the case that increment occurs.
Ah, I recalled why I used that tricky logic. Ok, I've just
installed your change in EMACS_22_BASE, and cancel the last
change in the trunk. So, the change in EMACS_22_BASE will
propagate to the trunk eventually.
---
Kenichi Handa
handa@ni.aist.go.jp
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2008-02-01 1:21 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-01-17 2:37 CCL_WRITE_CHAR and CCL_WRITE_MULTIBYTE_CHAR YAMAMOTO Mitsuharu
2008-01-31 11:35 ` Kenichi Handa
2008-01-31 12:37 ` YAMAMOTO Mitsuharu
2008-02-01 1:21 ` Kenichi Handa
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).