1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
|
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "sandbox/linux/syscall_broker/broker_permission_list.h"
#include <fcntl.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <string>
#include <vector>
namespace sandbox {
namespace syscall_broker {
BrokerPermissionList::BrokerPermissionList(
int denied_errno,
std::vector<BrokerFilePermission> permissions)
: denied_errno_(denied_errno),
permissions_(std::move(permissions)),
num_of_permissions_(permissions_.size()) {
// The spec guarantees vectors store their elements contiguously
// so set up a pointer to array of element so it can be used
// in async signal safe code instead of vector operations.
if (num_of_permissions_ > 0) {
permissions_array_ = &permissions_[0];
} else {
permissions_array_ = nullptr;
}
}
BrokerPermissionList::~BrokerPermissionList() = default;
const char* BrokerPermissionList::GetFileNameIfAllowedToAccess(
const char* requested_filename,
int requested_mode) const {
for (size_t i = 0; i < num_of_permissions_; i++) {
const char* ret =
permissions_array_[i].CheckAccess(requested_filename, requested_mode);
if (ret) {
return ret;
}
}
return nullptr;
}
std::pair<const char*, bool> BrokerPermissionList::GetFileNameIfAllowedToOpen(
const char* requested_filename,
int requested_flags) const {
for (size_t i = 0; i < num_of_permissions_; i++) {
std::pair<const char*, bool> ret =
permissions_array_[i].CheckOpen(requested_filename, requested_flags);
if (ret.first) {
return ret;
}
}
return {nullptr, false};
}
const char* BrokerPermissionList::GetFileNameIfAllowedToStat(
const char* requested_filename) const {
for (size_t i = 0; i < num_of_permissions_; i++) {
const char* ret =
permissions_array_[i].CheckStatWithIntermediates(requested_filename);
if (ret) {
return ret;
}
}
return nullptr;
}
const char* BrokerPermissionList::GetFileNameIfAllowedToInotifyAddWatch(
const char* requested_filename,
uint32_t mask) const {
for (size_t i = 0; i < num_of_permissions_; i++) {
const char* ret =
permissions_array_[i].CheckInotifyAddWatchWithIntermediates(
requested_filename, mask);
if (ret) {
return ret;
}
}
return nullptr;
}
} // namespace syscall_broker
} // namespace sandbox
|