Index: sandbox/linux/services/credentials.cc |
diff --git a/sandbox/linux/services/credentials.cc b/sandbox/linux/services/credentials.cc |
index c8c679d8515e16db91e2636315f3974747b5066a..e8dd1d943cb0278b439f0efbc07d26f5416629d7 100644 |
--- a/sandbox/linux/services/credentials.cc |
+++ b/sandbox/linux/services/credentials.cc |
@@ -148,6 +148,21 @@ bool Credentials::DropAllCapabilities() { |
return Credentials::DropAllCapabilities(proc_fd.get()); |
} |
+// static |
+bool Credentials::SetCapabilities(int proc_fd, |
+ const std::vector<cap_value_t>& caps) { |
+ DCHECK_LE(0, proc_fd); |
+ CHECK(ThreadHelpers::IsSingleThreaded(proc_fd)); |
+ |
+ sandbox::ScopedCap cap(cap_init()); |
+ PCHECK(cap != nullptr); |
+ cap_flag_t flags[] = {CAP_EFFECTIVE, CAP_PERMITTED}; |
+ for (const cap_flag_t flag : flags) { |
+ PCHECK(cap_set_flag(cap.get(), flag, caps.size(), &caps[0], CAP_SET) == 0); |
+ } |
+ return cap_set_proc(cap.get()) == 0; |
+} |
+ |
bool Credentials::HasAnyCapability() { |
ScopedCap current_cap(cap_get_proc()); |
CHECK(current_cap); |