| // Copyright 2019 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // The sandbox2::Limits class defined various client- and sandbox- side limits |
| // which are applied to the execution process of sandboxees. |
| |
| #ifndef SANDBOXED_API_SANDBOX2_LIMITS_H_ |
| #define SANDBOXED_API_SANDBOX2_LIMITS_H_ |
| |
| #include <sys/resource.h> |
| |
| #include <cstdint> |
| #include <ctime> |
| |
| #include "absl/base/macros.h" |
| #include "absl/time/time.h" |
| |
| namespace sandbox2 { |
| |
| class Limits final { |
| public: |
| Limits() = default; |
| |
| Limits(const Limits&) = delete; |
| Limits& operator=(const Limits&) = delete; |
| |
| // rlimits getters/setters. |
| // |
| // Use RLIM64_INFINITY for unlimited values, but remember that some of those |
| // cannot exceed system limits (e.g. RLIMIT_NOFILE). |
| const rlimit64& rlimit_as() const { return rlimit_as_; } |
| Limits& set_rlimit_as(const rlimit64& value) { |
| rlimit_as_ = value; |
| return *this; |
| } |
| Limits& set_rlimit_as(uint64_t value) { |
| rlimit_as_ = MakeRlimit64(value); |
| return *this; |
| } |
| |
| const rlimit64& rlimit_cpu() const { return rlimit_cpu_; } |
| Limits& set_rlimit_cpu(const rlimit64& value) { |
| rlimit_cpu_ = value; |
| return *this; |
| } |
| Limits& set_rlimit_cpu(uint64_t value) { |
| rlimit_cpu_ = MakeRlimit64(value); |
| return *this; |
| } |
| |
| const rlimit64& rlimit_fsize() const { return rlimit_fsize_; } |
| Limits& set_rlimit_fsize(const rlimit64& value) { |
| rlimit_fsize_ = value; |
| return *this; |
| } |
| Limits& set_rlimit_fsize(uint64_t value) { |
| rlimit_fsize_ = MakeRlimit64(value); |
| return *this; |
| } |
| |
| const rlimit64& rlimit_nofile() const { return rlimit_nofile_; } |
| Limits& set_rlimit_nofile(const rlimit64& value) { |
| rlimit_nofile_ = value; |
| return *this; |
| } |
| Limits& set_rlimit_nofile(uint64_t value) { |
| rlimit_nofile_ = MakeRlimit64(value); |
| return *this; |
| } |
| |
| const rlimit64& rlimit_core() const { return rlimit_core_; } |
| Limits& set_rlimit_core(const rlimit64& value) { |
| rlimit_core_ = value; |
| return *this; |
| } |
| Limits& set_rlimit_core(uint64_t value) { |
| rlimit_core_ = MakeRlimit64(value); |
| return *this; |
| } |
| |
| // Sets a wall time limit on an executor before running it. Set to |
| // absl::ZeroDuration() to disarm. The walltime limit is a timeout duration |
| // (e.g. 10 secs) not a deadline (e.g. 12:00). This can be useful in a simple |
| // scenario to set a wall limit before running the sandboxee, run the |
| // sandboxee, and expect it to finish within the limit. For an example, see |
| // examples/crc4. |
| Limits& set_walltime_limit(absl::Duration value) { |
| wall_time_limit_ = value; |
| return *this; |
| } |
| absl::Duration wall_time_limit() const { return wall_time_limit_; } |
| |
| private: |
| constexpr rlimit64 MakeRlimit64(uint64_t value) { |
| return {.rlim_cur = value, .rlim_max = value}; |
| } |
| |
| // Address space size of a process, if big enough (say, above 512M), this |
| // will be a rough approximation of the maximum RAM usage by the sandboxed |
| // process. |
| rlimit64 rlimit_as_ = MakeRlimit64(RLIM64_INFINITY); |
| |
| // CPU time, measured in seconds. This limit might be triggered faster than |
| // the wall-time limit, if many threads are used. |
| rlimit64 rlimit_cpu_ = MakeRlimit64(1024 /* seconds */); |
| |
| // Total number of bytes that can be written to the filesystem by the process |
| // (creating empty files is not considered writing). |
| rlimit64 rlimit_fsize_ = MakeRlimit64(8ULL << 30 /* 8GiB */); |
| |
| // Number of NEW file descriptors which can be obtained by a process. 0 |
| // means that no new descriptors (files, sockets) can be created. |
| rlimit64 rlimit_nofile_ = MakeRlimit64(1024); |
| |
| // Size of a core file which is allowed to be created. The default value of |
| // zero disables the creation of core files. Unless you have special |
| // requirements, this should not be changed. |
| rlimit64 rlimit_core_ = MakeRlimit64(0); |
| |
| // Wall-time limit (local to Monitor). Depending on the sandboxed load, this |
| // one, or RLIMIT_CPU limit might be triggered faster (see |
| // https://en.wikipedia.org/wiki/Time_(Unix)#Real_time_vs_CPU_time). |
| absl::Duration wall_time_limit_ = absl::Seconds(120); |
| }; |
| |
| } // namespace sandbox2 |
| |
| #endif // SANDBOXED_API_SANDBOX2_LIMITS_H_ |