Add lock for clients list

This commit is contained in:
2023-01-11 18:06:55 +01:00
parent 487386158d
commit a3dcddf69d
2 changed files with 52 additions and 2 deletions

View File

@ -32,11 +32,13 @@
#include <openssl/pem.h> #include <openssl/pem.h>
#include <openssl/ssl.h> #include <openssl/ssl.h>
#include <openssl/conf.h> #include <openssl/conf.h>
#include <semaphore.h>
const char *config_file; const char *config_file;
static int sockets[NUM_SOCKETS]; static int sockets[NUM_SOCKETS];
static SSL_CTX *contexts[CONFIG_MAX_CERT_CONFIG]; static SSL_CTX *contexts[CONFIG_MAX_CERT_CONFIG];
static client_ctx_t **clients; static client_ctx_t **clients;
static sem_t sem_clients_lock;
static void clean(void) { static void clean(void) {
notice("Cleaning sesimos cache and metadata files..."); notice("Cleaning sesimos cache and metadata files...");
@ -79,7 +81,28 @@ static int ssl_servername_cb(SSL *ssl, int *ad, void *arg) {
} }
void server_free_client(client_ctx_t *ctx) { void server_free_client(client_ctx_t *ctx) {
// try to lock clients list
retry:
if (sem_wait(&sem_clients_lock) != 0) {
if (errno == EINTR) {
goto retry;
} else {
critical("Unable to lock clients list");
return;
}
}
// delete from list
clients = list_delete(clients, &ctx); clients = list_delete(clients, &ctx);
if (clients == NULL) {
critical("Unable to delete context from list");
return;
}
// unlock clients list
sem_post(&sem_clients_lock);
// free data
free(ctx); free(ctx);
} }
@ -101,7 +124,6 @@ static void accept_cb(void *arg) {
errno = 0; errno = 0;
return; return;
} }
client_ctx->in_use = 1;
sock *client = &client_ctx->socket; sock *client = &client_ctx->socket;
client->ctx = contexts[0]; client->ctx = contexts[0];
@ -109,6 +131,7 @@ static void accept_cb(void *arg) {
int client_fd = accept(fd, &client->_addr.sock, &addr_len); int client_fd = accept(fd, &client->_addr.sock, &addr_len);
if (client_fd < 0) { if (client_fd < 0) {
critical("Unable to accept connection"); critical("Unable to accept connection");
free(client_ctx);
return; return;
} }
@ -119,13 +142,29 @@ static void accept_cb(void *arg) {
client_ctx->cnx_s = client->ts_start; client_ctx->cnx_s = client->ts_start;
client_ctx->cnx_e = -1, client_ctx->req_s = -1, client_ctx->req_e = -1, client_ctx->res_ts = -1; client_ctx->cnx_e = -1, client_ctx->req_s = -1, client_ctx->req_e = -1, client_ctx->res_ts = -1;
// try to lock clients list
retry:
if (sem_wait(&sem_clients_lock) != 0) {
if (errno == EINTR) {
goto retry;
} else {
critical("Unable to lock clients list");
return;
}
}
// append to list
clients = list_append(clients, &client_ctx); clients = list_append(clients, &client_ctx);
if (clients == NULL) { if (clients == NULL) {
critical("Unable to add client context to list"); critical("Unable to add client context to list");
free(client_ctx);
errno = 0; errno = 0;
return; return;
} }
// unlock clients list
sem_post(&sem_clients_lock);
tcp_accept(client_ctx); tcp_accept(client_ctx);
} }
@ -313,11 +352,19 @@ int main(int argc, char *const argv[]) {
return 1; return 1;
} }
if (sem_init(&sem_clients_lock, 0, 1) != 0) {
critical("Unable to create clients lock semaphore");
ssl_free();
list_free(clients);
return 1;
}
if (async_init() != 0) { if (async_init() != 0) {
critical("Unable to initialize async thread"); critical("Unable to initialize async thread");
ssl_free(); ssl_free();
geoip_free(); geoip_free();
list_free(clients); list_free(clients);
sem_destroy(&sem_clients_lock);
return 1; return 1;
} }
@ -326,6 +373,7 @@ int main(int argc, char *const argv[]) {
ssl_free(); ssl_free();
geoip_free(); geoip_free();
list_free(clients); list_free(clients);
sem_destroy(&sem_clients_lock);
async_free(); async_free();
return 1; return 1;
} }
@ -336,6 +384,7 @@ int main(int argc, char *const argv[]) {
ssl_free(); ssl_free();
geoip_free(); geoip_free();
list_free(clients); list_free(clients);
sem_destroy(&sem_clients_lock);
async_free(); async_free();
proxy_unload(); proxy_unload();
return 1; return 1;
@ -360,6 +409,7 @@ int main(int argc, char *const argv[]) {
// cleanup // cleanup
ssl_free(); ssl_free();
list_free(clients); list_free(clients);
sem_destroy(&sem_clients_lock);
geoip_free(); geoip_free();
proxy_unload(); proxy_unload();
cache_join(); cache_join();

View File

@ -18,7 +18,7 @@
typedef struct { typedef struct {
sock socket; sock socket;
int req_num; int req_num;
unsigned char in_use: 1, s_keep_alive:1, c_keep_alive:1, use_fastcgi:4, use_proxy:2, ws_close:2; unsigned char s_keep_alive:1, c_keep_alive:1, use_fastcgi:4, use_proxy:2, ws_close:2;
char cc[3], host[256]; char cc[3], host[256];
char req_host[256], err_msg[256]; char req_host[256], err_msg[256];
char log_prefix[128]; char log_prefix[128];