Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db0cad4c authored by Ryan Mitchell's avatar Ryan Mitchell
Browse files

AAPT2: Fix windows multiple directory creation

When attempting to create directories on different drives, AAPT2 would
fail because it would attempt to call _wmkdir on the drive
(eg. _wmkdir("D:\")). Split on directories after the drive letter
instead.

Bug: 68936311
Test: manual testing using Android Studio
Change-Id: Iad47f466af6f82d4ac402e9bf52853edaa9a5e0b
parent a1a74cb4
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -102,12 +102,25 @@ FileType GetFileType(const std::string& path) {
#endif

bool mkdirs(const std::string& path) {
  constexpr const mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP;
  #ifdef _WIN32
  // Start after the drive path if present. Calling mkdir with only the drive will cause an error.
  size_t current_pos = 1u;
  if (path.size() >= 3 && path[1] == ':' &&
        (path[2] == '\\' || path[2] == '/')) {
    current_pos = 3u;
  }
 #else
  // Start after the first character so that we don't consume the root '/'.
  // This is safe to do with unicode because '/' will never match with a continuation character.
  size_t current_pos = 1u;
 #endif
  constexpr const mode_t mode = S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP;
  while ((current_pos = path.find(sDirSep, current_pos)) != std::string::npos) {
    std::string parent_path = path.substr(0, current_pos);
    if (parent_path.empty()) {
      continue;
    }

    int result = ::android::base::utf8::mkdir(parent_path.c_str(), mode);
    if (result < 0 && errno != EEXIST) {
      return false;