/* Start timer with the reference */
uv_loop_t *loop = uv_default_loop();
- uv_timer_init(loop, timer);
- int ret = uv_timer_start(timer, event_callback, timeout, repeat);
- if (ret != 0) {
- free(timer);
- lua_error_p(L, "couldn't start the event");
- }
+ int ret = uv_timer_init(loop, timer);
+ if (ret != 0)
+ goto exit_err;
+ ret = uv_timer_start(timer, event_callback, timeout, repeat);
+ if (ret != 0)
+ goto exit_err;
/* Save callback and timer in registry */
lua_newtable(L);
timer->data = (void *) (intptr_t)ref;
lua_pushinteger(L, ref);
return 1;
+
+exit_err:
+ free(timer);
+ lua_error_p(L, "couldn't start the event");
}
static int event_after(lua_State *L)
* This is magic presuming we can pull in a whole recvmmsg width in one wave.
* Linux will double this the bufsize wanted.
*/
- const int BUF_SIZE = 2 * sizeof(RECVMMSG_BATCH * KNOT_WIRE_MAX_PKTSIZE);
+ const int BUF_SIZE = 2 * RECVMMSG_BATCH * KNOT_WIRE_MAX_PKTSIZE;
negotiate_bufsize(uv_recv_buffer_size, handle, BUF_SIZE);
negotiate_bufsize(uv_send_buffer_size, handle, BUF_SIZE);
}
.baton = baton,
.comm = comm
};
+ int err_ret = kr_ok();
switch (s->transport.type) {
case SESSION2_TRANSPORT_IO:;
uv_handle_t *handle = s->transport.io.handle;
if (kr_fails_assert(handle)) {
- if (cb)
- cb(kr_error(EINVAL), s, comm, baton);
- free(ctx);
- return kr_error(EINVAL);
+ err_ret = kr_error(EINVAL);
+ goto exit_err;
}
if (handle->type == UV_UDP) {
if (ENABLE_SENDMMSG && !s->outgoing) {
int fd;
int ret = uv_fileno(handle, &fd);
- if (kr_fails_assert(!ret))
- return kr_error(EIO);
+ if (kr_fails_assert(!ret)) {
+ err_ret = kr_error(EIO);
+ goto exit_err;
+ }
/* TODO: support multiple iovecs properly? */
- if (kr_fails_assert(iovcnt == 1))
- return kr_error(EINVAL);
+ if (kr_fails_assert(iovcnt == 1)) {
+ err_ret = kr_error(EINVAL);
+ goto exit_err;
+ }
session2_transport_pushv_ensure_long_lived(
&iov, &iovcnt, iov_short_lived,
#if ENABLE_XDP
} else if (handle->type == UV_POLL) {
xdp_handle_data_t *xhd = handle->data;
- if (kr_fails_assert(xhd && xhd->socket))
- return kr_error(EIO);
+ if (kr_fails_assert(xhd && xhd->socket)) {
+ err_ret = kr_error(EIO);
+ goto exit_err;
+ }
/* TODO: support multiple iovecs properly? */
- if (kr_fails_assert(iovcnt == 1))
- return kr_error(EINVAL);
+ if (kr_fails_assert(iovcnt == 1)) {
+ err_ret = kr_error(EINVAL);
+ goto exit_err;
+ }
session2_transport_pushv_ensure_long_lived(
&iov, &iovcnt, iov_short_lived,
#endif
} else {
kr_assert(false && "Unsupported handle");
- if (cb)
- cb(kr_error(EINVAL), s, comm, baton);
- free(ctx);
- return kr_error(EINVAL);
+ err_ret = kr_error(EINVAL);
+ goto exit_err;
}
case SESSION2_TRANSPORT_PARENT:;
struct session2 *parent = s->transport.parent;
if (kr_fails_assert(parent)) {
- free(ctx);
- return kr_error(EINVAL);
+ err_ret = kr_error(EINVAL);
+ goto exit_err;
}
int ret = session2_wrap(parent,
protolayer_iovec(iov, iovcnt, iov_short_lived),
default:
kr_assert(false && "Invalid transport");
- free(ctx);
- return kr_error(EINVAL);
+ err_ret = kr_error(EINVAL);
+ goto exit_err;
}
+
+exit_err:
+ session2_transport_pushv_finished(err_ret, ctx);
+ return err_ret;
}
struct push_ctx {
}
data.size = stat.st_size;
bytes_read = read(datafd, data.data, stat.st_size);
- if (bytes_read != stat.st_size) {
+ if (bytes_read < 0 || bytes_read != stat.st_size) {
kr_log_error(TLS, "unable to read ephemeral private key\n");
goto bad_data;
}
kr_log_error(RULES, "ERROR: invalid length: %d\n", (int)val.len);
return kr_error(EILSEQ);
}
- *tagset |= (1 << *tindex_p);
+ *tagset |= ((kr_rule_tags_t)1 << *tindex_p);
return kr_ok();
} else if (ret != kr_error(ENOENT)) {
return ret;
int ix = ffsll(~bmp) - 1;
if (ix < 0 || ix >= 8 * sizeof(bmp))
return kr_error(E2BIG);
- const kr_rule_tags_t tag_new = 1 << ix;
+ const kr_rule_tags_t tag_new = (kr_rule_tags_t)1 << ix;
kr_require((tag_new & bmp) == 0);
// Update the bitmap. ATM ruledb does not overwrite, so we `remove` before `write`.
knot_rrset_init(rr, NULL, s->r_type, KNOT_CLASS_IN, s->r_ttl);
// we don't ^^ need owner so save allocation
}
- knot_rrset_add_rdata(rr, s->r_data, s->r_data_length, s_data->pool);
+ int ret = knot_rrset_add_rdata(rr, s->r_data, s->r_data_length, s_data->pool);
+ kr_assert(!ret);
}
/// Process an RRset of other types into a rule
static int rr_trie2rule(const char *key_data, uint32_t key_len, trie_val_t *rr_p, void *config)
JsonNode *sup = json_find_member(ctx->root, sup_key_nt);
if (!sup) {
sup = json_mkobject();
+ if (kr_fails_assert(sup))
+ return 0;
json_append_member(ctx->root, sup_key_nt, sup);
}
if (kr_fails_assert(sup))
JsonNode *sup = json_find_member(root, elm->sup_key);
if (!sup) {
sup = json_mkobject();
+ if (kr_fails_assert(sup))
+ break;
json_append_member(root, elm->sup_key, sup);
}
if (kr_fails_assert(sup))