From: Brandon Williams <bmwill@google.com>
To: Jonathan Nieder <jrnieder@gmail.com>
Cc: git@vger.kernel.org, e@80x24.org
Subject: Re: [PATCH v2 2/6] run-command: prepare command before forking
Date: Thu, 13 Apr 2017 15:41:29 -0700 [thread overview]
Message-ID: <20170413224129.GB115420@google.com> (raw)
In-Reply-To: <20170413211447.GC10084@aiede.mtv.corp.google.com>
On 04/13, Jonathan Nieder wrote:
> Hi,
>
> Brandon Williams wrote:
>
> > In order to avoid allocation between 'fork()' and 'exec()' the argv
> > array used in the exec call is prepared prior to forking the process.
>
> nit: s/(the argv array.*) is prepared/prepare \1/
>
> Git's commit messages are in the imperative mood, as if they are
> ordering the code or the computer to do something.
>
> More importantly, the commit message is a good place to explain some
> of the motivation behind the patch so that people can understand what
> the patch is for by reading it without having to dig into mailing list
> archives and get the discussion there.
>
> E.g. this could say
>
> - that grep tests are intermittently failing in configurations using
> some versions of tcmalloc
>
> - that the cause is interaction between fork and threads: malloc holds
> a lock that those versions of tcmalloc doesn't release in a
> pthread_atfork handler
>
> - that according to [1] we need to only call async-signal-safe
> operations between fork and exec. Using malloc to build the argv
> array isn't async-signal-safe
>
> [1] http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html
>
> > In addition to this, the function used to exec is changed from
> > 'execvp()' to 'execv()' as the (p) variant of exec has the potential to
> > call malloc during the path resolution it performs.
>
> *puzzled* is execvp actually allowed to call malloc?
It could possible as it isn't async-signal-safe.
>
> Could this part go in a separate patch? That would make it easier to
> review.
I'll break this conversion out to a different patch.
>
> [...]
> > +++ b/run-command.c
> [...]
> > + /*
> > + * If there are no '/' characters in the command then perform a path
> > + * lookup and use the resolved path as the command to exec. If there
> > + * are no '/' characters or if the command wasn't found in the path,
> > + * have exec attempt to invoke the command directly.
> > + */
> > + if (!strchr(out->argv[0], '/')) {
> > + char *program = locate_in_PATH(out->argv[0]);
> > + if (program) {
> > + free((char *)out->argv[0]);
> > + out->argv[0] = program;
> > + }
> > + }
>
> This does one half of what execvp does but leaves out the other half.
> http://pubs.opengroup.org/onlinepubs/009695399/functions/exec.html
> explains:
>
> There are two distinct ways in which the contents of the process
> image file may cause the execution to fail, distinguished by the
> setting of errno to either [ENOEXEC] or [EINVAL] (see the ERRORS
> section). In the cases where the other members of the exec family of
> functions would fail and set errno to [ENOEXEC], the execlp() and
> execvp() functions shall execute a command interpreter and the
> environment of the executed command shall be as if the process
> invoked the sh utility using execl() as follows:
>
> execl(<shell path>, arg0, file, arg1, ..., (char *)0);
>
> I think this is what the first patch in the series was about. Do we
> want to drop that support?
>
> I think we need to keep it, since it is easy for authors of e.g.
> credential helpers to accidentally rely on it.
>
> [...]
> > @@ -437,12 +458,9 @@ int start_command(struct child_process *cmd)
> > unsetenv(*cmd->env);
> > }
> > }
> > - if (cmd->git_cmd)
> > - execv_git_cmd(cmd->argv);
> > - else if (cmd->use_shell)
> > - execv_shell_cmd(cmd->argv);
> > - else
> > - sane_execvp(cmd->argv[0], (char *const*) cmd->argv);
> > +
> > + execv(argv.argv[0], (char *const *) argv.argv);
>
> What happens in the case sane_execvp was trying to handle? Does
> prepare_cmd need error handling for when the command isn't found?
>
> Sorry this got so fussy.
>
> Thanks and hope that helps,
> Jonathan
--
Brandon Williams
next prev parent reply other threads:[~2017-04-13 22:41 UTC|newest]
Thread overview: 140+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-10 23:49 [PATCH 0/5] forking and threading Brandon Williams
2017-04-10 23:49 ` [PATCH 1/5] run-command: convert sane_execvp to sane_execvpe Brandon Williams
2017-04-12 19:22 ` Brandon Williams
2017-04-10 23:49 ` [PATCH 2/5] run-command: prepare argv before forking Brandon Williams
2017-04-10 23:49 ` [PATCH 3/5] run-command: allocate child_err " Brandon Williams
2017-04-10 23:49 ` [PATCH 4/5] run-command: prepare child environment " Brandon Williams
2017-04-11 0:58 ` Jonathan Nieder
2017-04-11 17:27 ` Brandon Williams
2017-04-11 17:30 ` Jonathan Nieder
2017-04-10 23:49 ` [PATCH 5/5] run-command: add note about forking and threading Brandon Williams
2017-04-11 0:26 ` Jonathan Nieder
2017-04-11 0:53 ` Eric Wong
2017-04-11 17:33 ` Jonathan Nieder
2017-04-11 17:34 ` Brandon Williams
2017-04-11 17:40 ` Eric Wong
2017-04-11 7:05 ` [PATCH 6/5] run-command: avoid potential dangers in forked child Eric Wong
2017-04-11 16:29 ` Brandon Williams
2017-04-11 16:59 ` Eric Wong
2017-04-11 17:17 ` Brandon Williams
2017-04-11 17:37 ` [PATCH 0/5] forking and threading Jonathan Nieder
2017-04-11 17:54 ` Brandon Williams
2017-04-13 18:32 ` [PATCH v2 0/6] " Brandon Williams
2017-04-13 18:32 ` [PATCH v2 1/6] t5550: use write_script to generate post-update hook Brandon Williams
2017-04-13 20:43 ` Jonathan Nieder
2017-04-13 20:59 ` Eric Wong
2017-04-13 21:35 ` Brandon Williams
2017-04-13 21:39 ` Eric Wong
2017-04-13 18:32 ` [PATCH v2 2/6] run-command: prepare command before forking Brandon Williams
2017-04-13 21:14 ` Jonathan Nieder
2017-04-13 22:41 ` Brandon Williams [this message]
2017-04-13 18:32 ` [PATCH v2 3/6] run-command: prepare child environment " Brandon Williams
2017-04-13 18:32 ` [PATCH v2 4/6] run-command: don't die in child when duping /dev/null Brandon Williams
2017-04-13 19:29 ` Eric Wong
2017-04-13 19:43 ` Brandon Williams
2017-04-13 18:32 ` [PATCH v2 5/6] run-command: eliminate calls to error handling functions in child Brandon Williams
2017-04-13 18:32 ` [PATCH v2 6/6] run-command: add note about forking and threading Brandon Williams
2017-04-13 20:50 ` [PATCH v2 0/6] " Jonathan Nieder
2017-04-13 23:44 ` Brandon Williams
2017-04-13 21:14 ` [PATCH 7/6] run-command: block signals between fork and execve Eric Wong
2017-04-13 23:37 ` Brandon Williams
2017-04-14 2:42 ` Brandon Williams
2017-04-14 5:26 ` Eric Wong
2017-04-14 5:35 ` Eric Wong
2017-04-14 16:58 ` [PATCH v3 00/10] forking and threading Brandon Williams
2017-04-14 16:58 ` [PATCH v3 01/10] t5550: use write_script to generate post-update hook Brandon Williams
2017-04-14 16:58 ` [PATCH v3 02/10] t0061: run_command executes scripts without a #! line Brandon Williams
2017-04-14 16:58 ` [PATCH v3 03/10] run-command: prepare command before forking Brandon Williams
2017-04-14 16:58 ` [PATCH v3 04/10] run-command: use the async-signal-safe execv instead of execvp Brandon Williams
2017-04-14 16:58 ` [PATCH v3 05/10] run-command: prepare child environment before forking Brandon Williams
2017-04-14 16:58 ` [PATCH v3 06/10] run-command: don't die in child when duping /dev/null Brandon Williams
2017-04-14 19:38 ` Eric Wong
2017-04-14 20:19 ` Brandon Williams
2017-04-14 16:58 ` [PATCH v3 07/10] run-command: eliminate calls to error handling functions in child Brandon Williams
2017-04-14 18:50 ` Eric Wong
2017-04-14 20:22 ` Brandon Williams
2017-04-14 16:59 ` [PATCH v3 08/10] run-command: handle dup2 and close errors " Brandon Williams
2017-04-14 16:59 ` [PATCH v3 09/10] run-command: add note about forking and threading Brandon Williams
2017-04-14 16:59 ` [PATCH v3 10/10] run-command: block signals between fork and execve Brandon Williams
2017-04-14 20:24 ` Brandon Williams
2017-04-14 21:35 ` Eric Wong
2017-04-17 22:08 ` [PATCH v4 00/10] forking and threading Brandon Williams
2017-04-17 22:08 ` [PATCH v4 01/10] t5550: use write_script to generate post-update hook Brandon Williams
2017-04-17 22:08 ` [PATCH v4 02/10] t0061: run_command executes scripts without a #! line Brandon Williams
2017-04-17 22:08 ` [PATCH v4 03/10] run-command: prepare command before forking Brandon Williams
2017-04-17 22:08 ` [PATCH v4 04/10] run-command: use the async-signal-safe execv instead of execvp Brandon Williams
2017-04-17 22:08 ` [PATCH v4 05/10] run-command: prepare child environment before forking Brandon Williams
2017-04-18 0:26 ` Eric Wong
2017-04-18 21:02 ` Brandon Williams
2017-04-17 22:08 ` [PATCH v4 06/10] run-command: don't die in child when duping /dev/null Brandon Williams
2017-04-17 22:08 ` [PATCH v4 07/10] run-command: eliminate calls to error handling functions in child Brandon Williams
2017-04-17 22:08 ` [PATCH v4 08/10] run-command: handle dup2 and close errors " Brandon Williams
2017-04-17 22:08 ` [PATCH v4 09/10] run-command: add note about forking and threading Brandon Williams
2017-04-17 22:08 ` [PATCH v4 10/10] run-command: block signals between fork and execve Brandon Williams
2017-04-18 23:17 ` [PATCH v5 00/11] forking and threading Brandon Williams
2017-04-18 23:17 ` [PATCH v5 01/11] t5550: use write_script to generate post-update hook Brandon Williams
2017-04-18 23:17 ` [PATCH v5 02/11] t0061: run_command executes scripts without a #! line Brandon Williams
2017-04-19 5:43 ` Johannes Sixt
2017-04-19 6:21 ` Johannes Sixt
2017-04-19 15:56 ` Brandon Williams
2017-04-19 18:18 ` Johannes Sixt
2017-04-20 10:47 ` Johannes Schindelin
2017-04-20 17:02 ` Brandon Williams
2017-04-20 20:24 ` Johannes Schindelin
2017-04-20 20:49 ` Brandon Williams
2017-04-18 23:17 ` [PATCH v5 03/11] run-command: prepare command before forking Brandon Williams
2017-04-18 23:17 ` [PATCH v5 04/11] run-command: use the async-signal-safe execv instead of execvp Brandon Williams
2017-04-18 23:17 ` [PATCH v5 05/11] string-list: add string_list_remove function Brandon Williams
2017-04-18 23:31 ` Stefan Beller
2017-04-18 23:36 ` Brandon Williams
2017-04-18 23:40 ` Stefan Beller
2017-04-18 23:18 ` [PATCH v5 06/11] run-command: prepare child environment before forking Brandon Williams
2017-04-18 23:18 ` [PATCH v5 07/11] run-command: don't die in child when duping /dev/null Brandon Williams
2017-04-18 23:18 ` [PATCH v5 08/11] run-command: eliminate calls to error handling functions in child Brandon Williams
2017-04-18 23:18 ` [PATCH v5 09/11] run-command: handle dup2 and close errors " Brandon Williams
2017-04-18 23:18 ` [PATCH v5 10/11] run-command: add note about forking and threading Brandon Williams
2017-04-18 23:18 ` [PATCH v5 11/11] run-command: block signals between fork and execve Brandon Williams
2017-04-19 6:00 ` Johannes Sixt
2017-04-19 7:48 ` Eric Wong
2017-04-19 16:10 ` Brandon Williams
2017-04-19 23:13 ` [PATCH v6 00/11] forking and threading Brandon Williams
2017-04-19 23:13 ` [PATCH v6 01/11] t5550: use write_script to generate post-update hook Brandon Williams
2017-04-19 23:13 ` [PATCH v6 02/11] t0061: run_command executes scripts without a #! line Brandon Williams
2017-04-20 10:49 ` Johannes Schindelin
2017-04-20 16:58 ` Brandon Williams
2017-04-19 23:13 ` [PATCH v6 03/11] run-command: prepare command before forking Brandon Williams
2017-04-19 23:13 ` [PATCH v6 04/11] run-command: use the async-signal-safe execv instead of execvp Brandon Williams
2017-05-17 2:15 ` Junio C Hamano
2017-05-17 2:26 ` Jeff King
2017-05-17 2:28 ` Jeff King
2017-05-17 3:41 ` Junio C Hamano
2017-05-17 14:52 ` Brandon Williams
2017-04-19 23:13 ` [PATCH v6 05/11] string-list: add string_list_remove function Brandon Williams
2017-04-19 23:13 ` [PATCH v6 06/11] run-command: prepare child environment before forking Brandon Williams
2017-04-19 23:13 ` [PATCH v6 07/11] run-command: don't die in child when duping /dev/null Brandon Williams
2017-04-19 23:13 ` [PATCH v6 08/11] run-command: eliminate calls to error handling functions in child Brandon Williams
2017-04-19 23:13 ` [PATCH v6 09/11] run-command: handle dup2 and close errors " Brandon Williams
2017-04-19 23:13 ` [PATCH v6 10/11] run-command: add note about forking and threading Brandon Williams
2017-04-19 23:13 ` [PATCH v6 11/11] run-command: block signals between fork and execve Brandon Williams
2017-04-24 22:37 ` [PATCH v6 00/11] forking and threading Brandon Williams
2017-04-24 23:50 ` [PATCH v6 12/11] run-command: don't try to execute directories Brandon Williams
2017-04-25 0:17 ` Jonathan Nieder
2017-04-25 1:58 ` Junio C Hamano
2017-04-25 2:51 ` Jonathan Nieder
2017-04-25 2:56 ` Jeff King
2017-04-25 1:47 ` Junio C Hamano
2017-04-25 2:57 ` Jonathan Nieder
2017-04-25 17:54 ` [PATCH v7 1/2] exec_cmd: expose is_executable function Brandon Williams
2017-04-25 17:54 ` [PATCH v7 2/2] run-command: don't try to execute directories Brandon Williams
2017-04-25 18:51 ` Jonathan Nieder
2017-04-25 19:32 ` Brandon Williams
2017-04-25 18:04 ` [PATCH v7 1/2] exec_cmd: expose is_executable function Jonathan Nieder
2017-04-25 18:18 ` Johannes Sixt
2017-04-25 18:38 ` Brandon Williams
2017-04-25 23:46 ` [PATCH v8 1/2] run-command: " Brandon Williams
2017-04-25 23:47 ` [PATCH v8 2/2] run-command: restrict PATH search to executable files Brandon Williams
2017-04-25 23:50 ` Jonathan Nieder
2017-04-26 1:44 ` Junio C Hamano
2017-04-26 17:10 ` [PATCH v9 " Brandon Williams
2017-04-27 0:33 ` Junio C Hamano
2017-04-25 23:48 ` [PATCH v8 1/2] run-command: expose is_executable function Jonathan Nieder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170413224129.GB115420@google.com \
--to=bmwill@google.com \
--cc=e@80x24.org \
--cc=git@vger.kernel.org \
--cc=jrnieder@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).