Subject: Re: bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result

From: Kazuhiro Ito <[email-masked]>
Date: Thu, 25 Aug 2011 18:49:52 +0900

> > > (progn
> > >   (goto-char (point-min))
> > >   (insert #x80)
> > >   (insert (make-string 16 ?A))
> > >   (encode-coding-region 1 18 'ctext-unix))
> > > 
> > > backtrace is below.  Please let me know if you need more information.
> > > 
> > > 
> > > Program received signal SIGSEGV, Segmentation fault.
> > > 0x0000000000557419 in mark_object (arg=4702111234474983745) at alloc.c:5473
> > > 5473            if (STRING_MARKED_P (ptr))
> > 
> > I think relocation of buffer may cause the problem.
> > 
> > The comment for CODING_DECODE_CHAR macro in coding.c says as below.
> > 
> > > /* 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.  */
> > 
> > encode_coding_iso_2022() uses ENCODE_ISO_CHARACTER macro, which uses
> > ENCODE_CHAR macro.  ENCODE_CHAR macro calls encode_char() and it may
> > load a charset map.
> 
> But which pointer(s) in encode_coding_iso_2022 can be altered by
> relocation?  

encode_coding() sets coding->destination with coding_set_destination()
before calling encode_coding_iso_2022().  I think at least correct
value of coding->destination can change in encode_coding_iso_2022() by
loading charset maps.

> Do you actually see any of the pointers used by this
> function modified by relocation of some buffer?

No, beacuse I don't know how to see.

-- 
Kazuhiro Ito