From 7e621cb64fd1e9a208105a09972ee5b07bf6d159 Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Wed, 23 Aug 2023 14:05:32 -0400 Subject: [PATCH] Properly init filename when creating node --- haggis.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/haggis.c b/haggis.c index 503e549..a73b2a7 100644 --- a/haggis.c +++ b/haggis.c @@ -30,8 +30,11 @@ * other than his own. */ +#include #include // PATH_MAX +#include #include // uint_t +#include #if defined(__FreeBSD__) || defined(__DragonFly__) #include @@ -364,7 +367,7 @@ int haggis_load_file(FILE *stream, haggis_file *f) { void haggis_filename_init(char *target, haggis_filename *fname) { size_t len; - len = strlen(target) - 1; + len = strlen(target); fname->len.val = (uint16_t)len; fname->name = target; } @@ -524,6 +527,7 @@ haggis_node* haggis_create_node(char *file, haggis_algorithm a, haggis_linkmap * char *target; char pathbuf[PATH_MAX]; int res; + size_t namlen; haggis_node *node; node = calloc(1, sizeof(haggis_node)); @@ -548,6 +552,19 @@ haggis_node* haggis_create_node(char *file, haggis_algorithm a, haggis_linkmap * free(node); return NULL; } + errno = 0; + if (file[0] == '/') { + namlen = strnlen(file, PATH_MAX - 1); + node->name.name = strndup(&file[1], namlen); + } else { + namlen = strnlen(file, PATH_MAX) + 1; + node->name.name = strndup(file, namlen); + } + if (errno == ENOMEM) { + haggis_node_deinit(node); + return NULL; + } + node->name.len.val = (uint16_t)namlen; node->uid.val = (uint32_t)st->st_uid; node->gid.val = (uint32_t)st->st_gid; node->mtime.val = (uint64_t)st->st_mtim.tv_sec;