diff options
| author | Junio C Hamano <gitster@pobox.com> | 2018-05-22 13:48:26 +0900 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2018-05-22 13:48:26 +0900 |
| commit | 8528c31d98c358cd27f45e203745bcdef03ca589 (patch) | |
| tree | 47fd3ecfa1590f62eaa65dced6aef152a85b33e6 /submodule-config.c | |
| parent | Git 2.13.6 (diff) | |
| parent | verify_path: disallow symlinks in .gitmodules (diff) | |
| download | git-8528c31d98c358cd27f45e203745bcdef03ca589.tar.gz git-8528c31d98c358cd27f45e203745bcdef03ca589.zip | |
Merge branch 'jk/submodule-fix-loose' into maint-2.13
* jk/submodule-fix-loose:
verify_path: disallow symlinks in .gitmodules
update-index: stat updated files earlier
verify_dotfile: mention case-insensitivity in comment
verify_path: drop clever fallthrough
skip_prefix: add case-insensitive variant
is_{hfs,ntfs}_dotgitmodules: add tests
is_ntfs_dotgit: match other .git files
is_hfs_dotgit: match other .git files
is_ntfs_dotgit: use a size_t for traversing string
submodule-config: verify submodule names as paths
Diffstat (limited to 'submodule-config.c')
| -rw-r--r-- | submodule-config.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/submodule-config.c b/submodule-config.c index 4f58491ddb..de54351c6f 100644 --- a/submodule-config.c +++ b/submodule-config.c @@ -163,6 +163,31 @@ static struct submodule *cache_lookup_name(struct submodule_cache *cache, return NULL; } +int check_submodule_name(const char *name) +{ + /* Disallow empty names */ + if (!*name) + return -1; + + /* + * Look for '..' as a path component. Check both '/' and '\\' as + * separators rather than is_dir_sep(), because we want the name rules + * to be consistent across platforms. + */ + goto in_component; /* always start inside component */ + while (*name) { + char c = *name++; + if (c == '/' || c == '\\') { +in_component: + if (name[0] == '.' && name[1] == '.' && + (!name[2] || name[2] == '/' || name[2] == '\\')) + return -1; + } + } + + return 0; +} + static int name_and_item_from_var(const char *var, struct strbuf *name, struct strbuf *item) { @@ -174,6 +199,12 @@ static int name_and_item_from_var(const char *var, struct strbuf *name, return 0; strbuf_add(name, subsection, subsection_len); + if (check_submodule_name(name->buf) < 0) { + warning(_("ignoring suspicious submodule name: %s"), name->buf); + strbuf_release(name); + return 0; + } + strbuf_addstr(item, key); return 1; |
