From 0a94f3f303a926b25007265a7f5bb7befcddf3af Mon Sep 17 00:00:00 2001 From: Jack Newman Date: Wed, 18 Jan 2023 15:59:50 +1000 Subject: [PATCH] Use realpath in do_change() to ensure symlink directories are correctly reloaded. --- src/conf.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/src/conf.c b/src/conf.c index 00b9a516..a167075a 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1040,30 +1040,40 @@ static void drop_changes(void) static int do_change(char *dir, char *name, uint32_t mask) { char fn[strlen(dir) + strlen(name) + 2]; + char *rp; struct conf_change *node; paste(fn, sizeof(fn), dir, name); dbg("path: %s mask: %08x", fn, mask); - node = conf_find(fn); + rp = realpath(fn, NULL); + if (!rp) + return 0; + + node = conf_find(rp); if (node) { dbg("Event already registered for %s ...", name); + free(rp); return 0; } node = malloc(sizeof(*node)); - if (!node) - return 1; - - node->name = strdup(fn); - if (!node->name) { - free(node); + if (!node) { + free(rp); return 1; } - dbg("Event registered for %s, mask 0x%x", fn, mask); + node->name = strdup(rp); + if (!node->name) { + free(node); + free(rp); + return 1; + } + + dbg("Event registered for %s, mask 0x%x", rp, mask); TAILQ_INSERT_HEAD(&conf_change_list, node, link); + free(rp); return 0; }