diff options
Diffstat (limited to 'cmds/installd/utils.cpp')
-rw-r--r-- | cmds/installd/utils.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/cmds/installd/utils.cpp b/cmds/installd/utils.cpp index ffc082d5b2..b05c655517 100644 --- a/cmds/installd/utils.cpp +++ b/cmds/installd/utils.cpp @@ -1040,25 +1040,30 @@ static int validate_path(const std::string& dir, const std::string& path, int ma LOG(ERROR) << "Invalid directory " << dir; return -1; } - if (path.find("..") != std::string::npos) { - LOG(ERROR) << "Invalid path " << path; - return -1; - } if (path.compare(0, dir.size(), dir) != 0) { // Common case, path isn't under directory return -1; } - // Count number of subdirectories - auto pos = path.find('/', dir.size()); + // Count number of subdirectories and invalidate ".." subdirectories + auto last = dir.size(); + auto pos = path.find('/', last); int count = 0; while (pos != std::string::npos) { - auto next = path.find('/', pos + 1); - if (next > pos + 1) { + if (pos > last + 1) { count++; } - pos = next; + if (path.substr(last, pos - last) == "..") { + LOG(ERROR) << "Invalid path " << path; + return -1; + } + last = pos + 1; + pos = path.find('/', last); + } + if (path.substr(last, path.size() - last) == "..") { + LOG(ERROR) << "Invalid path " << path; + return -1; } if (count > maxSubdirs) { |