From: Kenichi Handa <handa@m17n.org>
Subject: potential bug in display_mode_element?
Date: Mon, 12 Sep 2005 09:58:52 +0900 [thread overview]
Message-ID: <E1EEceq-0000U4-00@etlken> (raw)
I got a bug report for emacs-unicode-2, and it seems that
the same bug exists in HEAD too. The backtrace is this:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread -1208118624 (LWP 29169)]
0x080b7349 in display_mode_element (it=0xbfffd1b0, depth=10, field_width=0, precision=-63, elt=164196259, props=138499373, risky=0) at xdisp.c:16136
16136 while ((precision <= 0 || n < precision)
(gdb) xbacktrace
"execute-extended-command"
"call-interactively"
(gdb) bt full
#0 0x080b7349 in display_mode_element (it=0xbfffd1b0, depth=10, field_width=0, precision=-63, elt=164196259, props=138499373, risky=0) at xdisp.c:16136
c = 0 '\0'
this = (const unsigned char *) 0xaf7a101 <Address 0xaf7a101 out of bounds>
lisp_string = (const unsigned char *) 0xaf7a0fc <Address 0xaf7a0fc out of bounds>
n = 5
field = 138382657
prec = 5
literal = 0
Here the strange thing is that list_string points an address
out of bounds. It is initialized as this:
this = SDATA (elt);
lisp_string = this;
if (literal)
/* omitted because not relevant now */
while ((precision <= 0 || n < precision)
&& *this
&& (mode_line_target != MODE_LINE_DISPLAY
|| it->current_x < it->last_visible_x))
...
and never changed in the while loop. So the only reason I
can think of why the address pointed by list_string becomes
out of bound is that the string data of ELT was relocated in
the loop and the original address was returned to OS.
Actually, display_string is called in the loop, and it will
run Lisp code.
So, I think we meed this change. What do you think?
*** xdisp.c 10 Sep 2005 09:35:12 +0900 1.1050
--- xdisp.c 10 Sep 2005 18:58:05 +0900
***************
*** 16036,16042 ****
--- 16036,16047 ----
&& (mode_line_target != MODE_LINE_DISPLAY
|| it->current_x < it->last_visible_x))
{
+ /* Never change the value of LAST in this block. */
const unsigned char *last = this;
+ /* String data of ELT may be relocated. In such a case,
+ OFFSET can be used to make THIS correctly points into
+ the string data of ELT. */
+ int offset = this - SDATA (elt);
/* Advance to end of string or next format specifier. */
while ((c = *this++) != '\0' && c != '%')
***************
*** 16171,16176 ****
--- 16176,16182 ----
else /* c == 0 */
break;
}
+ this = SDATA (elt) + offset + (this - last);
}
}
break;
---
Kenichi Handa
handa@m17n.org
next reply other threads:[~2005-09-12 0:58 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-09-12 0:58 Kenichi Handa [this message]
2005-09-12 8:04 ` potential bug in display_mode_element? Kim F. Storm
2005-09-12 11:54 ` Kenichi Handa
2005-09-12 12:41 ` Potential GC-related problems in compose_chars_in_text Kim F. Storm
2005-09-13 1:08 ` Kenichi Handa
2005-09-13 15:54 ` Richard M. Stallman
2005-09-14 7:29 ` Kenichi Handa
2005-09-15 2:41 ` Richard M. Stallman
2005-09-15 4:21 ` Kenichi Handa
2005-09-16 1:01 ` Richard M. Stallman
2005-09-16 15:39 ` Stefan Monnier
2005-09-17 13:39 ` Richard M. Stallman
2005-09-19 13:43 ` Stefan Monnier
2005-09-12 15:34 ` potential bug in display_mode_element? Richard M. Stallman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=E1EEceq-0000U4-00@etlken \
--to=handa@m17n.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.