From 07a1fa34edf067eabf726b9b44ef08bf67771c60 Mon Sep 17 00:00:00 2001 From: Tom Gillespie Date: Wed, 29 Jun 2022 13:48:09 -0700 Subject: [PATCH 2/2] make-process stderrproc cleanup on failure decouple stderr query * src/process.c (Fmake_process): Move the call to create the stderr process as late as possible to avoid having to clean up stderrproc in the event of an error prior to the call to create_process. This change is needed to ensure that when called with :query-stderr t (aka the default behavior prior to the addition of :query-stderr) make-process will not leak the stderr process if a call to make-process fails. Also adds a new keyword argument :query-stderr to control whether to query on exit the stderr process (if one is created). (bug#56002) --- src/process.c | 57 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/src/process.c b/src/process.c index af402c8edb..c08dd6995a 100644 --- a/src/process.c +++ b/src/process.c @@ -1732,6 +1732,11 @@ DEFUN ("make-process", Fmake_process, Smake_process, 0, MANY, 0, :noquery BOOL -- When exiting Emacs, query the user if BOOL is nil and the process is running. If BOOL is not given, query before exiting. +:query-stderr BOOL -- When exiting Emacs, query the user if BOOL is +non-nil and the stderr process is running. If BOOL is not given, do +not query before exiting. This has no effect if the value passed to +:stderr is a process. + :stop BOOL -- BOOL must be nil. The `:stop' key is ignored otherwise and is retained for compatibility with other process types such as pipe processes. Asynchronous subprocesses never start in the @@ -1804,8 +1809,6 @@ DEFUN ("make-process", Fmake_process, Smake_process, 0, MANY, 0, if (!NILP (program)) CHECK_STRING (program); - bool query_on_exit = NILP (plist_get (contact, QCnoquery)); - stderrproc = Qnil; xstderr = plist_get (contact, QCstderr); if (PROCESSP (xstderr)) @@ -1815,16 +1818,7 @@ DEFUN ("make-process", Fmake_process, Smake_process, 0, MANY, 0, stderrproc = xstderr; } else if (!NILP (xstderr)) - { - CHECK_STRING (program); - stderrproc = CALLN (Fmake_pipe_process, - QCname, - concat2 (name, build_string (" stderr")), - QCbuffer, - Fget_buffer_create (xstderr, Qnil), - QCnoquery, - query_on_exit ? Qnil : Qt); - } + CHECK_STRING (program); proc = make_process (name); record_unwind_protect (start_process_unwind, proc); @@ -1837,7 +1831,7 @@ DEFUN ("make-process", Fmake_process, Smake_process, 0, MANY, 0, pset_filter (XPROCESS (proc), plist_get (contact, QCfilter)); pset_command (XPROCESS (proc), Fcopy_sequence (command)); - if (!query_on_exit) + if (!NILP (plist_get (contact, QCnoquery))) XPROCESS (proc)->kill_without_query = 1; tem = plist_get (contact, QCstop); /* Normal processes can't be started in a stopped state, see @@ -1854,13 +1848,6 @@ DEFUN ("make-process", Fmake_process, Smake_process, 0, MANY, 0, else report_file_error ("Unknown connection type", tem); - if (!NILP (stderrproc)) - { - pset_stderrproc (XPROCESS (proc), stderrproc); - - XPROCESS (proc)->pty_flag = false; - } - #ifdef HAVE_GNUTLS /* AKA GNUTLS_INITSTAGE(proc). */ verify (GNUTLS_STAGE_EMPTY == 0); @@ -2026,10 +2013,37 @@ DEFUN ("make-process", Fmake_process, Smake_process, 0, MANY, 0, tem = XCDR (tem); } + if (!PROCESSP (xstderr) && !NILP (xstderr)) + { + stderrproc = CALLN (Fmake_pipe_process, + QCname, + concat2 (name, build_string (" stderr")), + QCbuffer, + Fget_buffer_create (xstderr, Qnil), + QCnoquery, + NILP (plist_get (contact, QCquery_stderr)) ? Qt : Qnil); + } + + if (!NILP (stderrproc)) + { + pset_stderrproc (XPROCESS (proc), stderrproc); + + XPROCESS (proc)->pty_flag = false; + } + create_process (proc, new_argv, current_dir); } else - create_pty (proc); + { + if (!NILP (stderrproc)) + { + pset_stderrproc (XPROCESS (proc), stderrproc); + + XPROCESS (proc)->pty_flag = false; + } + + create_pty (proc); + } return SAFE_FREE_UNBIND_TO (count, proc); } @@ -8543,6 +8557,7 @@ syms_of_process (void) DEFSYM (Qnsm_verify_connection, "nsm-verify-connection"); DEFSYM (QClog, ":log"); DEFSYM (QCnoquery, ":noquery"); + DEFSYM (QCquery_stderr, ":query-stderr"); DEFSYM (QCstop, ":stop"); DEFSYM (QCplist, ":plist"); DEFSYM (QCcommand, ":command"); -- 2.35.1