Handle a potential NULL 'sparse_oid_value' when attempting to load
sparse filter exclusions by blob, to avoid segfaulting later during
'add_excludes_from_blob_to_list'.

While here, uniquify the errors emitted to distinguish between the
case that a given OID is NULL due to an earlier failure to resolve it,
and when an OID resolves but parsing the sparse filter spec fails.

t5616 is updated to demonstrate the change.

Co-authored-by: Jeff King <p...@peff.net>
Signed-off-by: Jeff King <p...@peff.net>
Signed-off-by: Jon Simons <j...@jonsimons.org>
---
 list-objects-filter.c    | 6 +++++-
 t/t5616-partial-clone.sh | 7 +++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/list-objects-filter.c b/list-objects-filter.c
index 36e1f774bc..252fae5d4e 100644
--- a/list-objects-filter.c
+++ b/list-objects-filter.c
@@ -464,9 +464,13 @@ static void *filter_sparse_oid__init(
 {
        struct filter_sparse_data *d = xcalloc(1, sizeof(*d));
        d->omits = omitted;
+       if (!filter_options->sparse_oid_value)
+               die(_("unable to read sparse filter specification from %s"),
+                     filter_options->filter_spec);
        if (add_excludes_from_blob_to_list(filter_options->sparse_oid_value,
                                           NULL, 0, &d->el) < 0)
-               die("could not load filter specification");
+               die(_("unable to parse sparse filter data in %s"),
+                     oid_to_hex(filter_options->sparse_oid_value));
 
        ALLOC_GROW(d->array_frame, d->nr + 1, d->alloc);
        d->array_frame[d->nr].defval = 0; /* default to include */
diff --git a/t/t5616-partial-clone.sh b/t/t5616-partial-clone.sh
index 5c68431d10..d01886c464 100755
--- a/t/t5616-partial-clone.sh
+++ b/t/t5616-partial-clone.sh
@@ -262,6 +262,13 @@ test_expect_success 'partial clone with sparse filter 
succeeds' '
        git clone --no-local --no-checkout --filter=sparse:oid=master:odd-files 
sparse-src pc-odd
 '
 
+test_expect_success 'partial clone with unresolvable sparse filter fails 
cleanly' '
+       test_must_fail git clone --no-local --no-checkout 
--filter=sparse:oid=master:sparse-filter sparse-src sc1 2>err &&
+       test_i18ngrep "unable to read sparse filter specification from 
sparse:oid=master:sparse-filter" err &&
+       test_must_fail git clone --no-local --no-checkout 
--filter=sparse:oid=master sparse-src sc2 2>err &&
+       test_i18ngrep "unable to parse sparse filter data in $(git -C 
sparse-src rev-parse master)" err
+'
+
 . "$TEST_DIRECTORY"/lib-httpd.sh
 start_httpd
 
-- 
2.23.0.37.g745f681289.dirty

Reply via email to