diff --git a/src/http/http.c b/src/http/http.c index 937ad55..2db46e1 100644 --- a/src/http/http.c +++ b/src/http/http.c @@ -2,6 +2,7 @@ #include "http/http.h" +#include #include #include #include @@ -17,6 +18,7 @@ static cws_http_s *http_new() { if (!request) { return NULL; } + memset(request, 0, sizeof *request); request->http_version = string_new("", 16); request->location = string_new("", 128); @@ -88,10 +90,16 @@ static size_t file_data(const char *path, char **data) { fseek(file, 0, SEEK_END); const size_t content_length = ftell(file); rewind(file); + if (errno != 0) { + fclose(file); + CWS_LOG_ERROR("Unable to rewind"); + + return 0; + } /* Retrieve file data */ *data = malloc(content_length); - if (!data) { + if (!*data) { fclose(file); CWS_LOG_ERROR("Unable to allocate file data"); @@ -99,11 +107,10 @@ static size_t file_data(const char *path, char **data) { } /* Read file data */ - size_t read_bytes = fread(data, 1, content_length, file); + size_t read_bytes = fread(*data, 1, content_length, file); fclose(file); if (read_bytes != content_length) { - free(data); CWS_LOG_ERROR("Partial read from file"); return 0; @@ -119,7 +126,7 @@ static cws_server_ret http_send_resource(cws_http_s *request) { /* TODO: Check for keep-alive */ - char *data; + char *data = NULL; char *response; size_t content_length = file_data(request->location_path->data, &data); @@ -136,7 +143,7 @@ static cws_server_ret http_send_resource(cws_http_s *request) { static size_t http_simple_html(char **response, cws_http_status_e status, char *title, char *description) { char body[512]; - memset(body, 0, sizeof(body)); + memset(body, 0, sizeof body); snprintf(body, sizeof(body), "\n" @@ -181,8 +188,6 @@ cws_http_s *cws_http_parse(string_s *request_str) { if (request->method == HTTP_UNKNOWN) { cws_http_free(request); - cws_http_send_response(request, HTTP_NOT_IMPLEMENTED); - return NULL; } @@ -285,7 +290,7 @@ size_t http_response_builder(char **response, cws_http_status_e status, char *co } void cws_http_send_response(cws_http_s *request, cws_http_status_e status) { - char *response; + char *response = NULL; switch (status) { case HTTP_OK: @@ -304,12 +309,30 @@ void cws_http_send_response(cws_http_s *request, cws_http_status_e status) { break; } } + + free(response); } void cws_http_free(cws_http_s *request) { - hm_free(request->headers); - string_free(request->http_version); - string_free(request->location); - string_free(request->location_path); + if (!request) { + return; + } + + if (request->headers) { + hm_free(request->headers); + } + + if (request->http_version) { + string_free(request->http_version); + } + + if (request->location) { + string_free(request->location); + } + + if (request->location_path) { + string_free(request->location_path); + } + free(request); } diff --git a/src/server/server.c b/src/server/server.c index 19bd06a..f1f36b2 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -12,7 +12,7 @@ #include "utils/utils.h" static void cws_server_setup_hints(struct addrinfo *hints, const char *hostname) { - memset(hints, 0, sizeof(struct addrinfo)); + memset(hints, 0, sizeof *hints); /* IPv4 or IPv6 */ hints->ai_family = AF_UNSPEC; @@ -49,7 +49,7 @@ cws_server_ret cws_server_setup(cws_server_s *server, cws_config_s *config) { return CWS_SERVER_CONFIG; } - memset(server, 0, sizeof(cws_server_s)); + memset(server, 0, sizeof *server); /* Setup basic stuff */ struct addrinfo hints; @@ -107,7 +107,7 @@ cws_server_ret cws_server_setup(cws_server_s *server, cws_config_s *config) { cws_server_ret cws_server_start(cws_server_s *server) { struct epoll_event events[128]; - memset(events, 0, sizeof(events)); + memset(events, 0, sizeof events); int client_fd = 0; size_t workers_index = 0; diff --git a/src/server/worker.c b/src/server/worker.c index 40eb100..7584728 100644 --- a/src/server/worker.c +++ b/src/server/worker.c @@ -35,7 +35,7 @@ static int cws_worker_setup_epoll(cws_worker_s *worker) { static int cws_read_data(int sockfd, string_s *str) { char tmp[4096]; - memset(tmp, 0, sizeof(tmp)); + memset(tmp, 0, sizeof tmp); int bytes = sock_readall(sockfd, tmp, sizeof(tmp)); string_append(str, tmp); @@ -44,24 +44,23 @@ static int cws_read_data(int sockfd, string_s *str) { } cws_worker_s **cws_worker_new(size_t workers_num, cws_config_s *config) { - cws_worker_s **workers = malloc(sizeof(cws_worker_s) * workers_num); + cws_worker_s **workers = malloc(workers_num * sizeof *workers); if (workers == NULL) { return NULL; } - memset(workers, 0, sizeof(cws_worker_s) * workers_num); + memset(workers, 0, sizeof **workers * workers_num); for (size_t i = 0; i < workers_num; ++i) { workers[i] = malloc(sizeof(cws_worker_s)); if (workers[i] == NULL) { for (size_t j = 0; j < i; ++j) { free(workers[j]); - - return NULL; } free(workers); + return NULL; } - memset(workers[i], 0, sizeof(cws_worker_s)); + memset(workers[i], 0, sizeof **workers); workers[i]->config = config; @@ -71,11 +70,10 @@ cws_worker_s **cws_worker_new(size_t workers_num, cws_config_s *config) { if (ret == -1) { for (size_t j = 0; j < i; ++j) { free(workers[j]); - - return NULL; } free(workers); + return NULL; } }