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

Commit b27ef83f authored by Steven Moreland's avatar Steven Moreland Committed by Android (Google) Code Review
Browse files

Merge "flexibility for having extra policy files" into rvc-dev

parents cc39f3d7 d03d42b5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -39,4 +39,5 @@ cc_test {
    srcs: [
        "av_services_minijail_unittest.cpp",
    ],
    test_suites: ["device-tests"],
}
+5 −0
Original line number Diff line number Diff line
{
  "presubmit": [
    { "name": "libavservices_minijail_unittest" }
  ]
}
+31 −2
Original line number Diff line number Diff line
@@ -34,13 +34,32 @@ class WritePolicyTest : public ::testing::Test
        "mmap: 1\n"
        "munmap: 1\n";

    const std::string third_policy_ =
        "open: 1\n"
        "close: 1\n";

    const std::string full_policy_ = base_policy_ + std::string("\n") + additional_policy_;
    const std::string triple_policy_ = base_policy_ +
                                       std::string("\n") + additional_policy_ +
                                       std::string("\n") + third_policy_;
};

TEST_F(WritePolicyTest, OneFile)
{
    std::string final_string;
    android::base::unique_fd fd(android::WritePolicyToPipe(base_policy_, std::string()));
    // vector with an empty pathname
    android::base::unique_fd fd(android::WritePolicyToPipe(base_policy_, {std::string()}));
    EXPECT_LE(0, fd.get());
    bool success = android::base::ReadFdToString(fd.get(), &final_string);
    EXPECT_TRUE(success);
    EXPECT_EQ(final_string, base_policy_);
}

TEST_F(WritePolicyTest, OneFileAlternate)
{
    std::string final_string;
    // empty vector
    android::base::unique_fd fd(android::WritePolicyToPipe(base_policy_, {}));
    EXPECT_LE(0, fd.get());
    bool success = android::base::ReadFdToString(fd.get(), &final_string);
    EXPECT_TRUE(success);
@@ -50,9 +69,19 @@ TEST_F(WritePolicyTest, OneFile)
TEST_F(WritePolicyTest, TwoFiles)
{
    std::string final_string;
    android::base::unique_fd fd(android::WritePolicyToPipe(base_policy_, additional_policy_));
    android::base::unique_fd fd(android::WritePolicyToPipe(base_policy_, {additional_policy_}));
    EXPECT_LE(0, fd.get());
    bool success = android::base::ReadFdToString(fd.get(), &final_string);
    EXPECT_TRUE(success);
    EXPECT_EQ(final_string, full_policy_);
}

TEST_F(WritePolicyTest, ThreeFiles)
{
    std::string final_string;
    android::base::unique_fd fd(android::WritePolicyToPipe(base_policy_, {additional_policy_, third_policy_}));
    EXPECT_LE(0, fd.get());
    bool success = android::base::ReadFdToString(fd.get(), &final_string);
    EXPECT_TRUE(success);
    EXPECT_EQ(final_string, triple_policy_);
}
+26 −13
Original line number Diff line number Diff line
@@ -29,7 +29,7 @@
namespace android {

int WritePolicyToPipe(const std::string& base_policy_content,
                      const std::string& additional_policy_content)
                      const std::vector<std::string>& additional_policy_contents)
{
    int pipefd[2];
    if (pipe(pipefd) == -1) {
@@ -40,9 +40,11 @@ int WritePolicyToPipe(const std::string& base_policy_content,
    base::unique_fd write_end(pipefd[1]);
    std::string content = base_policy_content;

    if (additional_policy_content.length() > 0) {
    for (auto one_content : additional_policy_contents) {
        if (one_content.length() > 0) {
            content += "\n";
        content += additional_policy_content;
            content += one_content;
        }
    }

    if (!base::WriteStringToFd(content, write_end.get())) {
@@ -53,29 +55,40 @@ int WritePolicyToPipe(const std::string& base_policy_content,
    return pipefd[0];
}

void SetUpMinijail(const std::string& base_policy_path, const std::string& additional_policy_path)
void SetUpMinijail(const std::string& base_policy_path,
                   const std::string& additional_policy_path)
{
    SetUpMinijailList(base_policy_path, {additional_policy_path});
}

void SetUpMinijailList(const std::string& base_policy_path,
                   const std::vector<std::string>& additional_policy_paths)
{
    // No seccomp policy defined for this architecture.
    if (access(base_policy_path.c_str(), R_OK) == -1) {
        LOG(WARNING) << "No seccomp policy defined for this architecture.";
        // LOG(WARNING) << "No seccomp policy defined for this architecture.";
        LOG(WARNING) << "missing base seccomp_policy file '" << base_policy_path << "'";
        return;
    }

    std::string base_policy_content;
    std::string additional_policy_content;
    std::vector<std::string> additional_policy_contents;
    if (!base::ReadFileToString(base_policy_path, &base_policy_content,
                                false /* follow_symlinks */)) {
        LOG(FATAL) << "Could not read base policy file '" << base_policy_path << "'";
    }

    if (additional_policy_path.length() > 0 &&
        !base::ReadFileToString(additional_policy_path, &additional_policy_content,
    for (auto one_policy_path : additional_policy_paths) {
        std::string one_policy_content;
        if (one_policy_path.length() > 0 &&
                !base::ReadFileToString(one_policy_path, &one_policy_content,
                    false /* follow_symlinks */)) {
        LOG(WARNING) << "Could not read additional policy file '" << additional_policy_path << "'";
        additional_policy_content = std::string();
            LOG(WARNING) << "Could not read additional policy file '" << one_policy_path << "'";
        }
        additional_policy_contents.push_back(one_policy_content);
    }

    base::unique_fd policy_fd(WritePolicyToPipe(base_policy_content, additional_policy_content));
    base::unique_fd policy_fd(WritePolicyToPipe(base_policy_content, additional_policy_contents));
    if (policy_fd.get() == -1) {
        LOG(FATAL) << "Could not write seccomp policy to fd";
    }
+6 −2
Original line number Diff line number Diff line
@@ -16,11 +16,15 @@
#define AV_SERVICES_MINIJAIL_MINIJAIL

#include <string>
#include <vector>

namespace android {
int WritePolicyToPipe(const std::string& base_policy_content,
                      const std::string& additional_policy_content);
void SetUpMinijail(const std::string& base_policy_path, const std::string& additional_policy_path);
                      const std::vector<std::string>& additional_policy_contents);
void SetUpMinijail(const std::string& base_policy_path,
                   const std::string& additional_policy_path);
void SetUpMinijailList(const std::string& base_policy_path,
                       const std::vector<std::string>& additional_policy_paths);
}

#endif  // AV_SERVICES_MINIJAIL_MINIJAIL