1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2025-01-03 01:17:45 +03:00

sd-bus: make sure we always serialize the reply cookie as 64bit on dbus2, and 32bit on dbus1

This commit is contained in:
Lennart Poettering 2015-02-16 15:59:45 +01:00
parent 2ac7c17f9d
commit b267a6d204
2 changed files with 19 additions and 11 deletions

View File

@ -1152,7 +1152,7 @@ int bus_kernel_write_message(sd_bus *bus, sd_bus_message *m, bool hint_sync_call
/* Anybody can send us invalid messages, let's just drop them. */
if (r == -EBADMSG || r == -EPROTOTYPE)
log_debug_errno(r, "Ignoring invalid message: %m");
log_debug_errno(r, "Ignoring invalid synchronous reply: %m");
else
return r;
}

View File

@ -413,6 +413,20 @@ static int message_append_field_uint64(sd_bus_message *m, uint64_t h, uint64_t x
return 0;
}
static int message_append_reply_cookie(sd_bus_message *m, uint64_t cookie) {
assert(m);
if (BUS_MESSAGE_IS_GVARIANT(m))
return message_append_field_uint64(m, BUS_MESSAGE_HEADER_REPLY_SERIAL, cookie);
else {
/* 64bit cookies are not supported on dbus1 */
if (cookie > 0xffffffffUL)
return -ENOTSUP;
return message_append_field_uint32(m, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) cookie);
}
}
int bus_message_from_header(
sd_bus *bus,
void *header,
@ -737,14 +751,7 @@ static int message_new_reply(
if (t->reply_cookie == 0)
return -ENOTSUP;
if (BUS_MESSAGE_IS_GVARIANT(t))
r = message_append_field_uint64(t, BUS_MESSAGE_HEADER_REPLY_SERIAL, t->reply_cookie);
else {
if (t->reply_cookie > 0xffffffff)
return -ENOTSUP;
r = message_append_field_uint32(t, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) t->reply_cookie);
}
r = message_append_reply_cookie(t, t->reply_cookie);
if (r < 0)
goto fail;
@ -898,7 +905,7 @@ int bus_message_new_synthetic_error(
t->header->flags |= BUS_MESSAGE_NO_REPLY_EXPECTED;
t->reply_cookie = cookie;
r = message_append_field_uint32(t, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) t->reply_cookie);
r = message_append_reply_cookie(t, t->reply_cookie);
if (r < 0)
goto fail;
@ -5818,7 +5825,8 @@ int bus_message_remarshal(sd_bus *bus, sd_bus_message **m) {
return -ENOMEM;
n->reply_cookie = (*m)->reply_cookie;
r = message_append_field_uint32(n, BUS_MESSAGE_HEADER_REPLY_SERIAL, (uint32_t) n->reply_cookie);
r = message_append_reply_cookie(n, n->reply_cookie);
if (r < 0)
return r;