Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schindelin <johannes.schindelin@gmx.de>2019-09-16 14:26:40 +0300
committerJohannes Schindelin <johannes.schindelin@gmx.de>2019-12-05 17:37:08 +0300
commitdd53ea7220606f9ed36db5a0ef910143fdac2903 (patch)
treef178a3457c9c8a65dcf87c8be756ddff39d7edae
parent7f3551dd686e2237490c17946335a675c4f59881 (diff)
parent9102f958ee5254b10c0be72672aa3305bf4f4704 (diff)
Merge branch 'turn-on-protectntfs-by-default'
This patch series makes it safe to use Git on Windows drives, even if running on a mounted network share or within the Windows Subsystem for Linux (WSL). This topic branch addresses CVE-2019-1353. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
-rw-r--r--config.mak.uname2
-rw-r--r--environment.c2
-rw-r--r--path.c55
3 files changed, 31 insertions, 28 deletions
diff --git a/config.mak.uname b/config.mak.uname
index 6604b130f8..333bd399d0 100644
--- a/config.mak.uname
+++ b/config.mak.uname
@@ -379,7 +379,6 @@ ifeq ($(uname_S),Windows)
EXTLIBS = user32.lib advapi32.lib shell32.lib wininet.lib ws2_32.lib invalidcontinue.obj
PTHREAD_LIBS =
lib =
- BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1
ifndef DEBUG
BASIC_CFLAGS += -GL -Os -MD
BASIC_LDFLAGS += -LTCG
@@ -516,7 +515,6 @@ ifneq (,$(findstring MINGW,$(uname_S)))
COMPAT_OBJS += compat/mingw.o compat/winansi.o \
compat/win32/pthread.o compat/win32/syslog.o \
compat/win32/dirent.o
- BASIC_CFLAGS += -DPROTECT_NTFS_DEFAULT=1
EXTLIBS += -lws2_32
GITLIBS += git.res
PTHREAD_LIBS =
diff --git a/environment.c b/environment.c
index 3fd4b10845..ab38deefa5 100644
--- a/environment.c
+++ b/environment.c
@@ -73,7 +73,7 @@ enum log_refs_config log_all_ref_updates = LOG_REFS_UNSET;
int protect_hfs = PROTECT_HFS_DEFAULT;
#ifndef PROTECT_NTFS_DEFAULT
-#define PROTECT_NTFS_DEFAULT 0
+#define PROTECT_NTFS_DEFAULT 1
#endif
int protect_ntfs = PROTECT_NTFS_DEFAULT;
diff --git a/path.c b/path.c
index 2037e2d8c1..43b16aabd4 100644
--- a/path.c
+++ b/path.c
@@ -1288,20 +1288,6 @@ int daemon_avoid_alias(const char *p)
}
}
-static int only_spaces_and_periods(const char *path, size_t len, size_t skip)
-{
- if (len < skip)
- return 0;
- len -= skip;
- path += skip;
- while (len-- > 0) {
- char c = *(path++);
- if (c != ' ' && c != '.')
- return 0;
- }
- return 1;
-}
-
/*
* On NTFS, we need to be careful to disallow certain synonyms of the `.git/`
* directory:
@@ -1341,19 +1327,38 @@ static int only_spaces_and_periods(const char *path, size_t len, size_t skip)
*/
int is_ntfs_dotgit(const char *name)
{
- size_t len;
+ char c;
- for (len = 0; ; len++)
- if (!name[len] || name[len] == '\\' || is_dir_sep(name[len]) ||
- name[len] == ':') {
- if (only_spaces_and_periods(name, len, 4) &&
- !strncasecmp(name, ".git", 4))
- return 1;
- if (only_spaces_and_periods(name, len, 5) &&
- !strncasecmp(name, "git~1", 5))
- return 1;
+ /*
+ * Note that when we don't find `.git` or `git~1` we end up with `name`
+ * advanced partway through the string. That's okay, though, as we
+ * return immediately in those cases, without looking at `name` any
+ * further.
+ */
+ c = *(name++);
+ if (c == '.') {
+ /* .git */
+ if (((c = *(name++)) != 'g' && c != 'G') ||
+ ((c = *(name++)) != 'i' && c != 'I') ||
+ ((c = *(name++)) != 't' && c != 'T'))
return 0;
- }
+ } else if (c == 'g' || c == 'G') {
+ /* git ~1 */
+ if (((c = *(name++)) != 'i' && c != 'I') ||
+ ((c = *(name++)) != 't' && c != 'T') ||
+ *(name++) != '~' ||
+ *(name++) != '1')
+ return 0;
+ } else
+ return 0;
+
+ for (;;) {
+ c = *(name++);
+ if (!c || c == '\\' || c == '/' || c == ':')
+ return 1;
+ if (c != '.' && c != ' ')
+ return 0;
+ }
}
static int is_ntfs_dot_generic(const char *name,