diff options
-rw-r--r-- | .github/workflows/main.yml | 2 | ||||
-rw-r--r-- | CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/CMakeLists.txt | 5 | ||||
-rw-r--r-- | src/features.h.in | 1 | ||||
-rw-r--r-- | src/posix.c | 7 | ||||
-rw-r--r-- | src/win32/posix_w32.c | 7 |
6 files changed, 22 insertions, 1 deletions
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 2bc91e73c..4615504be 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -86,7 +86,7 @@ jobs: env: CC: gcc CMAKE_GENERATOR: Ninja - CMAKE_OPTIONS: -DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON -DDEBUG_STRICT_ALLOC=ON + CMAKE_OPTIONS: -DUSE_HTTPS=OpenSSL -DREGEX_BACKEND=builtin -DDEPRECATE_HARD=ON -DUSE_LEAK_CHECKER=valgrind -DUSE_GSSAPI=ON -DDEBUG_STRICT_ALLOC=ON -DDEBUG_STRICT_OPEN=ON os: ubuntu-latest - # Xenial, GCC, mbedTLS container: diff --git a/CMakeLists.txt b/CMakeLists.txt index ff3411928..937503829 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,7 @@ OPTION(USE_STANDALONE_FUZZERS "Enable standalone fuzzers (compatible with gcc)" OPTION(USE_LEAK_CHECKER "Run tests with leak checker" OFF) OPTION(DEBUG_POOL "Enable debug pool allocator" OFF) OPTION(DEBUG_STRICT_ALLOC "Enable strict allocator behavior" OFF) +OPTION(DEBUG_STRICT_OPEN "Enable path validation in open" OFF) OPTION(ENABLE_WERROR "Enable compilation with -Werror" OFF) OPTION(USE_BUNDLED_ZLIB "Use the bundled version of zlib. Can be set to one of Bundled(ON)/Chromium. The Chromium option requires a x86_64 processor with SSE4.2 and CLMUL" OFF) SET(USE_HTTP_PARSER "" CACHE STRING "Specifies the HTTP Parser implementation; either system or builtin.") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d3408999f..54099c384 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,6 +11,11 @@ IF(DEBUG_STRICT_ALLOC) ENDIF() ADD_FEATURE_INFO(debugalloc GIT_DEBUG_STRICT_ALLOC "debug strict allocators") +IF(DEBUG_STRICT_OPEN) + SET(GIT_DEBUG_STRICT_OPEN 1) +ENDIF() +ADD_FEATURE_INFO(debugopen GIT_DEBUG_STRICT_OPEN "path validation in open") + INCLUDE(PkgBuildConfig) INCLUDE(SanitizeBool) diff --git a/src/features.h.in b/src/features.h.in index ab523f90b..21e5fdc07 100644 --- a/src/features.h.in +++ b/src/features.h.in @@ -3,6 +3,7 @@ #cmakedefine GIT_DEBUG_POOL 1 #cmakedefine GIT_DEBUG_STRICT_ALLOC 1 +#cmakedefine GIT_DEBUG_STRICT_OPEN 1 #cmakedefine GIT_TRACE 1 #cmakedefine GIT_THREADS 1 diff --git a/src/posix.c b/src/posix.c index bf764ae6b..c40134824 100644 --- a/src/posix.c +++ b/src/posix.c @@ -109,6 +109,13 @@ int p_open(const char *path, volatile int flags, ...) { mode_t mode = 0; + #ifdef GIT_DEBUG_STRICT_OPEN + if (strstr(path, "//") != NULL) { + errno = EACCES; + return -1; + } + #endif + if (flags & O_CREAT) { va_list arg_list; diff --git a/src/win32/posix_w32.c b/src/win32/posix_w32.c index 0a8f2bee0..7fcc472e9 100644 --- a/src/win32/posix_w32.c +++ b/src/win32/posix_w32.c @@ -543,6 +543,13 @@ int p_open(const char *path, int flags, ...) mode_t mode = 0; struct open_opts opts = {0}; + #ifdef GIT_DEBUG_STRICT_OPEN + if (strstr(path, "//") != NULL) { + errno = EACCES; + return -1; + } + #endif + if (git_win32_path_from_utf8(wpath, path) < 0) return -1; |