Skip to content

Commit 47bd3d0

Browse files
szedergitster
authored andcommitted
ref-filter: don't look for objects when outside of a repository
The command 'git ls-remote --sort=authordate <remote>' segfaults when run outside of a repository, ever since the introduction of its '--sort' option in 1fb20df (ls-remote: create '--sort' option, 2018-04-09). While in general the 'git ls-remote' command can be run outside of a repository just fine, its '--sort=<key>' option with certain keys does require access to the referenced objects. This sorting is implemented using the generic ref-filter sorting facility, which already handles missing objects gracefully with the appropriate 'missing object deadbee for HEAD' message. However, being generic means that it checks replace refs while trying to retrieve an object, and while doing so it accesses the 'git_replace_ref_base' variable, which has not been initialized and is still a NULL pointer when outside of a repository, thus causing the segfault. Make ref-filter more careful upfront while parsing the format string, and make it error out when encountering a format atom requiring object access when we are not in a repository. Also add a test to ensure that 'git ls-remote --sort' fails gracefully when executed outside of a repository. Reported-by: H.Merijn Brand <[email protected]> Signed-off-by: SZEDER Gábor <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent d166e6a commit 47bd3d0

File tree

2 files changed

+10
-0
lines changed

2 files changed

+10
-0
lines changed

ref-filter.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,10 @@ static int parse_ref_filter_atom(const struct ref_format *format,
534534
if (ARRAY_SIZE(valid_atom) <= i)
535535
return strbuf_addf_ret(err, -1, _("unknown field name: %.*s"),
536536
(int)(ep-atom), atom);
537+
if (valid_atom[i].source != SOURCE_NONE && !have_git_dir())
538+
return strbuf_addf_ret(err, -1,
539+
_("not a git repository, but the field '%.*s' requires access to object data"),
540+
(int)(ep-atom), atom);
537541

538542
/* Add it in, including the deref prefix */
539543
at = used_atom_cnt;

t/t5512-ls-remote.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,12 @@ test_expect_success 'ls-remote works outside repository' '
302302
nongit git ls-remote dst.git
303303
'
304304

305+
test_expect_success 'ls-remote --sort fails gracefully outside repository' '
306+
# Use a sort key that requires access to the referenced objects.
307+
nongit test_must_fail git ls-remote --sort=authordate "$TRASH_DIRECTORY" 2>err &&
308+
test_i18ngrep "^fatal: not a git repository, but the field '\''authordate'\'' requires access to object data" err
309+
'
310+
305311
test_expect_success 'ls-remote patterns work with all protocol versions' '
306312
git for-each-ref --format="%(objectname) %(refname)" \
307313
refs/heads/master refs/remotes/origin/master >expect &&

0 commit comments

Comments
 (0)