diff options
author | Basil L. Contovounesios <contovob@tcd.ie> | 2018-10-25 03:35:57 +0100 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2018-11-03 10:46:01 +0200 |
commit | bd1d61753d90ef47af1e9a3b7a92ee77b7d43ed0 (patch) | |
tree | 033ef2714165db6fc3bcfc3f62e0e68682b278bb /lisp/net/rcirc.el | |
parent | 88ef31abd4716fad14889b08686d42ebbb7dc6c0 (diff) | |
download | emacs-bd1d61753d90ef47af1e9a3b7a92ee77b7d43ed0.tar.gz |
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.
Diffstat (limited to 'lisp/net/rcirc.el')
-rw-r--r-- | lisp/net/rcirc.el | 12 |
1 files changed, 6 insertions, 6 deletions
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 |