From 821abb4b8cb5e9d8c8018dba14adf2c79af0a22b Mon Sep 17 00:00:00 2001 From: Leif Hedstrom Date: Mon, 4 Sep 2023 17:34:25 -0600 Subject: [PATCH 1/2] Add a length check to healthcheck basename This fixes #10349 --- plugins/healthchecks/healthchecks.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/healthchecks/healthchecks.cc b/plugins/healthchecks/healthchecks.cc index 77a69b13164..4211f51c8b1 100644 --- a/plugins/healthchecks/healthchecks.cc +++ b/plugins/healthchecks/healthchecks.cc @@ -64,6 +64,7 @@ typedef struct HCFileData_t { typedef struct HCFileInfo_t { char fname[MAX_PATH_LEN]; /* Filename */ char *basename; /* The "basename" of the file */ + unsigned basename_len; /* The length of the basename */ char path[PATH_NAME_MAX]; /* URL path for this HC */ int p_len; /* Length of path */ const char *ok; /* Header for an OK result */ @@ -216,7 +217,7 @@ hc_thread(void *data ATS_UNUSED) HCFileInfo *finfo = g_config; while (finfo && !((event->wd == finfo->wd) || - ((event->wd == finfo->dir->wd) && !strncmp(event->name, finfo->basename, event->len)))) { + ((event->wd == finfo->dir->wd) && !strncmp(event->name, finfo->basename, finfo->basename_len)))) { finfo = finfo->_next; } if (finfo) { @@ -329,6 +330,7 @@ parse_configs(const char *fname) if (finfo->basename) { ++(finfo->basename); } + finfo->basename_len = strlen(finfo->basename); break; case 2: mime = str; From b5afcc593c7f236e2cc30810dfe5a2f353f2a31b Mon Sep 17 00:00:00 2001 From: Leif Hedstrom Date: Mon, 4 Sep 2023 18:01:17 -0600 Subject: [PATCH 2/2] Fix the filename size --- plugins/healthchecks/healthchecks.cc | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/plugins/healthchecks/healthchecks.cc b/plugins/healthchecks/healthchecks.cc index 4211f51c8b1..63da604e78d 100644 --- a/plugins/healthchecks/healthchecks.cc +++ b/plugins/healthchecks/healthchecks.cc @@ -64,7 +64,7 @@ typedef struct HCFileData_t { typedef struct HCFileInfo_t { char fname[MAX_PATH_LEN]; /* Filename */ char *basename; /* The "basename" of the file */ - unsigned basename_len; /* The length of the basename */ + unsigned basename_len = 0; /* The length of the basename */ char path[PATH_NAME_MAX]; /* URL path for this HC */ int p_len; /* Length of path */ const char *ok; /* Header for an OK result */ @@ -138,6 +138,7 @@ setup_watchers(int fd) conf->wd = inotify_add_watch(fd, conf->fname, IN_DELETE_SELF | IN_CLOSE_WRITE | IN_ATTRIB); TSDebug(PLUGIN_NAME, "Setting up a watcher for %s", conf->fname); strncpy(fname, conf->fname, MAX_PATH_LEN); + char *dname = dirname(fname); /* Make sure to only watch each directory once */ if (!(dir = find_direntry(dname, head_dir))) { @@ -322,15 +323,17 @@ parse_configs(const char *fname) ++str; } strncpy(finfo->path, str, PATH_NAME_MAX - 1); - finfo->p_len = strlen(finfo->path); + finfo->path[PATH_NAME_MAX - 1] = '\0'; + finfo->p_len = strlen(finfo->path); break; case 1: strncpy(finfo->fname, str, MAX_PATH_LEN - 1); - finfo->basename = strrchr(finfo->fname, '/'); + finfo->fname[MAX_PATH_LEN - 1] = '\0'; + finfo->basename = strrchr(finfo->fname, '/'); if (finfo->basename) { ++(finfo->basename); + finfo->basename_len = strlen(finfo->basename); } - finfo->basename_len = strlen(finfo->basename); break; case 2: mime = str;