add asserts

This commit is contained in:
ruti 2024-05-08 20:15:57 +03:00
parent 4c99442199
commit 47aad58e7c
3 changed files with 35 additions and 10 deletions

21
conev.c
View File

@ -4,6 +4,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <limits.h> #include <limits.h>
#include <assert.h>
struct poolhd *init_pool(int count) struct poolhd *init_pool(int count)
@ -43,6 +44,7 @@ struct poolhd *init_pool(int count)
struct eval *add_event(struct poolhd *pool, enum eid type, struct eval *add_event(struct poolhd *pool, enum eid type,
int fd, int e) int fd, int e)
{ {
assert(fd > 0);
if (pool->count >= pool->max) { if (pool->count >= pool->max) {
return 0; return 0;
} }
@ -74,15 +76,19 @@ struct eval *add_event(struct poolhd *pool, enum eid type,
void del_event(struct poolhd *pool, struct eval *val) void del_event(struct poolhd *pool, struct eval *val)
{ {
if (!val->fd) { assert(val && ((val->fd > 0 && val->mod_iter < pool->iters) ||
val->mod_iter == pool->iters));
if (val->fd == -1) {
return; return;
} }
if (val->buff.data) { if (val->buff.data) {
assert(val->buff.size);
free(val->buff.data); free(val->buff.data);
val->buff.data = 0; val->buff.data = 0;
} }
close(val->fd); close(val->fd);
val->fd = 0; val->fd = -1;
val->mod_iter = pool->iters; val->mod_iter = pool->iters;
pool->count--; pool->count--;
@ -98,12 +104,14 @@ void del_event(struct poolhd *pool, struct eval *val)
ev->index = index; ev->index = index;
} }
if (val->pair) { if (val->pair) {
if (val->pair == val) { if (val->pair->pair == val) {
val->pair->pair = 0; val->pair->pair = 0;
} }
del_event(pool, val->pair); struct eval *e = val->pair;
val->pair = 0; val->pair = 0;
del_event(pool, e);
} }
assert(pool->count > 0);
} }
@ -137,6 +145,7 @@ struct eval *next_event(struct poolhd *pool, int *offs, int *type)
{ {
while (1) { while (1) {
int i = *offs; int i = *offs;
assert(i >= -1 && i < pool->count);
if (i < 0) { if (i < 0) {
i = (epoll_wait(pool->efd, pool->pevents, pool->max, -1) - 1); i = (epoll_wait(pool->efd, pool->pevents, pool->max, -1) - 1);
if (i < 0) { if (i < 0) {
@ -160,6 +169,7 @@ struct eval *next_event(struct poolhd *pool, int *offs, int *type)
int mod_etype(struct poolhd *pool, struct eval *val, int type) int mod_etype(struct poolhd *pool, struct eval *val, int type)
{ {
assert(val->fd > 0);
struct epoll_event ev = { struct epoll_event ev = {
.events = EPOLLRDHUP | type, .data = {val} .events = EPOLLRDHUP | type, .data = {val}
}; };
@ -170,6 +180,7 @@ int mod_etype(struct poolhd *pool, struct eval *val, int type)
struct eval *next_event(struct poolhd *pool, int *offs, int *typel) struct eval *next_event(struct poolhd *pool, int *offs, int *typel)
{ {
for (int i = *offs; ; i--) { for (int i = *offs; ; i--) {
assert(i >= -1 && i < pool->max);
if (i < 0) { if (i < 0) {
if (poll(pool->pevents, pool->count, -1) <= 0) { if (poll(pool->pevents, pool->count, -1) <= 0) {
return 0; return 0;
@ -185,6 +196,7 @@ struct eval *next_event(struct poolhd *pool, int *offs, int *typel)
continue; continue;
} }
struct eval *val = pool->links[i]; struct eval *val = pool->links[i];
assert((i < pool->count) || (val->mod_iter == pool->iters));
if (val->mod_iter == pool->iters) { if (val->mod_iter == pool->iters) {
continue; continue;
} }
@ -198,6 +210,7 @@ struct eval *next_event(struct poolhd *pool, int *offs, int *typel)
int mod_etype(struct poolhd *pool, struct eval *val, int type) int mod_etype(struct poolhd *pool, struct eval *val, int type)
{ {
assert(val->index >= 0 && val->index < pool->count);
pool->pevents[val->index].events = type; pool->pevents[val->index].events = type;
return 0; return 0;
} }

View File

@ -12,6 +12,7 @@
#endif #endif
#include <string.h> #include <string.h>
#include <assert.h>
#include "proxy.h" #include "proxy.h"
#include "error.h" #include "error.h"
@ -45,10 +46,12 @@ int set_timeout(int fd, unsigned int s)
int mode_add_get(struct sockaddr_ina *dst, int m) int mode_add_get(struct sockaddr_ina *dst, int m)
{ {
// m < 0: get, m > 0: set, m == 0: delete // m < 0: get, m > 0: set, m == 0: delete
time_t t; assert(m >= -1 && m < params.dp_count);
struct elem *val;
time_t t = 0;
struct elem *val = 0;
char *str = (char *)&dst->in; char *str = (char *)&dst->in;
int len = sizeof(dst->sa.sa_family); int len = 0;
if (dst->sa.sa_family == AF_INET) { if (dst->sa.sa_family == AF_INET) {
len = sizeof(dst->in); len = sizeof(dst->in);
@ -57,6 +60,7 @@ int mode_add_get(struct sockaddr_ina *dst, int m)
len = sizeof(dst->in6) - sizeof(dst->in6.sin6_scope_id); len = sizeof(dst->in6) - sizeof(dst->in6.sin6_scope_id);
} }
len -= sizeof(dst->sa.sa_family); len -= sizeof(dst->sa.sa_family);
assert(len > 0);
if (m == 0) { if (m == 0) {
mem_delete(params.mempool, str, len); mem_delete(params.mempool, str, len);
@ -89,6 +93,8 @@ int mode_add_get(struct sockaddr_ina *dst, int m)
int ext_connect(struct poolhd *pool, struct eval *val, int ext_connect(struct poolhd *pool, struct eval *val,
struct sockaddr_ina *dst, int next, int m) struct sockaddr_ina *dst, int next, int m)
{ {
assert(m >= 0 && m < params.dp_count && dst && val);
struct desync_params *dp = &params.dp[m]; struct desync_params *dp = &params.dp[m];
if (dp->to_ip) { if (dp->to_ip) {
struct sockaddr_ina addr = { .in6 = dp->addr }; struct sockaddr_ina addr = { .in6 = dp->addr };
@ -147,6 +153,7 @@ bool check_host(struct mphdr *hosts, struct eval *val)
if (!(len = parse_tls(val->buff.data, val->buff.size, &host))) { if (!(len = parse_tls(val->buff.data, val->buff.size, &host))) {
len = parse_http(val->buff.data, val->buff.size, &host, 0); len = parse_http(val->buff.data, val->buff.size, &host, 0);
} }
assert(len == 0 || host != 0);
return (len > 0) && mem_get(hosts, host, len) != 0; return (len > 0) && mem_get(hosts, host, len) != 0;
} }
@ -241,7 +248,7 @@ int on_tunnel_check(struct poolhd *pool, struct eval *val,
} }
ssize_t n = recv(val->fd, buffer, bfsize, 0); ssize_t n = recv(val->fd, buffer, bfsize, 0);
if (n < 1) { if (n < 1) {
uniperror("recv"); if (n) uniperror("recv");
switch (get_e()) { switch (get_e()) {
case ECONNRESET: case ECONNRESET:
case ECONNREFUSED: case ECONNREFUSED:
@ -255,6 +262,7 @@ int on_tunnel_check(struct poolhd *pool, struct eval *val,
if (on_response(pool, val, buffer, n) == 0) { if (on_response(pool, val, buffer, n) == 0) {
return 0; return 0;
} }
val->recv_count += n;
struct eval *pair = val->pair; struct eval *pair = val->pair;
ssize_t sn = send(pair->fd, buffer, n, 0); ssize_t sn = send(pair->fd, buffer, n, 0);
@ -265,6 +273,7 @@ int on_tunnel_check(struct poolhd *pool, struct eval *val,
val->type = EV_TUNNEL; val->type = EV_TUNNEL;
pair->type = EV_TUNNEL; pair->type = EV_TUNNEL;
assert(pair->buff.data);
free(pair->buff.data); free(pair->buff.data);
pair->buff.data = 0; pair->buff.data = 0;
pair->buff.size = 0; pair->buff.size = 0;
@ -298,7 +307,7 @@ int on_desync(struct poolhd *pool, struct eval *val,
} }
val = val->pair; val = val->pair;
} }
ssize_t n; ssize_t n = 0;
int m = val->attempt; int m = val->attempt;
LOG((m ? LOG_S : LOG_L), "desync params index: %d\n", m); LOG((m ? LOG_S : LOG_L), "desync params index: %d\n", m);
@ -310,6 +319,7 @@ int on_desync(struct poolhd *pool, struct eval *val,
} }
val->buff.size = n; val->buff.size = n;
val->recv_count += n; val->recv_count += n;
assert(val->buff.offset == 0);
if (!(val->buff.data = malloc(n))) { if (!(val->buff.data = malloc(n))) {
uniperror("malloc"); uniperror("malloc");
@ -337,6 +347,7 @@ int on_desync(struct poolhd *pool, struct eval *val,
} }
else { else {
n = val->buff.size; n = val->buff.size;
assert(n > 0 && n <= params.bfsize);
memcpy(buffer, val->buff.data, n); memcpy(buffer, val->buff.data, n);
} }
if (params.timeout && if (params.timeout &&

View File

@ -1,5 +1,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include "mpool.h" #include "mpool.h"
@ -37,7 +38,7 @@ struct elem *mem_get(struct mphdr *hdr, char *str, int len)
struct elem *mem_add(struct mphdr *hdr, char *str, int len) struct elem *mem_add(struct mphdr *hdr, char *str, int len)
{ {
struct elem *v, *e = malloc(sizeof(struct elem)); struct elem *v, *e = calloc(sizeof(struct elem), 1);
if (!e) { if (!e) {
return 0; return 0;
} }