]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid adverse side effects of fixing bug#21824
authorEli Zaretskii <eliz@gnu.org>
Sat, 15 Sep 2018 09:21:12 +0000 (12:21 +0300)
committerEli Zaretskii <eliz@gnu.org>
Sat, 15 Sep 2018 09:21:12 +0000 (12:21 +0300)
* test/src/buffer-tests.el
(overlay-modification-hooks-deleted-overlay): New test.

* src/buffer.c (report_overlay_modification): Don't bypass all
the overlay-modification hooks; instead, invoke each function
only if the buffer associated with the overlay is the current
buffer.  (Bug#30823)

src/buffer.c
test/src/buffer-tests.el

index b0cee717036d5a212edb4ee25e345df751e2dc15..179360c56221a1bfaeac77dbd7f9ef4048aed5b0 100644 (file)
@@ -4543,23 +4543,6 @@ 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,
@@ -4570,7 +4553,12 @@ report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after,
        Lisp_Object prop_i, overlay_i;
        prop_i = copy[i++];
        overlay_i = copy[i++];
-       call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
+       /* It is possible that the recorded overlay has been deleted
+          (which makes it's markers' buffers be nil), or that (due to
+          some bug) it belongs to a different buffer.  Only run this
+          hook if the overlay belongs to the current buffer.  */
+       if (XMARKER (OVERLAY_START (overlay_i))->buffer == current_buffer)
+         call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
       }
 
     SAFE_FREE ();
index f9c477fbfd78eaee004a14a1ca28589c8cd55bee..8479bbdda0beda99b7535e70ee77440b94c07dab 100644 (file)
@@ -45,6 +45,25 @@ with parameters from the *Messages* buffer modification."
             (should (eq buf (current-buffer))))
         (when msg-ov (delete-overlay msg-ov))))))
 
+(ert-deftest overlay-modification-hooks-deleted-overlay ()
+  "Test for bug#30823."
+  (let ((check-point nil)
+       (ov-delete nil)
+       (ov-set nil))
+    (with-temp-buffer
+      (insert "abc")
+      (setq ov-set (make-overlay 1 3))
+      (overlay-put ov-set 'modification-hooks
+                  (list (lambda (_o after &rest _args)
+                          (and after (setq check-point t)))))
+      (setq ov-delete (make-overlay 1 3))
+      (overlay-put ov-delete 'modification-hooks
+                  (list (lambda (o after &rest _args)
+                          (and (not after) (delete-overlay o)))))
+      (goto-char 2)
+      (insert "1")
+      (should (eq check-point t)))))
+
 (ert-deftest test-generate-new-buffer-name-bug27966 ()
   (should-not (string-equal "nil"
                             (progn (get-buffer-create "nil")