]> git.eshelyaron.com Git - emacs.git/commitdiff
Jsonrpc: don't bind inhibit-read-only to t so early
authorJoão Távora <joaotavora@gmail.com>
Fri, 7 Apr 2023 18:33:12 +0000 (19:33 +0100)
committerJoão Távora <joaotavora@gmail.com>
Fri, 7 Apr 2023 18:33:12 +0000 (19:33 +0100)
Related to https://github.com/joaotavora/eglot/discussions/1202, where
because of this very wide binding to inhibit-read-only to t, Eglot was
managing to write into read-only buffers from the response handlers
that ran from within the stack of the jsonrpc.el process filter.

This is of course illegal and dangerous, but Eglot wasn't made aware
because of the binding.

* lisp/jsonrpc.el (jsonrpc--process-filter): Don't bind
inhibit-read-only so early.

lisp/jsonrpc.el

index f583d116d2019e854243494ee580a06937a158a0..3f9d4a7e818bb20202b7d2a54cd494716b5d137b 100644 (file)
@@ -566,15 +566,14 @@ With optional CLEANUP, kill any associated buffers."
     (cl-return-from jsonrpc--process-filter))
   (when (buffer-live-p (process-buffer proc))
     (with-current-buffer (process-buffer proc)
-      (let* ((inhibit-read-only t)
-             (jsonrpc--in-process-filter t)
+      (let* ((jsonrpc--in-process-filter t)
              (connection (process-get proc 'jsonrpc-connection))
              (expected-bytes (jsonrpc--expected-bytes connection)))
         ;; Insert the text, advancing the process marker.
         ;;
         (save-excursion
           (goto-char (process-mark proc))
-          (insert string)
+          (let ((inhibit-read-only t)) (insert string))
           (set-marker (process-mark proc) (point)))
         ;; Loop (more than one message might have arrived)
         ;;
@@ -623,7 +622,8 @@ With optional CLEANUP, kill any associated buffers."
                                     (jsonrpc-connection-receive connection
                                                                 json-message)))))
                           (goto-char message-end)
-                          (delete-region (point-min) (point))
+                          (let ((inhibit-read-only t))
+                            (delete-region (point-min) (point)))
                           (setq expected-bytes nil))))
                      (t
                       ;; Message is still incomplete