From 6b32d195e88fc51289a317ee7e43fe642ef6b49f Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 16 Dec 2024 09:13:09 +0000 Subject: [PATCH] Add a nesting limit to source-file, from Fadi Afani in GitHub issue 4223. --- cmd-source-file.c | 30 ++++++++++++++++++++++++++++++ tmux.h | 1 + 2 files changed, 31 insertions(+) diff --git a/cmd-source-file.c b/cmd-source-file.c index 67f353b9..7696dc92 100644 --- a/cmd-source-file.c +++ b/cmd-source-file.c @@ -30,6 +30,9 @@ * Sources a configuration file. */ +#define CMD_SOURCE_FILE_DEPTH_LIMIT 50 +static u_int cmd_source_file_depth; + static enum cmd_retval cmd_source_file_exec(struct cmd *, struct cmdq_item *); const struct cmd_entry cmd_source_file_entry = { @@ -60,6 +63,16 @@ struct cmd_source_file_data { static enum cmd_retval cmd_source_file_complete_cb(struct cmdq_item *item, __unused void *data) { + struct client *c = cmdq_get_client(item); + + if (c == NULL) { + cmd_source_file_depth--; + log_debug("%s: depth now %u", __func__, cmd_source_file_depth); + } else { + c->source_file_depth--; + log_debug("%s: depth now %u", __func__, c->source_file_depth); + } + cfg_print_causes(item); return (CMD_RETURN_NORMAL); } @@ -131,6 +144,7 @@ cmd_source_file_add(struct cmd_source_file_data *cdata, const char *path) path = resolved; log_debug("%s: %s", __func__, path); + cdata->files = xreallocarray(cdata->files, cdata->nfiles + 1, sizeof *cdata->files); cdata->files[cdata->nfiles++] = xstrdup(path); @@ -149,6 +163,22 @@ cmd_source_file_exec(struct cmd *self, struct cmdq_item *item) int result; u_int i, j; + if (c == NULL) { + if (cmd_source_file_depth >= CMD_SOURCE_FILE_DEPTH_LIMIT) { + cmdq_error(item, "too many nested files"); + return (CMD_RETURN_ERROR); + } + cmd_source_file_depth++; + log_debug("%s: depth now %u", __func__, cmd_source_file_depth); + } else { + if (c->source_file_depth >= CMD_SOURCE_FILE_DEPTH_LIMIT) { + cmdq_error(item, "too many nested files"); + return (CMD_RETURN_ERROR); + } + c->source_file_depth++; + log_debug("%s: depth now %u", __func__, c->source_file_depth); + } + cdata = xcalloc(1, sizeof *cdata); cdata->item = item; diff --git a/tmux.h b/tmux.h index bc4df764..7077f9b1 100644 --- a/tmux.h +++ b/tmux.h @@ -2013,6 +2013,7 @@ struct client { struct event overlay_timer; struct client_files files; + u_int source_file_depth; u_int *clipboard_panes; u_int clipboard_npanes;