blob: 2627608e9b231c2862b333c9481e6329b9ad24cf [file] [log] [blame]
// 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