summaryrefslogtreecommitdiff
path: root/chromium/sandbox/linux/syscall_broker/broker_command.cc
blob: 46533d381dcb35675d0e75f8b9c92ec195731d40 (plain)
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
90
91
92
93
94
95
96
97
98
99
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <unistd.h>

#include "sandbox/linux/syscall_broker/broker_command.h"
#include "sandbox/linux/syscall_broker/broker_permission_list.h"

namespace sandbox {
namespace syscall_broker {

bool CommandAccessIsSafe(const BrokerCommandSet& command_set,
                         const BrokerPermissionList& policy,
                         const char* requested_filename,
                         int requested_mode,
                         const char** filename_to_use) {
  return command_set.test(COMMAND_ACCESS) &&
         policy.GetFileNameIfAllowedToAccess(requested_filename, requested_mode,
                                             filename_to_use);
}

bool CommandMkdirIsSafe(const BrokerCommandSet& command_set,
                        const BrokerPermissionList& policy,
                        const char* requested_filename,
                        const char** filename_to_use) {
  return command_set.test(COMMAND_MKDIR) &&
         policy.GetFileNameIfAllowedToOpen(requested_filename,
                                           O_RDWR | O_CREAT | O_EXCL,
                                           filename_to_use, nullptr);
}

bool CommandOpenIsSafe(const BrokerCommandSet& command_set,
                       const BrokerPermissionList& policy,
                       const char* requested_filename,
                       int requested_flags,
                       const char** filename_to_use,
                       bool* unlink_after_open) {
  return command_set.test(COMMAND_OPEN) &&
         policy.GetFileNameIfAllowedToOpen(
             requested_filename,
             requested_flags & ~kCurrentProcessOpenFlagsMask, filename_to_use,
             unlink_after_open);
}

bool CommandReadlinkIsSafe(const BrokerCommandSet& command_set,
                           const BrokerPermissionList& policy,
                           const char* requested_filename,
                           const char** filename_to_use) {
  return command_set.test(COMMAND_READLINK) &&
         policy.GetFileNameIfAllowedToOpen(requested_filename, O_RDONLY,
                                           filename_to_use, nullptr);
}

bool CommandRenameIsSafe(const BrokerCommandSet& command_set,
                         const BrokerPermissionList& policy,
                         const char* old_filename,
                         const char* new_filename,
                         const char** old_filename_to_use,
                         const char** new_filename_to_use) {
  return command_set.test(COMMAND_RENAME) &&
         policy.GetFileNameIfAllowedToOpen(old_filename,
                                           O_RDWR | O_CREAT | O_EXCL,
                                           old_filename_to_use, nullptr) &&
         policy.GetFileNameIfAllowedToOpen(new_filename,
                                           O_RDWR | O_CREAT | O_EXCL,
                                           new_filename_to_use, nullptr);
}

bool CommandRmdirIsSafe(const BrokerCommandSet& command_set,
                        const BrokerPermissionList& policy,
                        const char* requested_filename,
                        const char** filename_to_use) {
  return command_set.test(COMMAND_RMDIR) &&
         policy.GetFileNameIfAllowedToOpen(requested_filename,
                                           O_RDWR | O_CREAT | O_EXCL,
                                           filename_to_use, nullptr);
}

bool CommandStatIsSafe(const BrokerCommandSet& command_set,
                       const BrokerPermissionList& policy,
                       const char* requested_filename,
                       const char** filename_to_use) {
  return command_set.test(COMMAND_STAT) &&
         policy.GetFileNameIfAllowedToStat(requested_filename, filename_to_use);
}

bool CommandUnlinkIsSafe(const BrokerCommandSet& command_set,
                         const BrokerPermissionList& policy,
                         const char* requested_filename,
                         const char** filename_to_use) {
  return command_set.test(COMMAND_UNLINK) &&
         policy.GetFileNameIfAllowedToOpen(requested_filename,
                                           O_RDWR | O_CREAT | O_EXCL,
                                           filename_to_use, nullptr);
}

}  // namespace syscall_broker
}  // namespace sandbox