From c04fbe3df564c66b0f4261a4013ea349ab41418c Mon Sep 17 00:00:00 2001 From: tomsmeding Date: Sat, 23 Nov 2019 23:41:10 +0100 Subject: static: Make thread-safe --- plugins/static/static.c | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/plugins/static/static.c b/plugins/static/static.c index 2fb6e0f..0b39afe 100644 --- a/plugins/static/static.c +++ b/plugins/static/static.c @@ -2,15 +2,16 @@ #include #include #include -#include #include #include #include +#include "memory.h" #include "plugin.h" #include "util.h" #include "buffer.h" +// Will only be set once in the registration function, which is before any threading is done static char *static_file_dir = NULL; @@ -29,20 +30,9 @@ static bool path_allowed(const char *path) { return true; } -// Returns pointer to internal buffer, don't free -static const char* make_relative_path(const char *path) { - static char *rel = NULL; - static size_t rel_cap = 0; - - size_t necessary = strlen(static_file_dir) + 1 + strlen(path) + 1; - if (necessary >= rel_cap) { - rel_cap = necessary; - rel = realloc(rel, rel_cap); - assert(rel); - } - +static char* make_relative_path(const char *path) { + char *rel = malloc(strlen(static_file_dir) + 1 + strlen(path) + 1, char); sprintf(rel, "%s/%s", static_file_dir, path); - return rel; } @@ -98,33 +88,39 @@ static void send_500(int sock) { } static Handler_ret_t connection_handler(int sock, Headers *headers) { + char *path = NULL; + struct buffer buffer; + buffer.buf = NULL; + if (!path_allowed(headers->url)) { send_404(sock); - return HR_HANDLED; + goto cleanup_return; } - const char *path = make_relative_path(headers->url); + path = make_relative_path(headers->url); ssize_t size = query_file_size(path); if (size < 0) { if (errno == ENOENT || errno == EISDIR) { send_404(sock); - return HR_HANDLED; + goto cleanup_return; } else { send_500(sock); - return HR_HANDLED; + goto cleanup_return; } } - struct buffer buffer = build_response_headers("200 OK", "text/plain; charset=UTF-8", size); + buffer = build_response_headers("200 OK", "text/plain; charset=UTF-8", size); if (!buffer_append_file(&buffer, path)) { - buffer_free(buffer); send_500(sock); - return HR_HANDLED; + goto cleanup_return; } sendall(sock, buffer.buf, buffer.len); - buffer_free(buffer); + +cleanup_return: + if (buffer.buf) buffer_free(buffer); + if (path) free(path); return HR_HANDLED; } -- cgit v1.2.3