summaryrefslogtreecommitdiff
path: root/submodule-config.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2018-05-22 05:18:06 (GMT)
committerJunio C Hamano <gitster@pobox.com>2018-05-22 05:18:06 (GMT)
commit023020401d21c8c48d7f0a123c7ff50888e101c7 (patch)
tree1529374ef1c5c8ca26804d1e212f0dfc75789e1d /submodule-config.c
parentd32eb83c1db7d0a8bb54fe743c6d1dd674d372c5 (diff)
parentd33c87517a85f544159b2efa406136dde18a5b9f (diff)
downloadgit-023020401d21c8c48d7f0a123c7ff50888e101c7.zip
git-023020401d21c8c48d7f0a123c7ff50888e101c7.tar.gz
git-023020401d21c8c48d7f0a123c7ff50888e101c7.tar.bz2
Sync with Git 2.15.2
* maint-2.15: Git 2.15.2 Git 2.14.4 Git 2.13.7 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.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/submodule-config.c b/submodule-config.c
index 602ba8c..e5f4901 100644
--- a/submodule-config.c
+++ b/submodule-config.c
@@ -190,6 +190,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)
{
@@ -201,6 +226,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;