summaryrefslogtreecommitdiff
path: root/src/buffer.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2015-11-06 17:19:39 +0200
committerEli Zaretskii <eliz@gnu.org>2015-11-06 17:19:39 +0200
commit564d811725596f15ecf543777e11504b47d2af86 (patch)
tree5d2569aedec23e0dc68c2c3c03d3277bbade0134 /src/buffer.c
parent3172a6ac39d98383451e8b36cd33d291347fc93b (diff)
downloademacs-564d811725596f15ecf543777e11504b47d2af86.tar.gz
Don't invoke overlay modification hooks in wrong buffer
* src/buffer.c (report_overlay_modification): When called with AFTER non-zero, don't invoke overlay modification hooks if the buffer recorded in last_overlay_modification_hooks is different from the current buffer. (Bug#21824)
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/buffer.c b/src/buffer.c
index 91e42dca2bf..c0179c7584e 100644
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -4481,6 +4481,23 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after,
Lisp_Object *copy;
ptrdiff_t i;
+ if (size)
+ {
+ Lisp_Object ovl
+ = XVECTOR (last_overlay_modification_hooks)->contents[1];
+
+ /* If the buffer of the first overlay in the array doesn't
+ match the current buffer, then these modification hooks
+ should not be run in this buffer. This could happen when
+ some code calls some insdel functions, such as del_range_1,
+ with the PREPARE argument false -- in that case this
+ function is never called to record the overlay modification
+ hook functions in the last_overlay_modification_hooks
+ array, so anything we find there is not ours. */
+ if (XMARKER (OVERLAY_START (ovl))->buffer != current_buffer)
+ return;
+ }
+
USE_SAFE_ALLOCA;
SAFE_ALLOCA_LISP (copy, size);
memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents,