chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
tree-wide: there is no ENOTSUP on linux
[elogind.git]
/
src
/
libsystemd
/
sd-bus
/
bus-creds.c
diff --git
a/src/libsystemd/sd-bus/bus-creds.c
b/src/libsystemd/sd-bus/bus-creds.c
index 55d6fb6b439073c11503aa48b4892923b2b33f4d..cd1c5e232ad07a35301d1302623605a658801761 100644
(file)
--- a/
src/libsystemd/sd-bus/bus-creds.c
+++ b/
src/libsystemd/sd-bus/bus-creds.c
@@
-20,6
+20,7
@@
***/
#include <stdlib.h>
***/
#include <stdlib.h>
+#include <linux/capability.h>
#include "util.h"
#include "capability.h"
#include "util.h"
#include "capability.h"
@@
-28,7
+29,6
@@
#include "audit.h"
#include "bus-message.h"
#include "bus-util.h"
#include "audit.h"
#include "bus-message.h"
#include "bus-util.h"
-#include "time-util.h"
#include "strv.h"
#include "bus-creds.h"
#include "bus-label.h"
#include "strv.h"
#include "bus-creds.h"
#include "bus-label.h"
@@
-51,6
+51,7
@@
void bus_creds_done(sd_bus_creds *c) {
free(c->user_unit);
free(c->slice);
free(c->unescaped_description);
free(c->user_unit);
free(c->slice);
free(c->unescaped_description);
+ free(c->supplementary_gids);
free(c->well_known_names); /* note that this is an strv, but
* we only free the array, not the
free(c->well_known_names); /* note that this is an strv, but
* we only free the array, not the
@@
-100,7
+101,9
@@
_public_ sd_bus_creds *sd_bus_creds_unref(sd_bus_creds *c) {
free(c->unique_name);
free(c->cgroup_root);
free(c->description);
free(c->unique_name);
free(c->cgroup_root);
free(c->description);
+
free(c->supplementary_gids);
free(c->supplementary_gids);
+ c->supplementary_gids = NULL;
strv_free(c->well_known_names);
c->well_known_names = NULL;
strv_free(c->well_known_names);
c->well_known_names = NULL;
@@
-143,7
+146,7
@@
_public_ int sd_bus_creds_new_from_pid(sd_bus_creds **ret, pid_t pid, uint64_t m
int r;
assert_return(pid >= 0, -EINVAL);
int r;
assert_return(pid >= 0, -EINVAL);
- assert_return(mask <= _SD_BUS_CREDS_ALL, -E
NOTSU
P);
+ assert_return(mask <= _SD_BUS_CREDS_ALL, -E
OPNOTSUP
P);
assert_return(ret, -EINVAL);
if (pid == 0)
assert_return(ret, -EINVAL);
if (pid == 0)
@@
-219,7
+222,7
@@
_public_ int sd_bus_creds_get_gid(sd_bus_creds *c, gid_t *gid) {
assert_return(c, -EINVAL);
assert_return(gid, -EINVAL);
assert_return(c, -EINVAL);
assert_return(gid, -EINVAL);
- if (!(c->mask & SD_BUS_CREDS_
U
ID))
+ if (!(c->mask & SD_BUS_CREDS_
G
ID))
return -ENODATA;
*gid = c->gid;
return -ENODATA;
*gid = c->gid;
@@
-592,11
+595,11
@@
static int has_cap(sd_bus_creds *c, unsigned offset, int capability) {
assert(capability >= 0);
assert(c->capability);
assert(capability >= 0);
assert(c->capability);
- sz = DIV_ROUND_UP(cap_last_cap(), 32U)
* 4
;
+ sz = DIV_ROUND_UP(cap_last_cap(), 32U);
if ((unsigned)capability > cap_last_cap())
return 0;
if ((unsigned)capability > cap_last_cap())
return 0;
- return !!(c->capability[offset * sz +
(capability / 8)] & (1 << (capability % 8)
));
+ return !!(c->capability[offset * sz +
CAP_TO_INDEX(capability)] & CAP_TO_MASK(capability
));
}
_public_ int sd_bus_creds_has_effective_cap(sd_bus_creds *c, int capability) {
}
_public_ int sd_bus_creds_has_effective_cap(sd_bus_creds *c, int capability) {
@@
-641,38
+644,42
@@
_public_ int sd_bus_creds_has_bounding_cap(sd_bus_creds *c, int capability) {
static int parse_caps(sd_bus_creds *c, unsigned offset, const char *p) {
size_t sz, max;
static int parse_caps(sd_bus_creds *c, unsigned offset, const char *p) {
size_t sz, max;
- unsigned i;
+ unsigned i
, j
;
assert(c);
assert(p);
assert(c);
assert(p);
- max = DIV_ROUND_UP(cap_last_cap(), 32U)
* 4
;
+ max = DIV_ROUND_UP(cap_last_cap(), 32U);
p += strspn(p, WHITESPACE);
sz = strlen(p);
p += strspn(p, WHITESPACE);
sz = strlen(p);
- if (sz %
2
!= 0)
+ if (sz %
8
!= 0)
return -EINVAL;
return -EINVAL;
- sz /=
2
;
+ sz /=
8
;
if (sz > max)
return -EINVAL;
if (!c->capability) {
if (sz > max)
return -EINVAL;
if (!c->capability) {
- c->capability = new0(uint
8
_t, max * 4);
+ c->capability = new0(uint
32
_t, max * 4);
if (!c->capability)
return -ENOMEM;
}
for (i = 0; i < sz; i ++) {
if (!c->capability)
return -ENOMEM;
}
for (i = 0; i < sz; i ++) {
-
int x, y
;
+
uint32_t v = 0
;
- x = unhexchar(p[i*2]);
-
y = unhexchar(p[i*2+1])
;
+ for (j = 0; j < 8; ++j) {
+
int t
;
- if (x < 0 || y < 0)
- return -EINVAL;
+ t = unhexchar(*p++);
+ if (t < 0)
+ return -EINVAL;
+
+ v = (v << 4) | t;
+ }
- c->capability[offset * max + (sz - i - 1)] =
(uint8_t) x << 4 | (uint8_t) y
;
+ c->capability[offset * max + (sz - i - 1)] =
v
;
}
return 0;
}
return 0;
@@
-934,7
+941,7
@@
int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
if (missing & SD_BUS_CREDS_AUDIT_SESSION_ID) {
r = audit_session_from_pid(pid, &c->audit_session_id);
if (r < 0) {
if (missing & SD_BUS_CREDS_AUDIT_SESSION_ID) {
r = audit_session_from_pid(pid, &c->audit_session_id);
if (r < 0) {
- if (r != -E
NOTSU
P && r != -ENXIO && r != -ENOENT && r != -EPERM && r != -EACCES)
+ if (r != -E
OPNOTSUP
P && r != -ENXIO && r != -ENOENT && r != -EPERM && r != -EACCES)
return r;
} else
c->mask |= SD_BUS_CREDS_AUDIT_SESSION_ID;
return r;
} else
c->mask |= SD_BUS_CREDS_AUDIT_SESSION_ID;
@@
-943,7
+950,7
@@
int bus_creds_add_more(sd_bus_creds *c, uint64_t mask, pid_t pid, pid_t tid) {
if (missing & SD_BUS_CREDS_AUDIT_LOGIN_UID) {
r = audit_loginuid_from_pid(pid, &c->audit_login_uid);
if (r < 0) {
if (missing & SD_BUS_CREDS_AUDIT_LOGIN_UID) {
r = audit_loginuid_from_pid(pid, &c->audit_login_uid);
if (r < 0) {
- if (r != -E
NOTSU
P && r != -ENXIO && r != -ENOENT && r != -EPERM && r != -EACCES)
+ if (r != -E
OPNOTSUP
P && r != -ENXIO && r != -ENOENT && r != -EPERM && r != -EACCES)
return r;
} else
c->mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID;
return r;
} else
c->mask |= SD_BUS_CREDS_AUDIT_LOGIN_UID;