From 11a95ee7fa9886ee2f62df940c7a53cfa1a8698a Mon Sep 17 00:00:00 2001 From: Rory Bradford Date: Sun, 2 Aug 2020 15:31:16 +0100 Subject: Additional safety Signed-off-by: Rory Bradford --- ignore.c | 55 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 18 deletions(-) (limited to 'ignore.c') diff --git a/ignore.c b/ignore.c index d7b6428..8abca6e 100644 --- a/ignore.c +++ b/ignore.c @@ -12,25 +12,42 @@ static int total_size; struct ignores *init_ignores(char *path) { + int i = 0; + FILE *ignore = fopen(path, "r"); + + if (ignore == NULL) { + return NULL; + } + + char *line = NULL; + size_t llen = 0; total_size = IGNORE_SIZE; struct ignores *ignores = calloc(sizeof(struct ignores), 1); ignores->list = calloc(sizeof(char *), IGNORE_SIZE); ignores->size = 0; - int i = 0; - FILE *ignore = fopen(path, "r"); - char *line = NULL; - size_t llen = 0; - ssize_t r; + while (getline(&line, &llen, ignore) != -1) { + /** isspace doesn't necessarily hold true for `\n` for anything + * other than the 'C' locale on some platforms, so we have to do + * an additional check for this + */ + + if (strlen(line) == 1 && (isspace(line[0]) || line[0] == '\n')) { + continue; + } - if (ignore != NULL) { - while ((r = getline(&line, &llen, ignore)) != -1) { - char *l = calloc(sizeof(char *), strlen(line) - 1); + if (strlen(line) > 0) { + char *l = calloc(sizeof(char), strlen(line)); + + if (l == NULL) { + fprintf(stderr, "calloc\n"); + exit(EXIT_FAILURE); + } for (size_t j = 0, k = 0; j < strlen(line); j++) { char c = line[j]; - if (isspace(c)) { + if (isspace(c) || c == '\n') { break; } @@ -45,23 +62,25 @@ struct ignores *init_ignores(char *path) { ignores->list[i++] = l; } - - free(line); - fclose(ignore); } + free(line); + fclose(ignore); + ignores->size = i; return ignores; } void free_ignores(struct ignores *ignores) { - if (ignores->size > 0) { - for (int i = 0; i < ignores->size; i++) { - free(ignores->list[i]); + if (ignores != NULL) { + if (ignores->size > 0) { + for (int i = 0; i < ignores->size; i++) { + free(ignores->list[i]); + } } - } - free(ignores->list); - free(ignores); + free(ignores->list); + free(ignores); + } } -- cgit 1.4.1-2-gfad0