Re: [PATCH 1/1] maintenance: fix a SEGFAULT when no repository
- From
Derrick Stolee <stolee@gmail.com>
- Date
- Nov 24, 2020, 17:22 UTC
- Message-ID
- <1bfd84da-5b74-be10-fc2c-dee80111ee2d@gmail.com>
- In-Reply-To
- <20201124164405.29327-2-rafaeloliveira.cs@gmail.com>
On 11/24/2020 11:44 AM, Rafael Silva wrote:
Show 12 quoted lines
> The "git maintenance run" and "git maintenance start" commands holds a > file-based lock at the .git/maintenance.lock and .git/schedule.lock > respectively. These locks are used to ensure only one maintenance process > is executed at the time as both operations involves writing data into > the git repository. > > The path to the lock file is built using the "the_repository->objects->odb->path" > that results in SEGFAULT when we have no repository available as > "the_repository->objects->odb" is set to NULL. > > Let's teach the maintenance_run_tasks() and update_background_schedule() to return > an error and fails the command when we have no repository available.
Thank you for noticing this problem, and for a quick fix.
While I don't necessarily have a problem with this approach, perhaps it would be more robust to change the options in git.c to require a GIT_DIR, as in this diff?
-- >8 --
diff --git a/git.c b/git.c index 1cab64b5d1..c3dabd2553 100644 --- a/git.c +++ b/git.c @@ -530,7 +530,7 @@ static struct cmd_struct commands[] = { { "ls-tree", cmd_ls_tree, RUN_SETUP }, { "mailinfo", cmd_mailinfo, RUN_SETUP_GENTLY | NO_PARSEOPT }, { "mailsplit", cmd_mailsplit, NO_PARSEOPT }, - { "maintenance", cmd_maintenance, RUN_SETUP_GENTLY | NO_PARSEOPT }, + { "maintenance", cmd_maintenance, RUN_SETUP | NO_PARSEOPT }, { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE }, { "merge-base", cmd_merge_base, RUN_SETUP }, { "merge-file", cmd_merge_file, RUN_SETUP_GENTLY }, -- >8 -- If the above code change fixes your test (below), then that would probably be a safer change. The reason to use RUN_SETUP_GENTLY was probably due to some thought of modifying the background maintenance schedule without being in a Git repository. However, we currently run the [un]register logic inside of the stop|start subcommands, so a GIT_DIR is required there, too. > diff --git a/t/t7900-maintenance.sh b/t/t7900-maintenance.sh > index d9e68bb2bf..bb3556888d 100755 > --- a/t/t7900-maintenance.sh > +++ b/t/t7900-maintenance.sh > @@ -441,4 +441,9 @@ test_expect_success 'register preserves existing strategy' ' > test_config maintenance.strategy incremental > ' > > +test_expect_success 'run and start command fails when no git repository' ' > + test_must_fail git -C /tmp/ maintenance run && > + test_must_fail git -C /tmp/ maintenance start > +' > + > test_done Thanks, -Stolee