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

Commit 3f879b77 authored by Nicolas Geoffray's avatar Nicolas Geoffray Committed by android-build-merger
Browse files

Merge "Add checks to ensure only the ART memfd file is whitelisted." am: 555ffd1c

am: 7f46f863

Change-Id: I9a3f626c6fdc111560d9c5d52c12913aedf27c7e
parents 9d813b92 7f46f863
Loading
Loading
Loading
Loading
+18 −6
Original line number Diff line number Diff line
@@ -59,8 +59,8 @@ FileDescriptorWhitelist* FileDescriptorWhitelist::Get() {
  return instance_;
}

static bool IsMemfd(const std::string& path) {
  return android::base::StartsWith(path, "/memfd:");
static bool IsArtMemfd(const std::string& path) {
  return android::base::StartsWith(path, "/memfd:/boot-image-methods.art");
}

bool FileDescriptorWhitelist::IsAllowed(const std::string& path) const {
@@ -91,8 +91,8 @@ bool FileDescriptorWhitelist::IsAllowed(const std::string& path) const {
    return true;
  }

  // In-memory files created through memfd_create are allowed.
  if (IsMemfd(path)) {
  // the in-memory file created by ART through memfd_create is allowed.
  if (IsArtMemfd(path)) {
    return true;
  }

@@ -321,8 +321,8 @@ void FileDescriptorInfo::ReopenOrDetach(fail_fn_t fail_fn) const {
    return DetachSocket(fail_fn);
  }

  // Children can directly use in-memory files created through memfd_create.
  if (IsMemfd(file_path)) {
  // Children can directly use the in-memory file created by ART through memfd_create.
  if (IsArtMemfd(file_path)) {
    return;
  }

@@ -545,6 +545,10 @@ FileDescriptorTable::FileDescriptorTable(
}

void FileDescriptorTable::RestatInternal(std::set<int>& open_fds, fail_fn_t fail_fn) {
  // ART creates a file through memfd for optimization purposes. We make sure
  // there is at most one being created.
  bool art_memfd_seen = false;

  // Iterate through the list of file descriptors we've already recorded
  // and check whether :
  //
@@ -577,6 +581,14 @@ void FileDescriptorTable::RestatInternal(std::set<int>& open_fds, fail_fn_t fail
        // FD.
      }

      if (IsArtMemfd(it->second->file_path)) {
        if (art_memfd_seen) {
          fail_fn("ART fd already seen: " + it->second->file_path);
        } else {
          art_memfd_seen = true;
        }
      }

      ++it;

      // Finally, remove the FD from the set of open_fds. We do this last because