From: Basil L. Contovounesios Date: Thu, 25 Oct 2018 02:35:57 +0000 (+0100) Subject: Avoid race in rcirc process filter (bug#33145) X-Git-Tag: emacs-26.1.90~34 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=bd1d61753d90ef47af1e9a3b7a92ee77b7d43ed0;p=emacs.git Avoid race in rcirc process filter (bug#33145) * lisp/net/rcirc.el (rcirc-filter): Clear rcirc-process-output before processing its constituent lines. Otherwise, if rcirc-filter runs again before the last rcirc-process-server-response is finished, the contents of rcirc-process-output could be duplicated. --- diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el index c09bff765b2..f57f7555c32 100644 --- a/lisp/net/rcirc.el +++ b/lisp/net/rcirc.el @@ -753,12 +753,12 @@ Function is called with PROCESS, COMMAND, SENDER, ARGS and LINE.") (with-rcirc-process-buffer process (setq rcirc-last-server-message-time (current-time)) (setq rcirc-process-output (concat rcirc-process-output output)) - (when (= (aref rcirc-process-output - (1- (length rcirc-process-output))) ?\n) - (mapc (lambda (line) - (rcirc-process-server-response process line)) - (split-string rcirc-process-output "[\n\r]" t)) - (setq rcirc-process-output nil)))) + (when (= ?\n (aref rcirc-process-output + (1- (length rcirc-process-output)))) + (let ((lines (split-string rcirc-process-output "[\n\r]" t))) + (setq rcirc-process-output nil) + (dolist (line lines) + (rcirc-process-server-response process line)))))) (defun rcirc-reschedule-timeout (process) (with-rcirc-process-buffer process