chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
nspawn: --private-network should imply CAP_NET_ADMIN
[elogind.git]
/
src
/
nspawn
/
nspawn.c
diff --git
a/src/nspawn/nspawn.c
b/src/nspawn/nspawn.c
index 679c005071dc2558ec11f6a85a98823bf109c9cd..9ce1fa9b49cd72fdcf4b683ba231ccd5fd862488 100644
(file)
--- a/
src/nspawn/nspawn.c
+++ b/
src/nspawn/nspawn.c
@@
-216,6
+216,7
@@
static int parse_argv(int argc, char *argv[]) {
};
int c, r;
};
int c, r;
+ uint64_t plus = 0, minus = 0;
assert(argc >= 0);
assert(argv);
assert(argc >= 0);
assert(argv);
@@
-325,9
+326,9
@@
static int parse_argv(int argc, char *argv[]) {
if (streq(t, "all")) {
if (c == ARG_CAPABILITY)
if (streq(t, "all")) {
if (c == ARG_CAPABILITY)
-
arg_retain
= (uint64_t) -1;
+
plus
= (uint64_t) -1;
else
else
-
arg_retain = 0
;
+
minus = (uint64_t) -1
;
} else {
if (cap_from_name(t, &cap) < 0) {
log_error("Failed to parse capability %s.", t);
} else {
if (cap_from_name(t, &cap) < 0) {
log_error("Failed to parse capability %s.", t);
@@
-335,9
+336,9
@@
static int parse_argv(int argc, char *argv[]) {
}
if (c == ARG_CAPABILITY)
}
if (c == ARG_CAPABILITY)
-
arg_retain
|= 1ULL << (uint64_t) cap;
+
plus
|= 1ULL << (uint64_t) cap;
else
else
-
arg_retain &= ~(1ULL << (uint64_t) cap)
;
+
minus |= 1ULL << (uint64_t) cap
;
}
}
}
}
@@
-460,6
+461,8
@@
static int parse_argv(int argc, char *argv[]) {
return -EINVAL;
}
return -EINVAL;
}
+ arg_retain = (arg_retain | plus | (arg_private_network ? 1ULL << CAP_NET_ADMIN : 0)) & ~minus;
+
return 1;
}
return 1;
}