diff options
Diffstat (limited to 'pathspec.c')
-rw-r--r-- | pathspec.c | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/pathspec.c b/pathspec.c index ff2509ddd1..7ababb3159 100644 --- a/pathspec.c +++ b/pathspec.c @@ -296,6 +296,27 @@ static void strip_submodule_slash_expensive(struct pathspec_item *item) } } +static void die_inside_submodule_path(struct pathspec_item *item) +{ + int i; + + for (i = 0; i < active_nr; i++) { + struct cache_entry *ce = active_cache[i]; + int ce_len = ce_namelen(ce); + + if (!S_ISGITLINK(ce->ce_mode)) + continue; + + if (item->len < ce_len || + !(item->match[ce_len] == '/' || item->match[ce_len] == '\0') || + memcmp(ce->name, item->match, ce_len)) + continue; + + die(_("Pathspec '%s' is in submodule '%.*s'"), + item->original, ce_len, ce->name); + } +} + /* * Perform the initialization of a pathspec_item based on a pathspec element. */ @@ -391,8 +412,18 @@ static void init_pathspec_item(struct pathspec_item *item, unsigned flags, } /* sanity checks, pathspec matchers assume these are sane */ - assert(item->nowildcard_len <= item->len && - item->prefix <= item->len); + if (item->nowildcard_len > item->len || + item->prefix > item->len) { + /* + * This case can be triggered by the user pointing us to a + * pathspec inside a submodule, which is an input error. + * Detect that here and complain, but fallback in the + * non-submodule case to a BUG, as we have no idea what + * would trigger that. + */ + die_inside_submodule_path(item); + die ("BUG: item->nowildcard_len > item->len || item->prefix > item->len)"); + } } static int pathspec_item_cmp(const void *a_, const void *b_) |