Remove most memory leaks with valgrind
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
@ -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];
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user