uint64_t off;
off = (uint8_t *)m->kdbus - (uint8_t *)m->bus->kdbus_buffer;
- ioctl(m->bus->input_fd, KDBUS_CMD_MSG_RELEASE, &off);
+ ioctl(m->bus->input_fd, KDBUS_CMD_FREE, &off);
}
if (m->bus)
}
t->dont_send = !!(call->header->flags & SD_BUS_MESSAGE_NO_REPLY_EXPECTED);
+ t->enforced_reply_signature = call->enforced_reply_signature;
*m = t;
return 0;
goto fail;
}
+ t->error._need_free = -1;
+
*m = t;
return 0;
goto fail;
}
+ t->error._need_free = -1;
+
*m = t;
return 0;
return -EBADMSG;
r = message_peek_field_string(m, error_name_is_valid, &ri, &m->error.name);
+ if (r >= 0)
+ m->error._need_free = -1;
+
break;
case SD_BUS_MESSAGE_HEADER_DESTINATION:
return -EBADMSG;
r = message_peek_field_string(m, service_name_is_valid, &ri, &m->sender);
+
+ if (r >= 0 && m->sender[0] == ':' && m->bus && m->bus->bus_client && !m->bus->is_kernel) {
+ m->creds.unique_name = (char*) m->sender;
+ m->creds.mask |= SD_BUS_CREDS_UNIQUE_NAME & m->bus->creds_mask;
+ }
+
break;
if (m->poisoned)
return -ESTALE;
+ /* In vtables the return signature of method calls is listed,
+ * let's check if they match if this is a response */
+ if (m->header->type == SD_BUS_MESSAGE_METHOD_RETURN &&
+ m->enforced_reply_signature &&
+ !streq(strempty(m->root_container.signature), m->enforced_reply_signature))
+ return -ENOMSG;
+
/* If there's a non-trivial signature set, then add it in here */
if (!isempty(m->root_container.signature)) {
r = message_append_field_signature(m, SD_BUS_MESSAGE_HEADER_SIGNATURE, m->root_container.signature, NULL);