Fix leaks and remove some non-standard functions

This commit is contained in:
Tobias Reisinger 2020-11-15 16:36:44 +01:00
parent c7cafa94c4
commit 97a19135ce
6 changed files with 63 additions and 27 deletions

View file

@ -24,7 +24,7 @@ typedef struct
int status_code;
const char *content_type;
size_t content_length;
const char *content;
char *content;
int alloced_content;
} endpoint_response_t;
@ -62,4 +62,7 @@ endpoint_response_text(endpoint_response_t *response, int status_code, const cha
void
endpoint_response_json(endpoint_response_t *response, int status_code, const cJSON *json_root);
void
endpoint_response_free_content(endpoint_response_t *response);
#endif /* CORE_ENDPOINT_H */

View file

@ -15,43 +15,43 @@ config_t *global_config;
static int
config_load_log_level(IniDispatch *disp, config_t *config)
{
if(strcasecmp(disp->value, "debug") == 0)
if(strcmp(disp->value, "debug") == 0)
{
setlogmask(LOG_UPTO(LOG_DEBUG));
config->log_level = LOG_DEBUG;
return 0;
}
if(strcasecmp(disp->value, "info") == 0)
if(strcmp(disp->value, "info") == 0)
{
setlogmask(LOG_UPTO(LOG_INFO));
config->log_level = LOG_INFO;
return 0;
}
if(strcasecmp(disp->value, "notice") == 0)
if(strcmp(disp->value, "notice") == 0)
{
setlogmask(LOG_UPTO(LOG_NOTICE));
config->log_level = LOG_NOTICE;
return 0;
}
if(strcasecmp(disp->value, "warning") == 0)
if(strcmp(disp->value, "warning") == 0)
{
setlogmask(LOG_UPTO(LOG_WARNING));
config->log_level = LOG_WARNING;
return 0;
}
if(strcasecmp(disp->value, "err") == 0)
if(strcmp(disp->value, "err") == 0)
{
setlogmask(LOG_UPTO(LOG_ERR));
config->log_level = LOG_ERR;
return 0;
}
if(strcasecmp(disp->value, "crit") == 0)
if(strcmp(disp->value, "crit") == 0)
{
setlogmask(LOG_UPTO(LOG_CRIT));
config->log_level = LOG_CRIT;
return 0;
}
if(strcasecmp(disp->value, "emerg") == 0)
if(strcmp(disp->value, "emerg") == 0)
{
setlogmask(LOG_UPTO(LOG_EMERG));
config->log_level = LOG_EMERG;
@ -65,12 +65,12 @@ config_load_log_level(IniDispatch *disp, config_t *config)
static int
config_load_log_file(IniDispatch *disp, config_t *config)
{
if(strcasecmp(disp->value, "stdout") == 0)
if(strcmp(disp->value, "stdout") == 0)
{
config->log_file = stdout;
return 0;
}
if(strcasecmp(disp->value, "stderr") == 0)
if(strcmp(disp->value, "stderr") == 0)
{
config->log_file = stderr;
return 0;

View file

@ -1,3 +1,5 @@
#include <bsd/string.h>
#include <logger.h>
#include <cJSON.h>
#include <mongoose.h>
@ -33,6 +35,9 @@ endpoint_func_not_found(struct mg_connection *nc, struct http_message *hm, endpo
else
{
LOGGER_DEBUG("404 file not found\n");
endpoint_response_free_content(response);
response->status_code = 404;
response->content_type = global_config->not_found_content_type;
response->content_length = strlen(global_config->not_found_content);
@ -45,6 +50,8 @@ endpoint_func_not_found(struct mg_connection *nc, struct http_message *hm, endpo
void
endpoint_response_msg(endpoint_response_t *response, int status_code, const char *content, int content_length)
{
endpoint_response_free_content(response);
cJSON *json;
json = cJSON_CreateObject();
@ -66,11 +73,14 @@ endpoint_response_msg(endpoint_response_t *response, int status_code, const char
cJSON_AddItemToObject(json, "msg", json_msg);
endpoint_response_json(response, status_code, json);
cJSON_Delete(json);
}
void
endpoint_response_text(endpoint_response_t *response, int status_code, const char *content, int content_length)
{
endpoint_response_free_content(response);
if(content == NULL)
{
content = "";
@ -83,18 +93,24 @@ endpoint_response_text(endpoint_response_t *response, int status_code, const cha
{
response->content_length = content_length;
response->alloced_content = false;
response->content = (char*)content;
}
else
{
response->content_length = strlen(content);
response->alloced_content = true;
int content_size = response->content_length + 1;
response->content = malloc(sizeof(char) * content_size);
strlcpy(response->content, content, content_size);
}
response->content = content;
}
void
endpoint_response_json(endpoint_response_t *response, int status_code, const cJSON *json_root)
{
endpoint_response_free_content(response);
if(json_root != NULL)
{
char *json_str = cJSON_Print(json_root);
@ -112,3 +128,14 @@ endpoint_response_json(endpoint_response_t *response, int status_code, const cJS
M_RESPONSE_MSG(LOGGER_ERR, response, 500, "failed to print json");
}
void
endpoint_response_free_content(endpoint_response_t *response)
{
if(response->alloced_content)
{
free(response->content);
response->content = NULL;
response->alloced_content = false;
}
}

View file

@ -172,7 +172,7 @@ api_v1_controllers_discover_PUT(struct mg_connection *nc, struct http_message *h
continue;
}
char *answer_payload = (char*)malloc((payload_length));
char *answer_payload = (char*)malloc((payload_length + 1));
if(recv(client_fd, answer_payload, payload_length, 0) <= 0)
{
LOGGER_ERR("error receiving payload from client\n");

View file

@ -45,11 +45,6 @@ send_response(struct mg_connection *nc, endpoint_response_t *response)
free(response_headers);
free(extra_headers);
if(response->alloced_content)
{
free((char*)response->content);
}
}
}
@ -83,8 +78,10 @@ handle_http_request(struct mg_connection *nc, struct http_message *hm)
endpoint_t *endpoint = router_find_endpoint(hm->uri.p, hm->uri.len, &hm->method);
endpoint_response_t response;
response.content = NULL;
response.alloced_content = false;
M_RESPONSE_MSG(LOGGER_NONE, &response, 500, "server did not create a response");
M_RESPONSE_MSG(LOGGER_WARNING, &response, 500, "server did not create a response");
if(!endpoint)
{
@ -92,6 +89,7 @@ handle_http_request(struct mg_connection *nc, struct http_message *hm)
if (!mg_normalize_uri_path(&hm->uri, &hm->uri)) {
mg_http_send_error(nc, 400, global_config->http_server_opts.extra_headers);
LOGGER_DEBUG("failed to normalize uri %.*s\n", hm->uri.len, hm->uri.p);
endpoint_response_free_content(&response);
return;
}
LOGGER_DEBUG("no endpoint found - serving file\n");
@ -116,6 +114,7 @@ handle_http_request(struct mg_connection *nc, struct http_message *hm)
response.status_code = 0;
mg_serve_http(nc, hm, global_config->http_server_opts);
LOGGER_DEBUG("serving %.*s\n", hm->uri.len, hm->uri.p);
endpoint_response_free_content(&response);
return;
}
@ -147,6 +146,7 @@ handle_http_request(struct mg_connection *nc, struct http_message *hm)
send_response(nc, &response);
}
endpoint_response_free_content(&response);
LOGGER_DEBUG("freeing endpoint args\n");
for(int i = 0; i < endpoint->args_count; ++i)
{

View file

@ -21,6 +21,7 @@ logger_log(int level, const char *filename, int line, const char *func, const ch
{
return;
}
va_list args;
const char *level_str;
const char *color;
@ -62,23 +63,28 @@ logger_log(int level, const char *filename, int line, const char *func, const ch
time_t rawtime;
time(&rawtime);
strftime(timestamp_str, 32, "%Y-%m-%d %H:%M:%S", localtime(&rawtime));
size_t timestamp_len = strlen(timestamp_str);
char *buffer = malloc(sizeof(char) * (128 + strlen(msg)));
sprintf(buffer, "%s[%5s] %s:%d:%s " COLOR_NONE "%s", color, level_str, filename, line, func, msg);
char *buffer = malloc(sizeof(char) * (128 + strlen(msg) + timestamp_len));
sprintf(buffer, "%s %s[%5s] %s:%d:%s " COLOR_NONE "%s", timestamp_str, color, level_str, filename, line, func, msg);
va_list args;
// start arg va_list and find log_len
va_start(args, msg);
vsyslog(level, buffer, args);
size_t log_len = vsnprintf(NULL, 0, buffer, args); // NOLINT(clang-analyzer-valist.Uninitialized): clang-tidy bug
va_end(args);
char *buffer_timed = malloc(sizeof(char) * (strlen(timestamp_str) + strlen(buffer) + 2));
sprintf(buffer_timed, "%s %s", timestamp_str, buffer);
char *log_line = malloc(sizeof(char) * (log_len + 1));
// start arg va_list again and write log_line
va_start(args, msg);
vfprintf(global_config->log_file, buffer_timed, args); // NOLINT(clang-analyzer-valist.Uninitialized): clang-tidy bug
vsprintf(log_line, buffer, args); // NOLINT(clang-analyzer-valist.Uninitialized): clang-tidy bug
va_end(args);
syslog(level, "%s", log_line + timestamp_len + 1);
fprintf(global_config->log_file, "%s", log_line);
fflush(global_config->log_file);
va_end(args);
free(buffer);
free(buffer_timed);
free(log_line);
}