summaryrefslogtreecommitdiff
path: root/src/fs_path.c
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@edwardthomson.com>2021-11-01 13:58:18 -0400
committerEdward Thomson <ethomson@edwardthomson.com>2021-11-09 15:17:18 +0000
commitebacd24c6039c992ef9122a0d6f7de0ca4ba3bd1 (patch)
treeb3e8e91bc2d0fa0a61ba88d57c7ff783eeb5ab25 /src/fs_path.c
parentdd748dbede1a36f1e929461ecbfcde749eb685bb (diff)
downloadlibgit2-ebacd24c6039c992ef9122a0d6f7de0ca4ba3bd1.tar.gz
fs_path: add long path validation on windows
Diffstat (limited to 'src/fs_path.c')
-rw-r--r--src/fs_path.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/fs_path.c b/src/fs_path.c
index 483b21c1e..de3b03957 100644
--- a/src/fs_path.c
+++ b/src/fs_path.c
@@ -1634,11 +1634,25 @@ static bool validate_component(
return true;
}
+#ifdef GIT_WIN32
+GIT_INLINE(bool) validate_length(
+ const char *path,
+ size_t len,
+ size_t utf8_char_len)
+{
+ GIT_UNUSED(path);
+ GIT_UNUSED(len);
+
+ return (utf8_char_len <= MAX_PATH);
+}
+#endif
+
bool git_fs_path_is_valid_str_ext(
const git_str *path,
unsigned int flags,
bool (*validate_char_cb)(char ch, void *payload),
bool (*validate_component_cb)(const char *component, size_t len, void *payload),
+ bool (*validate_length_cb)(const char *path, size_t len, size_t utf8_char_len),
void *payload)
{
const char *start, *c;
@@ -1683,6 +1697,21 @@ bool git_fs_path_is_valid_str_ext(
!validate_component_cb(start, (c - start), payload))
return false;
+#ifdef GIT_WIN32
+ if ((flags & GIT_FS_PATH_REJECT_LONG_PATHS) != 0) {
+ size_t utf8_len = git_utf8_char_length(path->ptr, len);
+
+ if (!validate_length(path->ptr, len, utf8_len))
+ return false;
+
+ if (validate_length_cb &&
+ !validate_length_cb(path->ptr, len, utf8_len))
+ return false;
+ }
+#else
+ GIT_UNUSED(validate_length_cb);
+#endif
+
return true;
}