xref: /aosp_15_r20/external/cronet/base/posix/can_lower_nice_to.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2018 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/posix/can_lower_nice_to.h"
6 
7 #include <limits.h>
8 #include <sys/resource.h>
9 #include <sys/types.h>
10 #include <unistd.h>
11 
12 #include "build/build_config.h"
13 
14 // Not defined on AIX by default.
15 #if BUILDFLAG(IS_AIX)
16 #if defined(RLIMIT_NICE)
17 #error Assumption about OS_AIX is incorrect
18 #endif
19 #define RLIMIT_NICE 20
20 #endif
21 
22 namespace base {
23 namespace internal {
24 
CanLowerNiceTo(int nice_value)25 bool CanLowerNiceTo(int nice_value) {
26   // On a POSIX system, the nice value of a thread can be lowered 1. by the root
27   // user, 2. by a user with the CAP_SYS_NICE permission or 3. by any user if
28   // the target value is within the range allowed by RLIMIT_NICE.
29 
30   // 1. Check for root user.
31   if (geteuid() == 0) {
32     return true;
33   }
34 
35   // 2. Skip checking the CAP_SYS_NICE permission because it would require
36   // libcap.so.
37 
38   // 3. Check whether the target value is within the range allowed by
39   // RLIMIT_NICE.
40   //
41   // NZERO should be defined in <limits.h> per POSIX, and should be at least 20.
42   // (NZERO-1) is the highest possible niceness value (i.e. lowest priority).
43   // Most platforms use NZERO=20.
44   //
45   // RLIMIT_NICE tells us how much we can reduce niceness (increase priority) if
46   // we start at NZERO. For example, if NZERO is 20 and the rlimit is 30, we can
47   // lower niceness anywhere within the [-10, 19] range (20 - 30 = -10).
48   //
49   // So, we are allowed to reduce niceness to a minimum of NZERO - rlimit:
50   struct rlimit rlim;
51   if (getrlimit(RLIMIT_NICE, &rlim) != 0) {
52     return false;
53   }
54   const int lowest_nice_allowed = NZERO - static_cast<int>(rlim.rlim_cur);
55 
56   // And lowering niceness to |nice_value| is allowed if it is greater than or
57   // equal to the limit:
58   return nice_value >= lowest_nice_allowed;
59 }
60 
61 }  // namespace internal
62 }  // namespace base
63