GNU bug report logs -
#8219
23.3; Crash in indirect buffer
Previous Next
Reported by: Chong Yidong <cyd <at> stupidchicken.com>
Date: Thu, 10 Mar 2011 20:25:02 UTC
Severity: normal
Merged with 1242
Found in version 23.3
Done: Chong Yidong <cyd <at> stupidchicken.com>
Bug is archived. No further changes may be made.
Full log
Message #16 received at 8219 <at> debbugs.gnu.org (full text, mbox):
Indirect bufffers are allowed to have their own values of point,
BUF_BEGV, and BUF_ZV (indeed, that's one of their roles). Their other
attributes inherit from the base buffer, e.g.
#define BUF_Z(buf) ((buf)->text->z)
where `text' points to the base buffer's text object.
Now consider what happens when a deletion is performed in buffer A,
which is the base buffer for an indirect buffer B. It appears that the
responsible functions, such as del_range_2, only update the attributes
of buffer A, making no effort to update buffer B.
Hence, in the aftermath of a deletion, buffer B's values of PT (and
BUF_BEGV and BUF_ZV) can be larger than BUF_ZV. This is the proximate
cause of the crash in Bug#8219: there, we have
if (prev_pt > BUF_BEGV (buf) && prev_pt < BUF_ZV (buf)
&& find_composition (prev_pt, -1, &start, &end, &prop, buffer)
and find_composition aborts because prev_pt is larger than the size of
the buffer.
I'm not sure what the best solution is. The narrowest fix is to change
find_composition, and the functions it calls, so that it does not abort
when supplied with a position that's beyond BUF_Z. This might be the
best approach for the emacs-23 branch.
However, I suspect that we have other places in the code that assumes
that if a point is smaller than BUF_ZV, it's necessarily smaller than
BUF_Z---which we now see if not that case. So, a more comprehensive fix
is needed for the trunk.
Any thoughts?
This bug report was last modified 14 years and 71 days ago.
Previous Next
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997,2003 nCipher Corporation Ltd,
1994-97 Ian Jackson.