]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix subproc listening when setting filter to non-t (Bug#36591)
authorNoam Postavsky <npostavs@gmail.com>
Thu, 25 Jul 2019 00:33:18 +0000 (20:33 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Thu, 25 Jul 2019 22:36:03 +0000 (18:36 -0400)
* src/process.c (Fset_process_filter): Call add_process_read_fd
according to the state of process filter before it's updated.  This
restores the correct functioning as it was before 2016-02-16 "Allow
setting the filter masks later".  Inline the set_process_filter_masks
call instead of fixing it that function, because it is also called
from connect_network_socket, and we don't want to change the behavior
of that function so close to release.
* test/src/process-tests.el (set-process-filter-t): New test.

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

index 2df51cfd9965c30bbdaad908069ff5b76985c90f..b602507765e91a8884f3b3f44e2dc871d3147aa6 100644 (file)
@@ -1268,10 +1268,19 @@ The string argument is normally a multibyte string, except:
   if (NILP (filter))
     filter = Qinternal_default_process_filter;
 
-  pset_filter (p, filter);
-
   if (p->infd >= 0)
-    set_process_filter_masks (p);
+    {
+      /* If filter WILL be t, stop reading output.  */
+      if (EQ (filter, Qt) && !EQ (p->status, Qlisten))
+        delete_read_fd (p->infd);
+      else if (/* If filter WAS t, then resume reading output.  */
+               EQ (p->filter, Qt)
+               /* Network or serial process not stopped:  */
+               && !EQ (p->command, Qt))
+        add_process_read_fd (p->infd);
+    }
+
+  pset_filter (p, filter);
 
   if (NETCONN1_P (p) || SERIALCONN1_P (p) || PIPECONN1_P (p))
     pset_childp (p, Fplist_put (p->childp, QCfilter, filter));
index 7cccc5a02cb620df30f2b7e8bcd465f44f3dc368..7a6762a9226aea0671932e31a522299505b9ea97 100644 (file)
     (should (equal "hello stderr!\n"
                   (mapconcat #'identity (nreverse stderr-output) "")))))
 
+(ert-deftest set-process-filter-t ()
+  "Test setting process filter to t and back." ;; Bug#36591
+  (with-temp-buffer
+    (let* ((print-level nil)
+           (print-length nil)
+           (proc (start-process
+                  "test proc" (current-buffer)
+                  (concat invocation-directory invocation-name)
+                  "-Q" "--batch" "--eval"
+                  (prin1-to-string
+                   '(let (s)
+                      (while (setq s (read-from-minibuffer "$ "))
+                        (princ s)
+                        (princ "\n")))))))
+      (set-process-query-on-exit-flag proc nil)
+      (send-string proc "one\n")
+      (should
+       (accept-process-output proc 1))  ; Read "one".
+      (should (equal (buffer-string) "$ one\n$ "))
+      (set-process-filter proc t)       ; Stop reading from proc.
+      (send-string proc "two\n")
+      (should-not
+       (accept-process-output proc 1))  ; Can't read "two" yet.
+      (should (equal (buffer-string) "$ one\n$ "))
+      (set-process-filter proc nil)     ; Resume reading from proc.
+      (should
+       (accept-process-output proc 1))  ; Read "two" from proc.
+      (should (equal (buffer-string) "$ one\n$ two\n$ ")))))
+
 (ert-deftest start-process-should-not-modify-arguments ()
   "`start-process' must not modify its arguments in-place."
   ;; See bug#21831.