diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2021-11-01 13:58:18 -0400 |
---|---|---|
committer | Edward Thomson <ethomson@edwardthomson.com> | 2021-11-09 15:17:18 +0000 |
commit | ebacd24c6039c992ef9122a0d6f7de0ca4ba3bd1 (patch) | |
tree | b3e8e91bc2d0fa0a61ba88d57c7ff783eeb5ab25 /src/fs_path.c | |
parent | dd748dbede1a36f1e929461ecbfcde749eb685bb (diff) | |
download | libgit2-ebacd24c6039c992ef9122a0d6f7de0ca4ba3bd1.tar.gz |
fs_path: add long path validation on windows
Diffstat (limited to 'src/fs_path.c')
-rw-r--r-- | src/fs_path.c | 29 |
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; } |