X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fshared%2Fcapability.c;h=4840c3ebf4149fc7658e7f3f2c204fb6219f8235;hb=012d7b4217420163db5752a63da6cab39d25edf3;hp=3f2f27e23fe4234c2660da30e5d99f76549aff14;hpb=7d328b544621d4b1bec936dec612947ad8bfb65a;p=elogind.git
diff --git a/src/shared/capability.c b/src/shared/capability.c
index 3f2f27e23..4840c3ebf 100644
--- a/src/shared/capability.c
+++ b/src/shared/capability.c
@@ -19,14 +19,9 @@
along with systemd; If not, see .
***/
-#include
-#include
#include
#include
#include
-#include
-#include
-#include
#include
#include
#include "grp.h"
@@ -269,12 +264,16 @@ int drop_privileges(uid_t uid, gid_t gid, uint64_t keep_capabilities) {
return log_oom();
if (keep_capabilities) {
- cap_value_t bits[log2u64(keep_capabilities)];
+ cap_value_t bits[u64log2(keep_capabilities) + 1];
for (i = 0; i < ELEMENTSOF(bits); i++)
if (keep_capabilities & (1ULL << i))
bits[j++] = i;
- assert((keep_capabilities & (~1ULL << i)) == 0);
+
+ /* use enough bits */
+ assert(i == 64 || (keep_capabilities >> i) == 0);
+ /* don't use too many bits */
+ assert(keep_capabilities & (1ULL << (i - 1)));
if (cap_set_flag(d, CAP_EFFECTIVE, j, bits, CAP_SET) < 0 ||
cap_set_flag(d, CAP_PERMITTED, j, bits, CAP_SET) < 0) {