diff options
author | Enzo Matsumiya <ematsumiya@suse.de> | 2021-11-25 00:02:39 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2021-11-25 00:14:10 (GMT) |
commit | f917f57f40a22b64ab5354e99dbf32bb48d9fc0a (patch) | |
tree | a07ad0bc547c38dde56e6a32118db6696cd680bd /pager.c | |
parent | e9d7761bb94f20acc98824275e317fa82436c25d (diff) | |
download | git-f917f57f40a22b64ab5354e99dbf32bb48d9fc0a.zip git-f917f57f40a22b64ab5354e99dbf32bb48d9fc0a.tar.gz git-f917f57f40a22b64ab5354e99dbf32bb48d9fc0a.tar.bz2 |
pager: fix crash when pager program doesn't exist
When prepare_cmd() fails for, e.g., pager process setup,
child_process_clear() frees the memory in pager_process.args, but .argv
was pointed to pager_process.args.v earlier in start_command(), so it's
now a dangling pointer.
setup_pager() is then called a second time, from cmd_log_init_finish()
in this case, and any further operations using its .argv, e.g. strvec_*,
will use the dangling pointer and eventually crash. According to trivial
tests, setup_pager() is not called twice if the first call is
successful.
This patch makes sure that pager_process is properly initialized on
setup_pager(). Drop CHILD_PROCESS_INIT from its declaration since it's
no longer really necessary.
Add a test to catch possible regressions.
Reproducer:
$ git config pager.show INVALID_PAGER
$ git show $VALID_COMMIT
error: cannot run INVALID_PAGER: No such file or directory
[1] 3619 segmentation fault (core dumped) git show $VALID_COMMIT
Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'pager.c')
-rw-r--r-- | pager.c | 4 |
1 files changed, 3 insertions, 1 deletions
@@ -8,7 +8,7 @@ #define DEFAULT_PAGER "less" #endif -static struct child_process pager_process = CHILD_PROCESS_INIT; +static struct child_process pager_process; static const char *pager_program; /* Is the value coming back from term_columns() just a guess? */ @@ -124,6 +124,8 @@ void setup_pager(void) setenv("GIT_PAGER_IN_USE", "true", 1); + child_process_init(&pager_process); + /* spawn the pager */ prepare_pager_args(&pager_process, pager); pager_process.in = -1; |