Remove most memory leaks with valgrind

This commit is contained in:
2023-01-11 16:38:14 +01:00
parent 32f00175e4
commit 487386158d
7 changed files with 68 additions and 42 deletions

View File

@ -69,6 +69,9 @@ int compress_free(compress_ctx *ctx) {
BrotliEncoderDestroyInstance(ctx->brotli);
ctx->brotli = NULL;
}
if (ctx->mode & COMPRESS_GZ) {
deflateEnd(&ctx->gzip);
}
ctx->mode = 0;
return 0;
}

View File

@ -42,7 +42,7 @@ int config_load(const char *filename) {
if (comment != NULL) comment[0] = 0;
unsigned long len = strlen(ptr);
char *end_ptr = ptr + len - 1;
char *end_ptr = (len > 0) ? ptr + len - 1 : ptr;
while (end_ptr[0] == ' ' || end_ptr[0] == '\t') {
end_ptr[0] = 0;
end_ptr--;
@ -161,6 +161,8 @@ int config_load(const char *filename) {
if (strlen(source) == 0) {
err:
critical("Unable to parse config file (line %i)", line);
free(line);
fclose(file);
return -2;
}
@ -182,6 +184,7 @@ int config_load(const char *filename) {
}
free(line);
fclose(file);
for (int k = 0; k < i; k++) {
host_config_t *hc = &config.hosts[k];

View File

@ -6,6 +6,8 @@
#include <errno.h>
#define FACTOR 4
#define meta(ptr) ((list_meta_t *) ((unsigned char *) (ptr) - sizeof(list_meta_t)))
#define data(ptr) ((unsigned char *) (ptr) + sizeof(list_meta_t))
typedef struct {
int init_size, elem_size, max_size, size;
@ -30,21 +32,24 @@ void *list_create(int elem_size, int init_elem_n) {
}
void *list_ptr = malloc(sizeof(list_meta_t) + elem_size * init_elem_n);
if (list_ptr == NULL)
return NULL;
memset(list_ptr, 0, sizeof(list_meta_t) + elem_size * init_elem_n);
list_meta_t *list = list_ptr;
list->init_size = init_elem_n;
list->elem_size = elem_size;
list->max_size = init_elem_n;
list->size = 0;
return (unsigned char *) list_ptr + sizeof(list_meta_t);
return data(list_ptr);
}
int list_size(const void *list_ptr) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
return list->size;
return meta(list_ptr)->size;
}
int list_find(void *list_ptr, void *elem) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
list_meta_t *list = meta(list_ptr);
unsigned char *array = list_ptr;
for (int i = 0; i < list->size; i++) {
@ -60,32 +65,31 @@ void *list_insert(void *list_ptr, void *elem, int n) {
void *ptr = NULL;
list_ptr = list_insert_ptr(list_ptr, &ptr, n);
if (list_ptr != NULL && ptr != NULL) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
memcpy(ptr, elem, list->elem_size);
memcpy(ptr, elem, meta(list_ptr)->elem_size);
}
return list_ptr;
}
void *list_insert_ptr(void *list_ptr, void **elem, int n) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
list_meta_t *list = meta(list_ptr);
if (n < 0)
n = list->size + n + 1;
if (list->size >= list->max_size) {
if ((list = list_resize(list, list->max_size * FACTOR)) == NULL) {
if ((list = list_resize(list, list->max_size * FACTOR)) == NULL)
return NULL;
}
}
unsigned char *array = (unsigned char *) list + sizeof(list_meta_t);
unsigned char *array = data(list);
if (n < list->size)
memmove(array + (n + 1) * list->elem_size, array + n * list->elem_size, (list->size - n) * list->elem_size);
*elem = array + n * list->elem_size;
memset(*elem, 0, list->elem_size);
list->size++;
return (unsigned char *) list + sizeof(list_meta_t);
return array;
}
void *list_append(void *list_ptr, void *elem) {
@ -97,7 +101,7 @@ void *list_append_ptr(void *list_ptr, void **elem) {
}
void *list_remove(void *list_ptr, int n) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
list_meta_t *list = meta(list_ptr);
if (n < 0)
n = list->size + n;
@ -106,6 +110,8 @@ void *list_remove(void *list_ptr, int n) {
if (list->size > 1 && n < list->size)
memmove(array + n * list->elem_size, array + (n + 1) * list->elem_size, (list->size - n - 1) * list->elem_size);
memset(array + list->size * list->elem_size, 0, list->elem_size);
list->size--;
if (list->size < list->max_size / FACTOR / 2 && list->max_size / FACTOR >= list->init_size) {
if ((list = list_resize(list, list->max_size / FACTOR)) == NULL) {
@ -113,7 +119,7 @@ void *list_remove(void *list_ptr, int n) {
}
}
return (unsigned char *) list + sizeof(list_meta_t);
return data(list);
}
void *list_delete(void *list_ptr, void *elem) {
@ -126,14 +132,13 @@ void *list_delete(void *list_ptr, void *elem) {
}
void *list_clear(void *list_ptr) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
list_meta_t *list = meta(list_ptr);
list->size = 0;
memset(list_ptr, 0, list->max_size * list->elem_size);
list->max_size = list->init_size;
return (unsigned char *) list_resize(list, list->max_size * list->elem_size) + sizeof(list_meta_t);
return data(list_resize(list, list->max_size));
}
void list_free(void *list_ptr) {
list_meta_t *list = (void *) ((unsigned char *) list_ptr - sizeof(list_meta_t));
free(list);
free(meta(list_ptr));
}

View File

@ -462,7 +462,7 @@ int proxy_init(proxy_ctx_t **proxy_ptr, http_req *req, http_res *res, http_statu
return -1;
}
ret = sock_recv(&proxy->proxy, buffer, sizeof(buffer), MSG_PEEK);
ret = sock_recv(&proxy->proxy, buffer, sizeof(buffer) - 1, MSG_PEEK);
if (ret <= 0) {
int e_sys = error_get_sys(), e_ssl = error_get_ssl();
if (e_sys == EAGAIN || e_sys == EINPROGRESS || e_ssl == SSL_ERROR_WANT_READ || e_ssl == SSL_ERROR_WANT_WRITE) {
@ -477,6 +477,7 @@ int proxy_init(proxy_ctx_t **proxy_ptr, http_req *req, http_res *res, http_statu
retry = tries < 4;
goto proxy_err;
}
buffer[ret] = 0;
char *buf = buffer;
unsigned short header_len = (unsigned short) (strstr(buffer, "\r\n\r\n") - buffer + 4);