From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Noam Postavsky Newsgroups: gmane.emacs.bugs Subject: bug#35264: "Match data clobbered by buffer modification hooks" when hooks only shifted match-data's markers Date: Sun, 14 Apr 2019 00:40:13 -0400 Message-ID: <87h8b119oy.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="175970"; mail-complaints-to="usenet@blaine.gmane.org" Cc: stefan monnier To: 35264@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sun Apr 14 06:41:15 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1hFWx6-000jdK-Nl for geb-bug-gnu-emacs@m.gmane.org; Sun, 14 Apr 2019 06:41:12 +0200 Original-Received: from localhost ([127.0.0.1]:59375 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hFWx5-0003z5-Jo for geb-bug-gnu-emacs@m.gmane.org; Sun, 14 Apr 2019 00:41:11 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:58945) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hFWwy-0003yo-Vi for bug-gnu-emacs@gnu.org; Sun, 14 Apr 2019 00:41:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hFWwx-0000DP-SH for bug-gnu-emacs@gnu.org; Sun, 14 Apr 2019 00:41:04 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:46105) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hFWwx-0000D8-N3 for bug-gnu-emacs@gnu.org; Sun, 14 Apr 2019 00:41:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1hFWww-0002r2-5Y; Sun, 14 Apr 2019 00:41:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Noam Postavsky Original-Sender: "Debbugs-submit" Resent-CC: monnier@iro.umontreal.ca, bug-gnu-emacs@gnu.org Resent-Date: Sun, 14 Apr 2019 04:41:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 35264 X-GNU-PR-Package: emacs X-Debbugs-Original-To: bug-gnu-emacs@gnu.org X-Debbugs-Original-Xcc: stefan monnier Original-Received: via spool by submit@debbugs.gnu.org id=B.155521682710923 (code B ref -1); Sun, 14 Apr 2019 04:41:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 14 Apr 2019 04:40:27 +0000 Original-Received: from localhost ([127.0.0.1]:59647 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hFWwN-0002q6-4v for submit@debbugs.gnu.org; Sun, 14 Apr 2019 00:40:27 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:44433) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1hFWwL-0002pu-Lr for submit@debbugs.gnu.org; Sun, 14 Apr 2019 00:40:26 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:37392) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1hFWwG-000822-Fm for submit@debbugs.gnu.org; Sun, 14 Apr 2019 00:40:20 -0400 Original-Received: from eggs.gnu.org ([209.51.188.92]:58814) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1hFWwF-0003SS-8N for bug-gnu-emacs@gnu.org; Sun, 14 Apr 2019 00:40:20 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1hFWwE-00080C-7U for bug-gnu-emacs@gnu.org; Sun, 14 Apr 2019 00:40:19 -0400 Original-Received: from mail-qk1-x72e.google.com ([2607:f8b0:4864:20::72e]:34464) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1hFWwC-0007yT-UT for bug-gnu-emacs@gnu.org; Sun, 14 Apr 2019 00:40:17 -0400 Original-Received: by mail-qk1-x72e.google.com with SMTP id n68so8042246qka.1 for ; Sat, 13 Apr 2019 21:40:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version; bh=t1/blLmDk392Fbv6JE4t/cjh/+eVx5p5RKY4GjxfWW4=; b=EBWU5ddtpH1dV+MYqE6j4S1eBa4Q1JrmzPJmJjFIqMcaTxH3zVdWXMjty5eWgCpayP ewNHArj6TjPo4u65dr3cnELkaBUKWR6h+X1TYublk9+7Jtej5yudw554bG5TeaicqNhk c28J4DQGi+OqfcER+ejTdmixTVaLuojexfthWHwkCI56pF/AbF6EKbBql5qxsnhBH1kK xSRLLU6swKhIqlK3dzcQ5xMnfsLVfvoc6AHQ3QuRm3u7wJRybpqDSlbUfLFh4NTAsIHN Ii3LVNrvAe0jrjfPdNVWmjDqCiZyshlPlaNE5ix/OdS2twlJP7u9DJWXViK6fFG70XpC SyLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version; bh=t1/blLmDk392Fbv6JE4t/cjh/+eVx5p5RKY4GjxfWW4=; b=kveMi1aBjEpUpXqjPq3GNEucECbImtr+Y9tEIhU1n3LKKB7OSk05Tp26LU8Fqfu7bh qfMoiYnjGEKNewVbksL3U9T4NTslkMfB5ZhvZTTbPvHOoqWSESI9420DOoZqhEBCYJVy NjNYvu+dlzjAzk5LPiBYo9sdKmSAP2b2MogWaPVakfQ8NX9LJQHnledj+9IlhNEK7OAK v8+lVOs/h/UOaRZHvlBUVQZ1MKj+C34XDg2PfgbXx52ammK8g7FUOjpoGpZewVpjC0aF uxxZdjRpC/MsirSnQcyJP5x9Z/axnOJgJlQJqM8sGjNlTv4TpcdpnJMjVjRS3hVQGEt4 WKOg== X-Gm-Message-State: APjAAAWCPa+f8yXtALHVMF9K7ECnrT7cnPz5aeaIEZcTjSII3EAqAn2o gvtOK4ByaINoShaIphbsfgiYPrQN X-Google-Smtp-Source: APXvYqw6SkCiu13wKAQ2kXfka514OQq+kyRnzatEo+khEL2thCWA3YGI3PeWMj/8tjefukwzU+L/kA== X-Received: by 2002:a37:e507:: with SMTP id e7mr52311435qkg.322.1555216816161; Sat, 13 Apr 2019 21:40:16 -0700 (PDT) Original-Received: from minid (cbl-45-2-119-34.yyz.frontiernetworks.ca. [45.2.119.34]) by smtp.googlemail.com with ESMTPSA id m189sm27646469qkf.2.2019.04.13.21.40.14 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 13 Apr 2019 21:40:14 -0700 (PDT) X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:157613 Archived-At: --=-=-= Content-Type: text/plain Version: 27.0.50 26.2 25.3 X-Debbugs-CC: Stefan Monnier emacs -Q -l bug-xxxx-match-data-marker-clobber.el Hit , gives Debugger entered--Lisp error: (error "Match data clobbered by buffer modification hooks") replace-match("ABCDEF" t t) (let* ((after-change-functions (list (function (lambda (&rest _) (let (... ...) (save-excursion ...))))))) (search-backward "abcdef") (replace-match "ABCDEF" t t)) (save-current-buffer (set-buffer (get-buffer-create "*test*")) (display-buffer (current-buffer)) (erase-buffer) (insert "1234567890\n") (insert "abcdefghilk\n") (make-local-variable (quote after-change-functions)) (let* ((after-change-functions (list (function (lambda (&rest _) (let ... ...)))))) (search-backward "abcdef") (replace-match "ABCDEF" t t))) bug-match-data-marker-clobber() funcall-interactively(bug-match-data-marker-clobber) call-interactively(bug-match-data-marker-clobber nil nil) command-execute(bug-match-data-marker-clobber) But the modification hook in question did call save-match-data. As far as I can tell, the problem is that the match-data consists of markers, whose position gets shifted by deletion of characters. The check for this error uses simple integers, so there's no way it can account for this. I think this is a variant of Bug#23917, there was some talk there about removing the check, perhaps that is the right solution. DEFUN ("replace-match", Freplace_match, Sreplace_match, 1, 5, 0, [...] /* The functions below modify the buffer, so they could trigger various modification hooks (see signal_before_change and signal_after_change). If these hooks clobber the match data we error out since otherwise this will result in confusing bugs. */ ptrdiff_t sub_start = search_regs.start[sub]; ptrdiff_t sub_end = search_regs.end[sub]; unsigned num_regs = search_regs.num_regs; newpoint = search_regs.start[sub] + SCHARS (newtext); /* Replace the old text with the new in the cleanest possible way. */ replace_range (search_regs.start[sub], search_regs.end[sub], newtext, 1, 0, 1, 1); [...] if (search_regs.start[sub] != sub_start || search_regs.end[sub] != sub_end || search_regs.num_regs != num_regs) error ("Match data clobbered by buffer modification hooks"); bug-xxxx-match-data-marker-clobber.el: --=-=-= Content-Type: text/plain Content-Disposition: inline; filename=bug-xxxx-match-data-marker-clobber.el Content-Description: bug reproducer (defun bug-match-data-marker-clobber () (interactive) (with-current-buffer (get-buffer-create "*test*") (display-buffer (current-buffer)) (erase-buffer) (insert "1234567890\n") (insert "abcdefghilk\n") (make-local-variable 'after-change-functions) (let* ((after-change-functions ` (,(lambda (&rest _) (let ((inhibit-modification-hooks nil) (after-change-functions nil)) (save-excursion (save-match-data (goto-char (point-min)) (looking-at "[0-9]") (delete-char 1)) ;; match-data is restored, but markers have a ;; different position now, because of the ;; deletion. ;; ;; (match-data) ;=> (# #) )))))) (search-backward "abcdef") ;; (match-data) ;=> (# #) (replace-match "ABCDEF" t t) ;; Triggers `after-change-functions'. ))) (setq debug-on-error t) (define-key global-map [f12] 'bug-match-data-marker-clobber) --=-=-=--