improve alignment algorithm
This commit is contained in:
parent
98c7d8b648
commit
d2ee4cb71d
3 changed files with 29 additions and 30 deletions
4
server.c
4
server.c
|
@ -743,7 +743,7 @@ int bus_client_process_message(Bus *s, BusClient *client, WireCtx *ctx)
|
||||||
// message needs to be routed
|
// message needs to be routed
|
||||||
// TODO: perform checks here like making sure all method calls have the 'member' field, etc.
|
// TODO: perform checks here like making sure all method calls have the 'member' field, etc.
|
||||||
|
|
||||||
if (!client->unique_name) {
|
if (unlikely(!client->unique_name)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -760,7 +760,7 @@ int bus_client_process_message(Bus *s, BusClient *client, WireCtx *ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
end_nonfatal:
|
end_nonfatal:
|
||||||
if (ctx->byte_cursor != body_end) {
|
if (unlikely(ctx->byte_cursor != body_end)) {
|
||||||
// The code above did not properly consume the entire message while parsing.
|
// The code above did not properly consume the entire message while parsing.
|
||||||
// This is bad, because we expect the byte_cursor after this function to be
|
// This is bad, because we expect the byte_cursor after this function to be
|
||||||
// exactly at the end of a message. We rely on this invariant for message
|
// exactly at the end of a message. We rely on this invariant for message
|
||||||
|
|
28
wire.c
28
wire.c
|
@ -4,34 +4,6 @@
|
||||||
#include "wire.h"
|
#include "wire.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
bool wire_align(WireCtx *c, uint32_t alignment)
|
|
||||||
{
|
|
||||||
if ((c->byte_cursor % alignment) == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
uint32_t new_cursor = c->byte_cursor + alignment - (c->byte_cursor % alignment);
|
|
||||||
if (unlikely(new_cursor >= c->data_len || new_cursor < c->byte_cursor)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
c->byte_cursor = new_cursor;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool wire_write_align(WireCtx *c, uint32_t alignment)
|
|
||||||
{
|
|
||||||
if ((c->byte_cursor % alignment) == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
uint32_t new_cursor = c->byte_cursor + alignment - (c->byte_cursor % alignment);
|
|
||||||
if (unlikely(new_cursor >= c->data_len || new_cursor < c->byte_cursor)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
while (c->byte_cursor < new_cursor) {
|
|
||||||
c->data[c->byte_cursor++] = '\0';
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// SPEC: https://dbus.freedesktop.org/doc/dbus-specification.html#id-1.4.6
|
// SPEC: https://dbus.freedesktop.org/doc/dbus-specification.html#id-1.4.6
|
||||||
_WIRE_DEF_BYTE_TYPE(i8, int8_t)
|
_WIRE_DEF_BYTE_TYPE(i8, int8_t)
|
||||||
_WIRE_DEF_BYTE_TYPE(u8, uint8_t)
|
_WIRE_DEF_BYTE_TYPE(u8, uint8_t)
|
||||||
|
|
27
wire.h
27
wire.h
|
@ -4,6 +4,7 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
|
||||||
#define DBUS_PROTOCOL_VERSION 1
|
#define DBUS_PROTOCOL_VERSION 1
|
||||||
|
@ -64,6 +65,32 @@ typedef struct {
|
||||||
char *str;
|
char *str;
|
||||||
} WireMsgBodyString;
|
} WireMsgBodyString;
|
||||||
|
|
||||||
|
static inline bool wire_write_align(WireCtx *c, uint32_t alignment)
|
||||||
|
{
|
||||||
|
// Thanks: https://github.com/c-util/c-stdaux/blob/ed5fee49a3ec13fe79f30324b23c73cd41805514/src/c-stdaux-gnuc.h#L431
|
||||||
|
uint32_t new_cursor = ((c->byte_cursor) + (alignment) - 1) & ~((alignment) - 1);
|
||||||
|
|
||||||
|
if (unlikely(new_cursor >= c->data_len || new_cursor < c->byte_cursor)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
while (c->byte_cursor < new_cursor) {
|
||||||
|
c->data[c->byte_cursor++] = '\0';
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool wire_align(WireCtx *c, uint32_t alignment)
|
||||||
|
{
|
||||||
|
// Thanks: https://github.com/c-util/c-stdaux/blob/ed5fee49a3ec13fe79f30324b23c73cd41805514/src/c-stdaux-gnuc.h#L431
|
||||||
|
uint32_t new_cursor = ((c->byte_cursor) + (alignment) - 1) & ~((alignment) - 1);
|
||||||
|
|
||||||
|
if (unlikely(new_cursor >= c->data_len || new_cursor < c->byte_cursor)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
c->byte_cursor = new_cursor;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#define _WIRE_DECL_BYTE_TYPE(M_mnemonic, M_type) \
|
#define _WIRE_DECL_BYTE_TYPE(M_mnemonic, M_type) \
|
||||||
M_type *wire_get_##M_mnemonic(WireCtx *c); \
|
M_type *wire_get_##M_mnemonic(WireCtx *c); \
|
||||||
M_type *wire_set_##M_mnemonic(WireCtx *c, M_type val); \
|
M_type *wire_set_##M_mnemonic(WireCtx *c, M_type val); \
|
||||||
|
|
Loading…
Reference in a new issue