aboutsummaryrefslogtreecommitdiffstats
path: root/read-cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'read-cache.c')
-rw-r--r--read-cache.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/read-cache.c b/read-cache.c
index 133f790fa4..737916ebd9 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -964,6 +964,9 @@ int verify_path(const char *path, unsigned mode)
if (has_dos_drive_prefix(path))
return 0;
+ if (!is_valid_path(path))
+ return 0;
+
goto inside;
for (;;) {
if (!c)
@@ -991,7 +994,15 @@ inside:
if ((c == '.' && !verify_dotfile(path, mode)) ||
is_dir_sep(c) || c == '\0')
return 0;
+ } else if (c == '\\' && protect_ntfs) {
+ if (is_ntfs_dotgit(path))
+ return 0;
+ if (S_ISLNK(mode)) {
+ if (is_ntfs_dotgitmodules(path))
+ return 0;
+ }
}
+
c = *path++;
}
}
@@ -1267,6 +1278,11 @@ static int add_index_entry_with_check(struct index_state *istate, struct cache_e
int skip_df_check = option & ADD_CACHE_SKIP_DFCHECK;
int new_only = option & ADD_CACHE_NEW_ONLY;
+#ifdef GIT_WINDOWS_NATIVE
+ if (protect_ntfs && strchr(ce->name, '\\'))
+ return error(_("filename in tree entry contains backslash: '%s'"), ce->name);
+#endif
+
if (!(option & ADD_CACHE_KEEP_CACHE_TREE))
cache_tree_invalidate_path(istate, ce->name);
@@ -1790,7 +1806,7 @@ static struct cache_entry *create_from_disk(struct mem_pool *ce_mem_pool,
const unsigned char *cp = (const unsigned char *)name;
size_t strip_len, previous_len;
- /* If we're at the begining of a block, ignore the previous name */
+ /* If we're at the beginning of a block, ignore the previous name */
strip_len = decode_varint(&cp);
if (previous_ce) {
previous_len = previous_ce->ce_namelen;