chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
memfd: always create our memfds with CLOEXEC set
[elogind.git]
/
src
/
libsystemd
/
sd-bus
/
bus-kernel.c
diff --git
a/src/libsystemd/sd-bus/bus-kernel.c
b/src/libsystemd/sd-bus/bus-kernel.c
index c3dbc837d72c26f970084b879d9b59d5e9d596cb..3f8b0ab65a5562896a310ae2ad8a37980b93e4fc 100644
(file)
--- a/
src/libsystemd/sd-bus/bus-kernel.c
+++ b/
src/libsystemd/sd-bus/bus-kernel.c
@@
-270,10
+270,15
@@
static int bus_message_setup_kmsg(sd_bus *b, sd_bus_message *m) {
m->kdbus->cookie = (uint64_t) m->header->serial;
m->kdbus->priority = m->priority;
m->kdbus->cookie = (uint64_t) m->header->serial;
m->kdbus->priority = m->priority;
- if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
+ if (m->header->flags & BUS_MESSAGE_NO_REPLY_EXPECTED)
{
m->kdbus->cookie_reply = m->reply_cookie;
m->kdbus->cookie_reply = m->reply_cookie;
- else
- m->kdbus->timeout_ns = m->timeout * NSEC_PER_USEC;
+ } else {
+ struct timespec now;
+
+ assert_se(clock_gettime(CLOCK_MONOTONIC_COARSE, &now) == 0);
+ m->kdbus->timeout_ns = now.tv_sec * NSEC_PER_SEC + now.tv_nsec +
+ m->timeout * NSEC_PER_USEC;
+ }
d = m->kdbus->items;
d = m->kdbus->items;
@@
-570,8
+575,8
@@
static int bus_kernel_make_message(sd_bus *bus, struct kdbus_msg *k) {
break;
case KDBUS_ITEM_CAPS:
break;
case KDBUS_ITEM_CAPS:
- m->creds.capability =
d->data
;
- m->creds.capability_size =
l
;
+ m->creds.capability =
(uint8_t *) d->caps.caps
;
+ m->creds.capability_size =
d->size - offsetof(struct kdbus_item, caps.caps)
;
m->creds.mask |= (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS) & bus->creds_mask;
break;
m->creds.mask |= (SD_BUS_CREDS_EFFECTIVE_CAPS|SD_BUS_CREDS_PERMITTED_CAPS|SD_BUS_CREDS_INHERITABLE_CAPS|SD_BUS_CREDS_BOUNDING_CAPS) & bus->creds_mask;
break;
@@
-714,7
+719,7
@@
int bus_kernel_take_fd(sd_bus *b) {
hello = alloca0_align(sz, 8);
hello->size = sz;
hello = alloca0_align(sz, 8);
hello->size = sz;
- hello->
conn_
flags = b->hello_flags;
+ hello->flags = b->hello_flags;
hello->attach_flags = b->attach_flags;
hello->pool_size = KDBUS_POOL_SIZE;
hello->attach_flags = b->attach_flags;
hello->pool_size = KDBUS_POOL_SIZE;
@@
-751,10
+756,9
@@
int bus_kernel_take_fd(sd_bus *b) {
}
}
}
}
- /* The higher 32bit of
both
flags fields are considered
+ /* The higher 32bit of
the bus_
flags fields are considered
* 'incompatible flags'. Refuse them all for now. */
* 'incompatible flags'. Refuse them all for now. */
- if (hello->bus_flags > 0xFFFFFFFFULL ||
- hello->conn_flags > 0xFFFFFFFFULL)
+ if (hello->bus_flags > 0xFFFFFFFFULL)
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
@@
-770,7
+774,7
@@
int bus_kernel_take_fd(sd_bus *b) {
b->is_kernel = true;
b->bus_client = true;
b->is_kernel = true;
b->bus_client = true;
- b->can_fds = !!(hello->
conn_
flags & KDBUS_HELLO_ACCEPT_FD);
+ b->can_fds = !!(hello->flags & KDBUS_HELLO_ACCEPT_FD);
b->message_version = 2;
b->message_endian = BUS_NATIVE_ENDIAN;
b->message_version = 2;
b->message_endian = BUS_NATIVE_ENDIAN;
@@
-1125,7
+1129,7
@@
int bus_kernel_pop_memfd(sd_bus *bus, void **address, size_t *mapped, size_t *al
if (!g)
return -ENOMEM;
if (!g)
return -ENOMEM;
- r = memfd_create(g, MFD_ALLOW_SEALING);
+ r = memfd_create(g, MFD_ALLOW_SEALING
|MFD_CLOEXEC
);
if (r < 0)
return -errno;
if (r < 0)
return -errno;
@@
-1230,8
+1234,11
@@
int kdbus_translate_attach_flags(uint64_t mask, uint64_t *kdbus_mask) {
if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID))
m |= KDBUS_ATTACH_CREDS;
if (mask & (SD_BUS_CREDS_UID|SD_BUS_CREDS_GID|SD_BUS_CREDS_PID|SD_BUS_CREDS_PID_STARTTIME|SD_BUS_CREDS_TID))
m |= KDBUS_ATTACH_CREDS;
- if (mask & (SD_BUS_CREDS_COMM|SD_BUS_CREDS_TID_COMM))
- m |= KDBUS_ATTACH_COMM;
+ if (mask & SD_BUS_CREDS_COMM)
+ m |= KDBUS_ATTACH_PID_COMM;
+
+ if (mask & SD_BUS_CREDS_TID_COMM)
+ m |= KDBUS_ATTACH_TID_COMM;
if (mask & SD_BUS_CREDS_EXE)
m |= KDBUS_ATTACH_EXE;
if (mask & SD_BUS_CREDS_EXE)
m |= KDBUS_ATTACH_EXE;
@@
-1307,13
+1314,6
@@
int bus_kernel_create_bus(const char *name, bool world, char **s) {
return -errno;
}
return -errno;
}
- /* The features field are considered 'incompatible flags'.
- * Refuse them all for now. */
- if (make->features) {
- safe_close(fd);
- return -ENOTSUP;
- }
-
if (s) {
char *p;
if (s) {
char *p;
@@
-1444,13
+1444,6
@@
int bus_kernel_create_endpoint(const char *bus_name, const char *ep_name, char *
return -errno;
}
return -errno;
}
- /* The features field are considered 'incompatible flags'.
- * Refuse them all for now. */
- if (make->features) {
- safe_close(fd);
- return -ENOTSUP;
- }
-
if (ep_path) {
char *p;
if (ep_path) {
char *p;
@@
-1565,7
+1558,7
@@
int bus_kernel_make_starter(
}
hello->size = size;
}
hello->size = size;
- hello->
conn_
flags =
+ hello->flags =
(activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) |
(accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
hello->pool_size = KDBUS_POOL_SIZE;
(activating ? KDBUS_HELLO_ACTIVATOR : KDBUS_HELLO_POLICY_HOLDER) |
(accept_fd ? KDBUS_HELLO_ACCEPT_FD : 0);
hello->pool_size = KDBUS_POOL_SIZE;
@@
-1574,11
+1567,9
@@
int bus_kernel_make_starter(
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
return -errno;
if (ioctl(fd, KDBUS_CMD_HELLO, hello) < 0)
return -errno;
- /* The higher 32bit of
both
flags fields are considered
+ /* The higher 32bit of
the bus_
flags fields are considered
* 'incompatible flags'. Refuse them all for now. */
* 'incompatible flags'. Refuse them all for now. */
- if (hello->features ||
- hello->bus_flags > 0xFFFFFFFFULL ||
- hello->conn_flags > 0xFFFFFFFFULL)
+ if (hello->bus_flags > 0xFFFFFFFFULL)
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))
return -ENOTSUP;
if (!bloom_validate_parameters((size_t) hello->bloom.size, (unsigned) hello->bloom.n_hash))