diff options
-rw-r--r-- | announce.c | 8 | ||||
-rw-r--r-- | cfgdir.c | 2 | ||||
-rw-r--r-- | idle.c | 39 | ||||
-rw-r--r-- | igmp.c | 77 | ||||
-rw-r--r-- | main.c | 42 | ||||
-rw-r--r-- | main.h | 12 | ||||
-rw-r--r-- | proxy.c | 27 | ||||
-rw-r--r-- | rcon.c | 67 | ||||
-rw-r--r-- | server.c | 10 | ||||
-rw-r--r-- | systemd.c | 23 | ||||
-rw-r--r-- | uring.c | 158 | ||||
-rw-r--r-- | uring.h | 2 | ||||
-rw-r--r-- | utils.c | 54 |
13 files changed, 323 insertions, 198 deletions
@@ -30,7 +30,7 @@ mcast_sent(struct cfg *cfg, struct uring_task *task, int res) { struct server *server = container_of(task->tbuf, struct server, mcast_buf); - assert_return(task && task->tbuf); + assert_return(cfg && task && task->tbuf); if (res < 0) error("failure %i", res); @@ -110,7 +110,7 @@ announce_free(struct uring_task *task) void announce_refdump(struct announce *aev) { - assert_return(aev); + assert_return_silent(aev); uring_task_refdump(&aev->task); uring_task_refdump(&aev->mcast_task); @@ -188,10 +188,10 @@ announce_init(struct cfg *cfg) if (sfd < 0) die("socket: %m"); - uring_task_init(&aev->task, "aev", uring_parent(cfg), announce_free); + uring_task_init(cfg, &aev->task, "aev", uring_parent(cfg), announce_free); uring_task_set_fd(&aev->task, afd); - uring_task_init(&aev->mcast_task, "aev_mcast", &aev->task, mcast_free); + uring_task_init(cfg, &aev->mcast_task, "aev_mcast", &aev->task, mcast_free); uring_task_set_fd(&aev->mcast_task, sfd); saddr_set_ipv4(&aev->mcast_task.saddr, cinet_addr(224,0,2,60), htons(4445)); @@ -555,7 +555,7 @@ cfgdir_init(struct cfg *cfg) if (iwd < 0) die("inotify_add_watch: %m"); - uring_task_init(&iev->task, "iev", uring_parent(cfg), inotify_free); + uring_task_init(cfg, &iev->task, "iev", uring_parent(cfg), inotify_free); uring_task_set_fd(&iev->task, ifd); cfg->iev = iev; uring_read(cfg, &iev->task, iev->buf, sizeof(iev->buf), inotify_cb); @@ -30,12 +30,15 @@ idle_check_free(struct uring_task *task) { struct idle *idle = container_of(task, struct idle, idlecheck); + assert_return(task && idle); debug(DBG_IDLE, "task %p, idle %p", task, idle); } static inline void write_byte(char **pos, char byte) { + assert_return(pos && *pos); + **pos = byte; (*pos)++; } @@ -49,6 +52,8 @@ write_byte(char **pos, char byte) static inline void write_varint(char **pos, int32_t orig) { + assert_return(pos && *pos); + uint32_t val = (uint32_t)orig; while (val) { @@ -72,6 +77,8 @@ read_varint(char **pos, size_t *remain, int32_t *res) unsigned consumed; uint32_t val = 0; + assert_return(pos && *pos && remain && res, -1); + for (consumed = 1; consumed <= *remain; consumed++) { uint32_t tmp; @@ -96,6 +103,8 @@ read_varint(char **pos, size_t *remain, int32_t *res) static inline void write_bytes(char **pos, const char *bytes, size_t n) { + assert_return(pos && *pos && bytes && n > 0); + memcpy(*pos, bytes, n); *pos += n; } @@ -103,12 +112,16 @@ write_bytes(char **pos, const char *bytes, size_t n) static inline void write_str(char **pos, const char *str) { + assert_return(pos && *pos && !empty_str(str)); + write_bytes(pos, str, strlen(str)); } static inline void write_cmd(char **pos, const char *begin, const char *end) { + assert_return(pos && *pos && begin && end && end > begin); + write_varint(pos, end - begin); write_bytes(pos, begin, end - begin); } @@ -121,6 +134,7 @@ idle_check_handshake_complete(struct cfg *cfg, struct uring_task *task, int res) int32_t mclen; int r; + assert_return(cfg && task, -EINVAL); assert_task_alive_or(DBG_IDLE, task, return -EINTR); remain = task->tbuf->len; @@ -163,6 +177,8 @@ get_player_count(struct cfg *cfg, const char *pos, size_t remain) char *end; unsigned count; + assert_return(cfg && pos && remain > 0, -1); + online = memmem(pos, remain, ONLINE_NEEDLE, strlen(ONLINE_NEEDLE)); if (!online) { error("could not find online count in JSON"); @@ -197,6 +213,7 @@ idle_check_handshake_reply(struct cfg *cfg, struct uring_task *task, int res) int player_count; int r; + assert_return(cfg && task); assert_task_alive(DBG_IDLE, task); debug(DBG_IDLE, "res: %i", res); @@ -280,6 +297,7 @@ idle_check_handshake_sent(struct cfg *cfg, struct uring_task *task, int res) { struct idle *idle = container_of(task, struct idle, idlecheck); + assert_return(cfg && task); assert_task_alive(DBG_IDLE, task); debug(DBG_IDLE, "sent %i bytes", res); @@ -303,6 +321,7 @@ idle_check_connected_cb(struct cfg *cfg, struct connection *conn, bool connected uint16_t port; char hostname[INET6_ADDRSTRLEN]; + assert_return(cfg && conn); assert_task_alive(DBG_IDLE, &idle->idlecheck); if (!connected) { @@ -322,7 +341,6 @@ idle_check_connected_cb(struct cfg *cfg, struct connection *conn, bool connected pos = buf; write_byte(&pos, MC_HELO); write_varint(&pos, -1); /* Protocol version, -1 = undefined */ - write_varint(&pos, strlen(hostname)); write_str(&pos, hostname); write_byte(&pos, (port >> 8) & 0xff); write_byte(&pos, (port >> 0) & 0xff); @@ -344,6 +362,7 @@ idle_cb(struct cfg *cfg, struct uring_task *task, int res) { struct idle *idle = container_of(task, struct idle, task); + assert_return(cfg && task); assert_task_alive(DBG_IDLE, task); if (res != sizeof(idle->value)) { @@ -367,6 +386,7 @@ idle_free(struct uring_task *task) { struct idle *idle = container_of(task, struct idle, task); + assert_return(task); debug(DBG_IDLE, "task %p, idle %p", task, idle); xfree(idle); } @@ -374,8 +394,7 @@ idle_free(struct uring_task *task) void idle_refdump(struct idle *idle) { - if (!idle) - return; + assert_return_silent(idle); uring_task_refdump(&idle->task); uring_task_refdump(&idle->idlecheck); @@ -384,11 +403,12 @@ idle_refdump(struct idle *idle) void idle_delete(struct cfg *cfg, struct server *server) { - struct idle *idle = server->idle; + struct idle *idle; - if (!idle) - return; + assert_return(cfg && server); + assert_return_silent(server->idle); + idle = server->idle; debug(DBG_IDLE, "closing fd %i", idle->task.fd); uring_task_destroy(cfg, &idle->idlecheck); uring_task_destroy(cfg, &idle->task); @@ -412,8 +432,7 @@ idle_init(struct cfg *cfg, struct server *server) } }; - if (!server) - return; + assert_return(cfg && server); if (server->idle_timeout < 1) return; @@ -429,9 +448,9 @@ idle_init(struct cfg *cfg, struct server *server) if (timerfd_settime(ifd, 0, &tspec, NULL) != 0) die("timerfd_settime: %m"); - uring_task_init(&idle->task, "idle", &server->task, idle_free); + uring_task_init(cfg, &idle->task, "idle", &server->task, idle_free); uring_task_set_fd(&idle->task, ifd); - uring_task_init(&idle->idlecheck, "idlecheck", &idle->task, idle_check_free); + uring_task_init(cfg, &idle->idlecheck, "idlecheck", &idle->task, idle_check_free); uring_task_set_buf(&idle->idlecheck, &idle->tbuf); idle->server = server; server->idle = idle; @@ -105,63 +105,68 @@ from32to16(unsigned int x) } static unsigned int -do_csum(const unsigned char *buff, int len) +do_csum(const unsigned char *buf, int len) { int odd; unsigned int result = 0; - if (len <= 0) - goto out; - odd = 1 & (unsigned long) buff; + assert_return(buf && len > 0, 0); + + odd = 1 & (unsigned long)buf; if (odd) { #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - result += (*buff << 8); + result += (*buf << 8); #else - result = *buff; + result = *buf; #endif len--; - buff++; + buf++; } + if (len >= 2) { - if (2 & (unsigned long) buff) { - result += *(unsigned short *) buff; + if (2 & (unsigned long)buf) { + result += *(unsigned short *)buf; len -= 2; - buff += 2; + buf += 2; } if (len >= 4) { - const unsigned char *end = buff + ((unsigned)len & ~3); + const unsigned char *end = buf + ((unsigned)len & ~3); unsigned int carry = 0; do { - unsigned int w = *(unsigned int *) buff; - buff += 4; + unsigned int w = *(unsigned int *)buf; + buf += 4; result += carry; result += w; carry = (w > result); - } while (buff < end); + } while (buf < end); result += carry; result = (result & 0xffff) + (result >> 16); } if (len & 2) { - result += *(unsigned short *) buff; - buff += 2; + result += *(unsigned short *)buf; + buf += 2; } } + if (len & 1) #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - result += *buff; + result += *buf; #else - result += (*buff << 8); + result += (*buf << 8); #endif + result = from32to16(result); if (odd) result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); -out: + return result; } static inline bool csum_valid(const char *buf, size_t len) { + assert_return(buf && len > 0, false); + return do_csum((unsigned const char *)buf, len) == 0xffff; } @@ -180,12 +185,18 @@ igmp_match() static void igmp_parse(struct cfg *cfg, struct igmp *igmp) { - char *buf = igmp->task.tbuf->buf; - size_t len = igmp->task.tbuf->len; - struct ipv4_hdr *hdr = (struct ipv4_hdr *)buf; + char *buf; + size_t len; + struct ipv4_hdr *hdr; size_t body_len; union igmp_msg *igmp_msg; + assert_return(cfg && igmp); + + buf = igmp->task.tbuf->buf; + len = igmp->task.tbuf->len; + hdr = (struct ipv4_hdr *)buf; + if (len <= IPV4_MIN_HDR_LEN) return; @@ -389,10 +400,10 @@ igmp_read_cb(struct cfg *cfg, struct uring_task *task, int res) { struct igmp *igmp = container_of(task, struct igmp, task); - debug(DBG_IGMP, "task %p, igmp %p, res %i", task, igmp, res); - + assert_return(cfg && task); assert_task_alive(DBG_IGMP, task); + debug(DBG_IGMP, "task %p, igmp %p, res %i", task, igmp, res); if (res < 0) { error("res: %i", res); return; @@ -414,6 +425,7 @@ igmp_free(struct uring_task *task) { struct igmp *igmp = container_of(task, struct igmp, task); + assert_return(task); debug(DBG_IGMP, "task %p, igmp %p", task, igmp); xfree(igmp); } @@ -421,8 +433,7 @@ igmp_free(struct uring_task *task) void igmp_refdump(struct igmp *igmp) { - if (!igmp) - return; + assert_return_silent(igmp); uring_task_refdump(&igmp->task); } @@ -430,13 +441,11 @@ igmp_refdump(struct igmp *igmp) void igmp_delete(struct cfg *cfg) { - struct igmp *igmp = cfg->igmp; + assert_return(cfg); + assert_return_silent(cfg->igmp); - if (!igmp) - return; - - debug(DBG_IGMP, "closing fd %i", igmp->task.fd); - uring_task_destroy(cfg, &igmp->task); + debug(DBG_IGMP, "closing fd %i", cfg->igmp->task.fd); + uring_task_destroy(cfg, &cfg->igmp->task); cfg->igmp = NULL; } @@ -497,6 +506,8 @@ igmp_init(struct cfg *cfg) int sfd; int opt; + assert_return(cfg); + if (!cfg->do_igmp) { debug(DBG_IGMP, "igmp snooping disabled"); return; @@ -567,7 +578,7 @@ igmp_init(struct cfg *cfg) } debug(DBG_IGMP, "init successful, using fd %i", sfd); - uring_task_init(&igmp->task, "igmp", uring_parent(cfg), igmp_free); + uring_task_init(cfg, &igmp->task, "igmp", uring_parent(cfg), igmp_free); uring_task_set_fd(&igmp->task, sfd); uring_task_set_buf(&igmp->task, &igmp->tbuf); igmp->task.saddr.addrlen = sizeof(igmp->task.saddr.ll); @@ -57,6 +57,8 @@ msg(enum debug_lvl lvl, const char *fmt, va_list ap) const char *color; const char *sd_lvl; + assert_return(lvl != 0 && !empty_str(fmt) && ap); + while (first) { int fd; const char *e; @@ -149,6 +151,8 @@ __debug(enum debug_lvl lvl, const char *fmt, ...) { va_list ap; + assert_return(lvl != 0 && !empty_str(fmt)); + va_start(ap, fmt); msg(lvl, fmt, ap); va_end(ap); @@ -159,9 +163,13 @@ __die(const char *fmt, ...) { va_list ap; - va_start(ap, fmt); - msg(DBG_ERROR, fmt, ap); - va_end(ap); + if (!empty_str(fmt)) { + va_start(ap, fmt); + msg(DBG_ERROR, fmt, ap); + va_end(ap); + } else + error("fmt not set"); + sd_notifyf(0, "STATUS=Error, shutting down"); exit(EXIT_FAILURE); }; @@ -171,6 +179,8 @@ cfg_free(struct uring_task *task) { struct cfg *cfg = container_of(task, struct cfg, task); + assert_return(task); + debug(DBG_SIG, "called"); systemd_delete(cfg); xfree(cfg->igmp_iface); @@ -213,6 +223,8 @@ cfg_read(struct cfg *cfg) size_t rd = 0; size_t r; + assert_return(cfg); + if (cfg->cfg_path) path = cfg->cfg_path; else @@ -353,7 +365,7 @@ usage(int argc, char **argv, bool invalid) " -d, --debug=CATEGORY\tenable debugging for CATEGORY\n" "\t\t\t(use \"list\" to see available categories,\n" "\t\t\t or \"all\" to enable all categories)\n", - argv[0]); + argv ? argv[0] : "mcproxy"); exit(invalid ? EXIT_FAILURE : EXIT_SUCCESS); } @@ -365,13 +377,15 @@ cfg_init(int argc, char **argv) int c; unsigned i; + assert_die(argc > 0 && argv, "invalid arguments"); + cfg = zmalloc(sizeof(*cfg)); if (!cfg) die("malloc: %m"); cfg->uid = geteuid(); cfg->gid = getegid(); - uring_task_init(&cfg->task, "cfg", NULL, cfg_free); + uring_task_init(cfg, &cfg->task, "cfg", NULL, cfg_free); list_init(&cfg->servers); while (true) { @@ -475,6 +489,9 @@ cfg_init(int argc, char **argv) static void cfg_apply(struct cfg *cfg) { + if (!cfg) + die("invalid arguments"); + if (cfg->uid == 0 || cfg->gid == 0) /* This catches both -u root and running as root without -u */ die("Execution as root is not supported (use -u <someuser>)"); @@ -538,6 +555,8 @@ signalfd_free(struct uring_task *task) { struct signalfd_ev *sev = container_of(task, struct signalfd_ev, task); + assert_return(task); + debug(DBG_SIG, "called"); sev->cfg->sev = NULL; xfree(sev); @@ -548,6 +567,8 @@ dump_tree(struct cfg *cfg) { struct server *server; + assert_return(cfg); + if (!debug_enabled(DBG_REF)) return; @@ -576,6 +597,7 @@ signalfd_read(struct cfg *cfg, struct uring_task *task, int res) struct signalfd_ev *sev = container_of(task, struct signalfd_ev, task); struct server *server, *stmp; + assert_return(cfg && task); assert_task_alive(DBG_SIG, task); if (res != sizeof(sev->buf)) @@ -621,6 +643,8 @@ hack_handler(int signum, siginfo_t *info, void *ucontext) { uint64_t val; + assert_return(signum > 0 && info); + switch (signum) { case SIGUSR1: debug(DBG_SIG, "Got a SIGUSR1"); @@ -660,6 +684,8 @@ signalfd_init(struct cfg *cfg) //sigset_t mask; struct signalfd_ev *sev; + assert_return(cfg); + sev = zmalloc(sizeof(*sev)); if (!sev) die("malloc: %m"); @@ -667,11 +693,11 @@ signalfd_init(struct cfg *cfg) /* sigfillset(&mask); if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) - perrordie("sigprocmask"); + die("sigprocmask: %m"); sfd = signalfd(-1, &mask, SFD_CLOEXEC); if (sfd < 0) - perrordie("signalfd"); + die("signalfd: %m"); */ struct sigaction action; @@ -693,7 +719,7 @@ signalfd_init(struct cfg *cfg) die("eventfd: %m"); debug(DBG_SIG, "using fd %i", sfd); - uring_task_init(&sev->task, "sev", uring_parent(cfg), signalfd_free); + uring_task_init(cfg, &sev->task, "sev", uring_parent(cfg), signalfd_free); uring_task_set_fd(&sev->task, sfd); cfg->sev = sev; sev->cfg = cfg; @@ -73,6 +73,18 @@ void __die(const char *fmt, ...) __attribute__((format(printf, 1, 2))); return __VA_ARGS__; \ } while (0) +#define assert_return_silent(expr, ...) \ + do { \ + if (!(expr)) \ + return __VA_ARGS__; \ + } while (0) + +#define assert_die(expr, msg) \ + do { \ + if (!assert_log(expr, #expr)) \ + die(msg); \ + } while (0) + #define assert_task_alive_or(lvl, t, cmd) \ do { \ if (!(t)) { \ @@ -10,6 +10,8 @@ void proxy_refdump(struct server_proxy *proxy) { + assert_return(proxy); + uring_task_refdump(&proxy->task); uring_task_refdump(&proxy->clienttask); uring_task_refdump(&proxy->servertask); @@ -21,6 +23,8 @@ format_bytes(char *buf, size_t len, uint64_t val) uint64_t tmp; const char *suffix = "B"; + assert_return(buf && len > 0); + tmp = val * 10; if (val > 1152921504606846976ULL) { tmp = val / 115292150460684697ULL; @@ -50,6 +54,8 @@ format_time(char *buf, size_t len, time_t diff) { unsigned hh, mm, ss; + assert_return(buf && len > 0); + hh = diff / 3600; diff %= 3600; mm = diff / 60; @@ -67,6 +73,8 @@ proxy_free(struct uring_task *task) char stc[100]; char duration[100]; + assert_return(task); + debug(DBG_PROXY, "server: %s, src: %s, dst: %s", proxy->server->name, proxy->client_conn.remote.addrstr, @@ -94,6 +102,8 @@ proxy_client_free(struct uring_task *task) { struct server_proxy *proxy = container_of(task, struct server_proxy, clienttask); + assert_return(task); + debug(DBG_PROXY, "%s: client connection closed", proxy->server->name); } @@ -102,6 +112,8 @@ proxy_server_free(struct uring_task *task) { struct server_proxy *proxy = container_of(task, struct server_proxy, servertask); + assert_return(task); + debug(DBG_PROXY, "%s: server connection closed", proxy->server->name); } @@ -110,6 +122,8 @@ proxy_delete(struct cfg *cfg, struct server_proxy *proxy) { debug(DBG_PROXY, "%s: shutting down proxy %p", proxy->server->name, proxy); + assert_return(cfg && proxy); + uring_task_destroy(cfg, &proxy->servertask); uring_task_destroy(cfg, &proxy->clienttask); uring_task_destroy(cfg, &proxy->task); @@ -122,6 +136,7 @@ proxy_client_data_out(struct cfg *cfg, struct uring_task *task, int res) { struct server_proxy *proxy = container_of(task, struct server_proxy, clienttask); + assert_return(cfg && task); assert_task_alive(DBG_PROXY, task); if (res <= 0) { @@ -141,6 +156,7 @@ proxy_client_data_in(struct cfg *cfg, struct uring_task *task, int res) { struct server_proxy *proxy = container_of(task, struct server_proxy, clienttask); + assert_return(cfg && task); assert_task_alive(DBG_PROXY, task); if (res <= 0) { @@ -162,6 +178,7 @@ proxy_server_data_out(struct cfg *cfg, struct uring_task *task, int res) { struct server_proxy *proxy = container_of(task, struct server_proxy, servertask); + assert_return(cfg && task); assert_task_alive(DBG_PROXY, task); if (res <= 0) { @@ -181,6 +198,7 @@ proxy_server_data_in(struct cfg *cfg, struct uring_task *task, int res) { struct server_proxy *proxy = container_of(task, struct server_proxy, servertask); + assert_return(cfg && task); assert_task_alive(DBG_PROXY, task); if (res <= 0) { @@ -199,6 +217,7 @@ proxy_connected_cb(struct cfg *cfg, struct connection *conn, bool connected) { struct server_proxy *proxy = container_of(conn, struct server_proxy, server_conn); + assert_return(cfg && conn); assert_task_alive(DBG_PROXY, &proxy->clienttask); assert_task_alive(DBG_PROXY, &proxy->servertask); @@ -225,6 +244,8 @@ proxy_new(struct cfg *cfg, struct server *server, struct saddr *client, int fd) { struct server_proxy *proxy; + assert_return(cfg && server && client && fd > 0, NULL); + proxy = zmalloc(sizeof(*proxy)); if (!proxy) { error("malloc: %m"); @@ -234,17 +255,17 @@ proxy_new(struct cfg *cfg, struct server *server, struct saddr *client, int fd) proxy->sfd = -1; proxy->cfd = fd; proxy->server = server; - uring_task_init(&proxy->task, "proxy", &server->task, proxy_free); + uring_task_init(cfg, &proxy->task, "proxy", &server->task, proxy_free); connection_set_local(cfg, &proxy->client_conn, fd); connection_set_remote(cfg, &proxy->client_conn, client); - uring_task_init(&proxy->clienttask, "proxy_client", &proxy->task, + uring_task_init(cfg, &proxy->clienttask, "proxy_client", &proxy->task, proxy_client_free); uring_task_set_buf(&proxy->clienttask, &proxy->clientbuf); uring_task_set_fd(&proxy->clienttask, fd); - uring_task_init(&proxy->servertask, "proxy_server", &proxy->task, + uring_task_init(cfg, &proxy->servertask, "proxy_server", &proxy->task, proxy_server_free); uring_task_set_buf(&proxy->servertask, &proxy->serverbuf); @@ -27,6 +27,8 @@ rcon_free(struct uring_task *task) { struct rcon *rcon = container_of(task, struct rcon, task); + assert_return(task); + debug(DBG_RCON, "task %p, idle %p", task, rcon); rcon->server->rcon = NULL; xfree(rcon); @@ -35,8 +37,7 @@ rcon_free(struct uring_task *task) void rcon_refdump(struct rcon *rcon) { - if (!rcon) - return; + assert_return_silent(rcon); uring_task_refdump(&rcon->task); } @@ -44,13 +45,10 @@ rcon_refdump(struct rcon *rcon) void rcon_delete(struct cfg *cfg, struct server *server) { - struct rcon *rcon = server->rcon; - - if (!rcon) - return; + assert_return_silent(server->rcon); - debug(DBG_RCON, "closing fd %i", rcon->task.fd); - uring_task_destroy(cfg, &rcon->task); + debug(DBG_RCON, "closing fd %i", server->rcon->task.fd); + uring_task_destroy(cfg, &server->rcon->task); server->rcon = NULL; } @@ -58,11 +56,14 @@ static int32_t read_int(char **pos, size_t *len) { uint32_t val; - char *p = *pos; + char *p; + + assert_return(pos && *pos, 0); if (len && *len < 4) return 0; + p = *pos; val = ((uint8_t)p[0] << 0); val += ((uint8_t)p[1] << 8); val += ((uint8_t)p[2] << 16); @@ -79,8 +80,11 @@ static void write_int(char **pos, size_t *len, int32_t orig) { uint32_t val = (uint32_t)orig; - char *p = *pos; + char *p; + + assert_return(pos && *pos); + p = *pos; p[0] = (val >> 0) & 0xff; p[1] = (val >> 8) & 0xff; p[2] = (val >> 16) & 0xff; @@ -94,8 +98,11 @@ write_int(char **pos, size_t *len, int32_t orig) static void write_str(char **pos, size_t *len, const char *str) { - size_t towrite = strlen(str); + size_t towrite; + assert_return(pos && *pos && !empty_str(str)); + + towrite = strlen(str); memcpy(*pos, str, towrite); *pos += towrite; if (len) @@ -105,8 +112,11 @@ write_str(char **pos, size_t *len, const char *str) static void write_end(char **pos, size_t *len) { - char *p = *pos; + char *p; + + assert_return(pos && *pos); + p = *pos; p[0] = 0x00; p[1] = 0x00; @@ -127,9 +137,12 @@ static void create_packet(struct cfg *cfg, struct rcon *rcon, int32_t reqid, enum rcon_packet_type type, const char *msg) { - char *pos = &rcon->tbuf.buf[4]; + char *pos; + + assert_return(cfg && rcon && !empty_str(msg)); /* Body */ + pos = &rcon->tbuf.buf[4]; rcon->tbuf.len = 4; write_int(&pos, &rcon->tbuf.len, reqid); write_int(&pos, &rcon->tbuf.len, type); @@ -148,12 +161,15 @@ create_packet(struct cfg *cfg, struct rcon *rcon, int32_t reqid, static int packet_complete(struct cfg *cfg, struct uring_task *task, int res) { - char *pos = task->tbuf->buf; - size_t len = task->tbuf->len; + char *pos; + size_t len; int32_t plen; + assert_return(cfg && task, 0); assert_task_alive_or(DBG_RCON, task, return -EINTR); + pos = task->tbuf->buf; + len = task->tbuf->len; if (task->tbuf->len < 14) return 0; @@ -171,10 +187,14 @@ static bool rcon_read_packet(struct cfg *cfg, struct rcon *rcon, int32_t *id, int32_t *type, char **rmsg) { - char *pos = rcon->tbuf.buf; - size_t len = rcon->tbuf.len; + char *pos; + size_t len; int32_t plen; + assert_return(cfg && rcon && id && type && rmsg, false); + + pos = rcon->tbuf.buf; + len = rcon->tbuf.len; plen = read_int(&pos, &len); *id = read_int(&pos, &len); *type = read_int(&pos, &len); @@ -216,6 +236,7 @@ rcon_stop_reply(struct cfg *cfg, struct uring_task *task, int res) int32_t type; char *msg; + assert_return(cfg && task); assert_task_alive(DBG_RCON, task); if (res < 0) { @@ -245,6 +266,7 @@ rcon_stop_sent(struct cfg *cfg, struct uring_task *task, int res) { struct rcon *rcon = container_of(task, struct rcon, task); + assert_return(cfg && task); assert_task_alive(DBG_RCON, task); if (res < 0) { @@ -265,6 +287,7 @@ rcon_login_reply(struct cfg *cfg, struct uring_task *task, int res) int32_t type; char *msg; + assert_return(cfg && task); assert_task_alive(DBG_RCON, task); if (res < 0) { @@ -300,6 +323,7 @@ rcon_login_sent(struct cfg *cfg, struct uring_task *task, int res) { struct rcon *rcon = container_of(task, struct rcon, task); + assert_return(cfg && task); assert_task_alive(DBG_RCON, task); if (res < 0) { @@ -317,6 +341,7 @@ rcon_connected_cb(struct cfg *cfg, struct connection *conn, bool connected) { struct rcon *rcon = container_of(conn, struct rcon, conn); + assert_return(cfg && conn); assert_task_alive(DBG_RCON, &rcon->task); if (!connected) { @@ -335,17 +360,13 @@ rcon_init(struct cfg *cfg, struct server *server) { struct rcon *rcon; - if (!server) - return; - - if (list_empty(&server->rcons) || !server->rcon_password) - return; + assert_return(cfg && server && !list_empty(&server->rcons) && !empty_str(server->rcon_password)); rcon = zmalloc(sizeof(*rcon)); if (!rcon) die("malloc: %m"); - uring_task_init(&rcon->task, "rcon", &server->task, rcon_free); + uring_task_init(cfg, &rcon->task, "rcon", &server->task, rcon_free); uring_task_set_buf(&rcon->task, &rcon->tbuf); rcon->server = server; server->rcon = rcon; @@ -58,8 +58,8 @@ server_refdump(struct server *server) uring_task_refdump(&local->task); list_for_each_entry(proxy, &server->proxys, list) proxy_refdump(proxy); - if (server->idle) - idle_refdump(server->idle); + idle_refdump(server->idle); + rcon_refdump(server->rcon); } static void @@ -642,7 +642,7 @@ server_add_local(struct cfg *cfg, struct server *server, struct saddr *saddr) debug(DBG_SRV, "adding local: %s", saddr->addrstr); local->local = *saddr; - uring_task_init(&local->task, "local", &server->task, server_local_free); + uring_task_init(cfg, &local->task, "local", &server->task, server_local_free); list_add(&local->list, &server->locals); xfree(saddr); return true; @@ -804,9 +804,9 @@ server_new(struct cfg *cfg, const char *name) server->name = xstrdup(name); server->stop_method = SERVER_STOP_METHOD_UNDEFINED; server->start_method = SERVER_START_METHOD_UNDEFINED; - uring_task_init(&server->task, "server", uring_parent(cfg), server_free); + uring_task_init(cfg, &server->task, "server", uring_parent(cfg), server_free); uring_task_set_buf(&server->task, &server->tbuf); - uring_task_init(&server->exec_task, "exec", &server->task, server_exec_free); + uring_task_init(cfg, &server->exec_task, "exec", &server->task, server_exec_free); list_init(&server->remotes); list_init(&server->locals); list_init(&server->proxys); @@ -36,10 +36,7 @@ systemd_service_object_path(struct cfg *cfg, const char *service) char *d; const char *s; - if (empty_str(service)) { - error("invalid arguments"); - return NULL; - } + assert_return(cfg && service && !empty_str(service), NULL); r = zmalloc(strlen(SYSTEMD_DBUS_PATH_PREFIX) + strlen(service) * 3 + 1); if (!r) @@ -68,8 +65,8 @@ systemd_service_object_path(struct cfg *cfg, const char *service) void systemd_delete(struct cfg *cfg) { - if (!cfg->sd_bus) - return; + assert_return(cfg); + assert_return_silent(cfg->sd_bus); sd_bus_unref(cfg->sd_bus); cfg->sd_bus = NULL; @@ -80,6 +77,8 @@ get_bus(struct cfg *cfg) { int r; + assert_return(cfg, NULL); + if (cfg->sd_bus_failed) return NULL; @@ -112,11 +111,10 @@ systemd_service_running(struct cfg *cfg, struct server *server) sd_bus *bus = get_bus(cfg); sd_bus_error error = SD_BUS_ERROR_NULL; char *status = NULL; - int r; bool running = false; + int r; - if (!bus || !server->systemd_service || !server->systemd_obj) - return false; + assert_return(cfg && server && bus && server->systemd_service && server->systemd_obj, false); r = sd_bus_get_property_string(bus, SYSTEMD_DBUS_SERVICE, @@ -155,8 +153,7 @@ systemd_service_action(struct cfg *cfg, struct server *server, const char *actio bool performed = false; int r; - if (!bus || !server->systemd_service || !server->systemd_obj || !action) - return false; + assert_return(cfg && server && bus && server->systemd_service && server->systemd_obj && action, false); r = sd_bus_call_method(bus, SYSTEMD_DBUS_SERVICE, @@ -201,6 +198,8 @@ out: bool systemd_service_stop(struct cfg *cfg, struct server *server) { + assert_return(cfg && server, false); + return systemd_service_action(cfg, server, "Stop"); } @@ -216,6 +215,8 @@ systemd_service_stop(struct cfg *cfg, struct server *server) bool systemd_service_start(struct cfg *cfg, struct server *server) { + assert_return(cfg && server, false); + return systemd_service_action(cfg, server, "Start"); } @@ -32,8 +32,7 @@ get_sqe(struct cfg *cfg, struct uring_task *task) { struct io_uring_sqe *sqe; - if (!cfg || !task) - die("invalid parameters"); + assert_die(cfg && task, "invalid arguments"); sqe = io_uring_get_sqe(&cfg->uev->uring); if (!sqe) { @@ -54,6 +53,8 @@ uring_task_refdump(struct uring_task *task) char buf[4096]; struct uring_task *tmp; + assert_return(task); + buf[0] = '\0'; for (tmp = task; tmp; tmp = tmp->parent) { size_t prefix; @@ -87,14 +88,11 @@ uring_task_refdump(struct uring_task *task) void uring_task_destroy(struct cfg *cfg, struct uring_task *task) { + assert_return(cfg && task); + debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); - if (!task) { - error("called with no task"); - return; - } - if (task->fd >= 0) { struct io_uring_sqe *sqe; @@ -110,7 +108,9 @@ uring_task_destroy(struct cfg *cfg, struct uring_task *task) void uring_task_put(struct cfg *cfg, struct uring_task *task) { - struct uring_task *parent = task->parent; + struct uring_task *parent; + + assert_return(cfg && task); debug(DBG_REF, "task %s (%p), refcount %u", task->name, task, task->refcount); @@ -129,20 +129,21 @@ uring_task_put(struct cfg *cfg, struct uring_task *task) return; } - if (parent) - debug(DBG_REF, "putting parent %s (%p)", - task->parent->name, task->parent); - + parent = task->parent; if (task->free) task->free(task); - if (parent) + if (parent) { + debug(DBG_REF, "putting parent %s (%p)", parent->name, parent); uring_task_put(cfg, parent); + } } void uring_task_get(struct cfg *cfg, struct uring_task *task) { + assert_return(cfg && task); + debug(DBG_REF, "task %s (%p), refcount %u", task->name, task, task->refcount); @@ -155,25 +156,27 @@ uring_task_get(struct cfg *cfg, struct uring_task *task) void uring_task_set_buf(struct uring_task *task, struct uring_task_buf *tbuf) { + assert_return(task && tbuf); + debug(DBG_UR, "task %s (%p), buf %p, refcount %u", task->name, task, tbuf, task->refcount); - if (tbuf) { - /* iov_len and msg_namelen are set at send/receive time */ - tbuf->iov.iov_base = tbuf->buf; - tbuf->msg.msg_name = &task->saddr.storage; - tbuf->msg.msg_iov = &tbuf->iov; - tbuf->msg.msg_iovlen = 1; - tbuf->msg.msg_control = NULL; - tbuf->msg.msg_controllen = 0; - tbuf->msg.msg_flags = 0; - } + /* iov_len and msg_namelen are set at send/receive time */ + tbuf->iov.iov_base = tbuf->buf; + tbuf->msg.msg_name = &task->saddr.storage; + tbuf->msg.msg_iov = &tbuf->iov; + tbuf->msg.msg_iovlen = 1; + tbuf->msg.msg_control = NULL; + tbuf->msg.msg_controllen = 0; + tbuf->msg.msg_flags = 0; task->tbuf = tbuf; } void uring_task_set_fd(struct uring_task *task, int fd) { + assert_return(task); + debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, fd, task->refcount); @@ -183,6 +186,8 @@ uring_task_set_fd(struct uring_task *task, int fd) void uring_task_close_fd(struct cfg *cfg, struct uring_task *task) { + assert_return(cfg && task); + debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -196,28 +201,23 @@ uring_task_close_fd(struct cfg *cfg, struct uring_task *task) struct uring_task * uring_parent(struct cfg *cfg) { - if (!cfg) - die("called with null cfg"); - - if (!cfg->uev) - die("called with uninitialized uring"); + assert_die(cfg && cfg->uev, "invalid arguments"); return &cfg->uev->task; } void -uring_task_init(struct uring_task *task, const char *name, +uring_task_init(struct cfg *cfg, struct uring_task *task, const char *name, struct uring_task *parent, void (*free)(struct uring_task *)) { static bool first = true; + assert_die(cfg && task && !empty_str(name) && free, "invalid arguments"); + if (first) first = false; - else if (!parent) - die("called without a parent"); - - if (!free) - die("called without destructor"); + else + assert_die(parent, "called without a parent task"); task->refcount = 1; task->fd = -1; @@ -232,7 +232,7 @@ uring_task_init(struct uring_task *task, const char *name, "getting parent %s (%p), refcount %u", task->name, task, task->refcount, task->parent->name, task->parent, task->parent->refcount); - uring_task_get(NULL, task->parent); + uring_task_get(cfg, task->parent); } } @@ -241,14 +241,11 @@ uring_close(struct cfg *cfg, struct uring_task *task, int fd) { struct io_uring_sqe *sqe; + assert_return(cfg && task && fd >= 0); + debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); - if (!task || fd < 0) { - error("invalid parameters (task: %p (%s), fd: %i)", task, task->name, fd); - return; - } - sqe = get_sqe(cfg, task); io_uring_prep_close(sqe, fd); io_uring_sqe_set_data(sqe, (void *)((uintptr_t)task | CQE_TYPE_CLOSE)); @@ -259,8 +256,7 @@ uring_tbuf_write_cb(struct cfg *cfg, struct uring_task *task, int res) { int r; - if (!task || !task->tbuf || !task->final_cb) - die("missing parameters"); + assert_return(cfg && task && task->tbuf && task->final_cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -289,10 +285,7 @@ finished: void uring_tbuf_write(struct cfg *cfg, struct uring_task *task, utask_cb_t final_cb) { - if (!task || task->fd < 0 || !task->tbuf || task->tbuf->len < 0) { - error("invalid parameters"); - return; - } + assert_return(cfg && task && task->fd >= 0 && task->tbuf && task->tbuf->len > 0); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -307,10 +300,7 @@ uring_write(struct cfg *cfg, struct uring_task *task, void *buf, size_t len, uta { struct io_uring_sqe *sqe; - if (task->fd < 0) { - error("no fd set"); - return; - } + assert_return(cfg && task && buf && len > 0 && cb && task->fd >= 0); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -326,10 +316,7 @@ uring_tbuf_read_until_cb(struct cfg *cfg, struct uring_task *task, int res) { int r; - if (!task || !task->tbuf || !task->final_cb || !task->is_complete_cb) { - error("invalid parameters"); - return; - } + assert_return(cfg && task && task->tbuf && task->final_cb && task->is_complete_cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -368,10 +355,7 @@ void uring_tbuf_read_until(struct cfg *cfg, struct uring_task *task, rutask_cb_t is_complete_cb, utask_cb_t final_cb) { - if (!task || task->fd < 0 || !task->tbuf || !is_complete_cb || !final_cb) { - error("%s: invalid parameters", __func__); - return; - } + assert_return(cfg && task && task->fd >= 0 && task->tbuf && is_complete_cb && final_cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -386,6 +370,7 @@ uring_tbuf_read_until(struct cfg *cfg, struct uring_task *task, static int uring_tbuf_eof(struct cfg *cfg, struct uring_task *task, int res) { + assert_return(cfg && task && task->tbuf, -EINVAL); assert_task_alive_or(DBG_UR, task, return -EINTR); if (task->tbuf->len + 1 >= sizeof(task->tbuf->buf)) @@ -403,12 +388,16 @@ void uring_tbuf_read_until_eof(struct cfg *cfg, struct uring_task *task, utask_cb_t final_cb) { + assert_return(cfg && task && task->tbuf && final_cb); + uring_tbuf_read_until(cfg, task, uring_tbuf_eof, final_cb); } static int uring_tbuf_have_data(struct cfg *cfg, struct uring_task *task, int res) { + assert_return(cfg && task, -EINVAL); + if (res < 0) return res; else @@ -418,6 +407,8 @@ uring_tbuf_have_data(struct cfg *cfg, struct uring_task *task, int res) void uring_tbuf_read(struct cfg *cfg, struct uring_task *task, utask_cb_t final_cb) { + assert_return(cfg && task && final_cb); + uring_tbuf_read_until(cfg, task, uring_tbuf_have_data, final_cb); } @@ -426,10 +417,7 @@ uring_read_offset(struct cfg *cfg, struct uring_task *task, void *buf, size_t le { struct io_uring_sqe *sqe; - if (task->fd < 0) { - error("uring_read called with no fd set"); - return; - } + assert_return(cfg && task && buf && len > 0 && task->fd >= 0); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -445,6 +433,8 @@ uring_openat(struct cfg *cfg, struct uring_task *task, const char *path, utask_c { struct io_uring_sqe *sqe; + assert_return(cfg && task && !empty_str(path) && cb); + debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -459,10 +449,7 @@ uring_tbuf_recvmsg(struct cfg *cfg, struct uring_task *task, utask_cb_t cb) { struct io_uring_sqe *sqe; - if (!task->tbuf) { - error("called with no tbuf set"); - return; - } + assert_return(cfg && task && task->fd >= 0 && task->tbuf && cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -482,10 +469,7 @@ uring_tbuf_sendmsg(struct cfg *cfg, struct uring_task *task, utask_cb_t cb) { struct io_uring_sqe *sqe; - if (!task->tbuf) { - error("%s: called with no tbuf set", __func__); - return; - } + assert_return(cfg && task && task->fd >= 0 && task->tbuf && cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -504,10 +488,7 @@ uring_connect(struct cfg *cfg, struct uring_task *task, struct saddr *saddr, uta { struct io_uring_sqe *sqe; - if (task->fd < 0) { - error("no fd set"); - return; - } + assert_return(cfg && task && task->fd >= 0 && saddr && cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -523,10 +504,7 @@ uring_accept(struct cfg *cfg, struct uring_task *task, struct saddr *saddr, utas { struct io_uring_sqe *sqe; - if (task->fd < 0) { - error("no fd set"); - return; - } + assert_return(cfg && task && task->fd >= 0 && saddr && cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -543,10 +521,7 @@ uring_poll(struct cfg *cfg, struct uring_task *task, short poll_mask, utask_cb_t { struct io_uring_sqe *sqe; - if (task->fd < 0) { - error("uring_poll called with no fd set"); - return; - } + assert_return(cfg && task && task->fd >= 0 && poll_mask && cb); debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -562,6 +537,8 @@ uring_poll_cancel(struct cfg *cfg, struct uring_task *task) { struct io_uring_sqe *sqe; + assert_return(cfg && task); + if (task->fd < 0) { /* not an error, no need to print error msg */ return; @@ -581,6 +558,8 @@ uring_free(struct uring_task *task) { struct uring_ev *uev = container_of(task, struct uring_ev, task); + assert_return(task); + debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -592,14 +571,19 @@ uring_free(struct uring_task *task) void uring_refdump(struct uring_ev *uev) { + assert_return(uev); + uring_task_refdump(&uev->task); } void uring_delete(struct cfg *cfg) { - struct uring_task *task = &cfg->uev->task; + struct uring_task *task; + + assert_return(cfg && cfg->uev); + task = &cfg->uev->task; debug(DBG_UR, "task %s (%p), fd %i, refcount %u", task->name, task, task->fd, task->refcount); @@ -611,6 +595,8 @@ uring_init(struct cfg *cfg) { struct uring_ev *uev; + assert_return(cfg); + uev = zmalloc(sizeof(*uev)); if (!uev) die("malloc: %m"); @@ -621,7 +607,7 @@ uring_init(struct cfg *cfg) debug(DBG_UR, "uring initialized, features: 0x%08x", uev->uring_params.features); - uring_task_init(&uev->task, "uev", &cfg->task, uring_free); + uring_task_init(cfg, &uev->task, "uev", &cfg->task, uring_free); cfg->uev = uev; uev->cfg = cfg; } @@ -630,6 +616,8 @@ static inline void uring_print_cqe(struct cfg *cfg, const char *type, struct uring_task *task, struct io_uring_cqe *cqe) { + assert_return(cfg && !empty_str(type) && task && cqe); + debug(DBG_UR, "got CQE " "(type: %s, res: %i (%s), task: %s (%p), fd: %i, cb: %p)", type, @@ -644,6 +632,8 @@ uring_print_cqe(struct cfg *cfg, const char *type, struct uring_task *task, void uring_event_loop(struct cfg *cfg) { + assert_return(cfg); + while (true) { struct io_uring_cqe *cqe; unsigned nr, head; @@ -20,7 +20,7 @@ void uring_task_close_fd(struct cfg *cfg, struct uring_task *task); struct uring_task *uring_parent(struct cfg *cfg); -void uring_task_init(struct uring_task *task, const char *name, +void uring_task_init(struct cfg *cfg, struct uring_task *task, const char *name, struct uring_task *parent, void (*free)(struct uring_task *)); @@ -34,11 +34,13 @@ struct allocation { static void add_allocation(const char *allocfn, const char *callerfn, int line, void *ptr, size_t size) { - struct allocation *a = malloc(sizeof(*a)); + struct allocation *a; - debug(DBG_MALLOC, "called from %s:%i - %s(%zu) = %p", - callerfn, line, allocfn, size, ptr); + assert_die(!empty_str(allocfn) && !empty_str(callerfn) && line > 0 && ptr && size > 0, "invalid arguments"); + a = malloc(sizeof(*a)); + if (!a) + die("malloc: %m"); a->allocfn = allocfn; a->callerfn = callerfn; a->line = line; @@ -47,6 +49,8 @@ add_allocation(const char *allocfn, const char *callerfn, int line, void *ptr, s list_add(&a->list, &malloc_list); total_malloc_count++; malloc_count++; + debug(DBG_MALLOC, "called from %s:%i - %s(%zu) = %p (%p)", + callerfn, line, allocfn, size, ptr, a); } void * @@ -54,6 +58,8 @@ __zmalloc(const char *fn, int line, size_t size) { void *ptr; + assert_die(!empty_str(fn) && line > 0 && size > 0, "invalid arguments"); + ptr = calloc(1, size); if (ptr) add_allocation("zmalloc", fn, line, ptr, size); @@ -65,6 +71,8 @@ __xstrdup(const char *fn, int line, const char *s) { char *ptr; + assert_die(!empty_str(fn) && line > 0 && !empty_str(s), "invalid arguments"); + ptr = strdup(s); if (ptr) add_allocation("xstrdup", fn, line, ptr, strlen(s) + 1); @@ -76,6 +84,8 @@ __xstrndup(const char *fn, int line, const char *s, size_t n) { char *ptr; + assert_die(!empty_str(fn) && line > 0 && !empty_str(s) && n > 0, "invalid arguments"); + ptr = strndup(s, n); if (ptr) add_allocation("xstrndup", fn, line, ptr, n); @@ -88,6 +98,8 @@ __xfree(const char *fn, int line, void *ptr) struct allocation *a, *tmp; unsigned delete_count = 0; + assert_die(!empty_str(fn) && line > 0, "invalid arguments"); + if (!ptr) return; free(ptr); @@ -161,8 +173,7 @@ socket_set_low_latency(struct cfg *cfg, int sfd) { int option; - if (sfd <= 0) - return; + assert_return(cfg && sfd >= 0); /* FIXME: could make this configurable */ option = true; @@ -183,10 +194,11 @@ socket_set_low_latency(struct cfg *cfg, int sfd) void connection_set_local(struct cfg *cfg, struct connection *conn, int fd) { + assert_return(cfg && conn && fd >= 0); + conn->local.addrlen = sizeof(conn->local.storage); - if (fd < 0 || getsockname(fd, - (struct sockaddr *)&conn->local.storage, - &conn->local.addrlen) < 0) + if (getsockname(fd, (struct sockaddr *)&conn->local.storage, + &conn->local.addrlen) < 0) sprintf(conn->local.addrstr, "<unknown>"); else saddr_set_addrstr(&conn->local); @@ -195,6 +207,8 @@ connection_set_local(struct cfg *cfg, struct connection *conn, int fd) void connection_set_remote(struct cfg *cfg, struct connection *conn, struct saddr *remote) { + assert_return(cfg && conn && remote); + conn->remote = *remote; saddr_set_addrstr(&conn->remote); } @@ -204,8 +218,11 @@ static void connect_next(struct cfg *cfg, struct uring_task *task, struct connec static void connect_cb(struct cfg *cfg, struct uring_task *task, int res) { - struct connection *conn = task->priv; + struct connection *conn; + + assert_return(cfg && task && task->priv); + conn = task->priv; if (res < 0) { debug(DBG_UR, "%s: connection to %s failed", task->name, conn->remote.addrstr); @@ -229,6 +246,7 @@ connect_next(struct cfg *cfg, struct uring_task *task, struct connection *conn) int sfd; unsigned i; + assert_return(cfg && task && conn && conn->callback); again: assert_task_alive_or(DBG_UR, task, goto out); @@ -275,10 +293,7 @@ connect_any(struct cfg *cfg, struct uring_task *task, struct list_head *addrs, struct connection *conn, void (*callback)(struct cfg *, struct connection *, bool res)) { - if (!cfg || !task || !addrs || !conn || !callback) { - error("invalid arguments"); - return; - } + assert_return(cfg && task && addrs && conn && callback); conn->next_addr = 0; conn->addrs = addrs; @@ -289,6 +304,8 @@ connect_any(struct cfg *cfg, struct uring_task *task, uint16_t saddr_port(struct saddr *saddr) { + assert_return(saddr, 0); + switch (saddr->storage.ss_family) { case AF_INET: return ntohs(saddr->in4.sin_port); @@ -302,6 +319,8 @@ saddr_port(struct saddr *saddr) char * saddr_addr(struct saddr *saddr, char *buf, size_t len) { + assert_return(saddr && buf && len > 0, NULL); + switch (saddr->storage.ss_family) { case AF_INET: if (inet_ntop(saddr->in4.sin_family, &saddr->in4.sin_addr, buf, len)) @@ -322,6 +341,8 @@ saddr_addr(struct saddr *saddr, char *buf, size_t len) void saddr_set_ipv4(struct saddr *saddr, in_addr_t ip, in_port_t port) { + assert_return(saddr); + memset(&saddr->in4, 0, sizeof(saddr->in4)); saddr->in4.sin_family = AF_INET; saddr->in4.sin_port = port; @@ -333,6 +354,8 @@ saddr_set_ipv4(struct saddr *saddr, in_addr_t ip, in_port_t port) void saddr_set_ipv6(struct saddr *saddr, const struct in6_addr *ip, in_port_t port) { + assert_return(saddr && ip); + memset(&saddr->in6, 0, sizeof(saddr->in6)); saddr->in6.sin6_family = AF_INET6; saddr->in6.sin6_port = port; @@ -345,6 +368,8 @@ saddr_set_ipv6(struct saddr *saddr, const struct in6_addr *ip, in_port_t port) void saddr_set_addrstr(struct saddr *saddr) { + assert_return(saddr); + char abuf[ADDRSTRLEN]; switch (saddr->storage.ss_family) { @@ -372,8 +397,7 @@ strtou16_strict(const char *str, uint16_t *result) char *end; long val; - if (!str) - return -EINVAL; + assert_return(!empty_str(str) && result, -EINVAL); errno = 0; val = strtol(str, &end, 10); |