Compare commits

..

No commits in common. "98c7d8b6488f03ca376c287b8e05529b0a58d394" and "2fb13032abaa92213e72cc1f5975210a8a5b1097" have entirely different histories.

3 changed files with 19 additions and 10 deletions

View file

@ -178,7 +178,7 @@ fail:
} \ } \
} while(0) } while(0)
int match_check_sender(BusClient *sender_client, MatchRule *rule) int match_check_sender(Bus *s, BusClient *sender_client, MatchRule *rule)
{ {
if (rule->sender) { if (rule->sender) {
if (sender_client->unique_name) { if (sender_client->unique_name) {
@ -196,7 +196,7 @@ int match_check_sender(BusClient *sender_client, MatchRule *rule)
return -1; return -1;
} }
int match_rule_check(BusClient *sender_client, MatchRule *rule, WireMsg *msg, WireCtx *ctx) int match_rule_check(Bus *s, BusClient *sender_client, MatchRule *rule, WireMsg *msg, WireCtx *ctx)
{ {
if (rule->type && msg->type != rule->type) { if (rule->type && msg->type != rule->type) {
return -1; return -1;
@ -208,7 +208,7 @@ int match_rule_check(BusClient *sender_client, MatchRule *rule, WireMsg *msg, Wi
return -1; return -1;
} }
} else { } else {
if (match_check_sender(sender_client, rule) < 0) { if (match_check_sender(s, sender_client, rule) < 0) {
return -1; return -1;
} }
} }

View file

@ -8,6 +8,6 @@
void match_rule_free(MatchRule *rule); void match_rule_free(MatchRule *rule);
MatchRule *match_rule_from_string(char *d); MatchRule *match_rule_from_string(char *d);
int match_rule_check(BusClient *sender_client, MatchRule *rule, WireMsg *msg, WireCtx *ctx); int match_rule_check(Bus *s, BusClient *sender_client, MatchRule *rule, WireMsg *msg, WireCtx *ctx);
#endif // _JITTERBUG__MATCH_H #endif // _JITTERBUG__MATCH_H

View file

@ -196,7 +196,7 @@ BusName *bus_name_add(Bus *s, char *name, BusClient *client)
return NULL; return NULL;
} }
int bus_client_match_add(BusClient *c, char *match) int bus_client_match_add(Bus *s, BusClient *c, char *match)
{ {
for (int i = 0; i < BUS_MAX_MATCH; i++) { for (int i = 0; i < BUS_MAX_MATCH; i++) {
if (!c->matches[i]) { if (!c->matches[i]) {
@ -325,7 +325,7 @@ int bus_broadcast_message(Bus *s, BusClient *sender_client, WireMsg *msg, WireCt
match_left--; match_left--;
uint32_t previous_cursor = ctx->byte_cursor; uint32_t previous_cursor = ctx->byte_cursor;
if (match_rule_check(sender_client, c->matches[j], msg, ctx) >= 0) { if (match_rule_check(s, sender_client, c->matches[j], msg, ctx) >= 0) {
TRYST(wire_compose_unicast_reply(reply_ctx, ctx, msg, sender_client->unique_name->name)); TRYST(wire_compose_unicast_reply(reply_ctx, ctx, msg, sender_client->unique_name->name));
TRYST(send(c->fd, reply_ctx->data, reply_ctx->byte_cursor, 0)); TRYST(send(c->fd, reply_ctx->data, reply_ctx->byte_cursor, 0));
// TODO? // TODO?
@ -360,7 +360,7 @@ int bus_broadcast_signal(Bus *s, BusClient *client, WireCtx *ctx, WireMsg *msg)
} }
match_left--; match_left--;
if (match_rule_check(client, c->matches[j], msg, ctx) >= 0) { if (match_rule_check(s, client, c->matches[j], msg, ctx) >= 0) {
uint32_t previous_cursor = ctx->byte_cursor; uint32_t previous_cursor = ctx->byte_cursor;
TRYST(send(c->fd, ctx->data, ctx->byte_cursor, 0)); TRYST(send(c->fd, ctx->data, ctx->byte_cursor, 0));
ctx->byte_cursor = previous_cursor; ctx->byte_cursor = previous_cursor;
@ -399,7 +399,6 @@ int bus_unicast_message(Bus *s, WireMsg *msg, WireCtx *ctx, char *target_name, c
#define _reply_begin(M_sig) \ #define _reply_begin(M_sig) \
(void)s; \
uint32_t *body_length = NULL; \ uint32_t *body_length = NULL; \
uint32_t body_start = 0; \ uint32_t body_start = 0; \
if (!(msg->flags & DBUS_FLAG_NO_REPLY_EXPECTED)) { \ if (!(msg->flags & DBUS_FLAG_NO_REPLY_EXPECTED)) { \
@ -570,7 +569,7 @@ int handle_add_match(Bus *s, BusClient *client, WireMsg *msg, WireCtx *ctx, Wire
VERBOSE("client index %d adding match rule: '%s'\n", client->fd_index, match); VERBOSE("client index %d adding match rule: '%s'\n", client->fd_index, match);
TRYST(bus_client_match_add(client, match)); TRYST(bus_client_match_add(s, client, match));
_reply_begin("") {} _reply_end() _reply_begin("") {} _reply_end()
return 0; return 0;
@ -815,6 +814,16 @@ int bus_turn(Bus *s)
static const char auth_data[] = "DATA\r\n"; static const char auth_data[] = "DATA\r\n";
static const int data_buffer_len = 16384; static const int data_buffer_len = 16384;
// We can keep a padding of null bytes for the data buffer. In the event that, for
// example, a string function is called on a char array without a proper ending null
// byte, we will reach the null bytes here at the end instead, thus preventing a
// crash and potential corruption. While this is a good "last line of defense"
// against such issues, it is much more important for these kinds of bugs to not
// exist in the first place. This mitigation will prevent, for example, ASAN from
// finding such bugs. It's recommended that you disable this padding outside
// of production so that you can find these bugs.
static const int data_buffer_padding = 0;
TRYST(poll(s->fds, s->fd_num, -1)); TRYST(poll(s->fds, s->fd_num, -1));
for (int i = 0; i < s->fd_num; i++) { for (int i = 0; i < s->fd_num; i++) {
@ -855,7 +864,7 @@ int bus_turn(Bus *s)
} }
// We add padding. See above. // We add padding. See above.
char data[data_buffer_len]; char data[data_buffer_len + data_buffer_padding];
ssize_t bytes = recv(fd, data, data_buffer_len, 0); ssize_t bytes = recv(fd, data, data_buffer_len, 0);
if (bytes <= 0) { if (bytes <= 0) {
// error during recv() OR client disconnected, disconnect the client // error during recv() OR client disconnected, disconnect the client