aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/api/win_config.c
diff options
context:
space:
mode:
authornotomo <notomo.motono@gmail.com>2023-12-16 22:58:04 +0900
committerGitHub <noreply@github.com>2023-12-16 21:58:04 +0800
commitc18f3cfcdb8fc5a39b7c898eea619e3de94096b4 (patch)
treebc94fe0afec9c744a628f6899b0a9cb0198dd006 /src/nvim/api/win_config.c
parent574519d9d68f7f28a868e95ef0d081cbae6ddec4 (diff)
downloadrneovim-c18f3cfcdb8fc5a39b7c898eea619e3de94096b4.tar.gz
rneovim-c18f3cfcdb8fc5a39b7c898eea619e3de94096b4.tar.bz2
rneovim-c18f3cfcdb8fc5a39b7c898eea619e3de94096b4.zip
fix(api): crash after nvim_win_set_config title/footer validation error (#26606)
Diffstat (limited to 'src/nvim/api/win_config.c')
-rw-r--r--src/nvim/api/win_config.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/src/nvim/api/win_config.c b/src/nvim/api/win_config.c
index 856fac5585..4ffe3478d7 100644
--- a/src/nvim/api/win_config.c
+++ b/src/nvim/api/win_config.c
@@ -431,18 +431,36 @@ static bool parse_float_bufpos(Array bufpos, lpos_T *out)
static void parse_bordertext(Object bordertext, BorderTextType bordertext_type,
FloatConfig *fconfig, Error *err)
{
+ if (bordertext.type != kObjectTypeString && bordertext.type != kObjectTypeArray) {
+ api_set_error(err, kErrorTypeValidation, "title/footer must be string or array");
+ return;
+ }
+
+ if (bordertext.type == kObjectTypeArray && bordertext.data.array.size == 0) {
+ api_set_error(err, kErrorTypeValidation, "title/footer cannot be an empty array");
+ return;
+ }
+
bool *is_present;
VirtText *chunks;
int *width;
int default_hl_id;
switch (bordertext_type) {
case kBorderTextTitle:
+ if (fconfig->title) {
+ clear_virttext(&fconfig->title_chunks);
+ }
+
is_present = &fconfig->title;
chunks = &fconfig->title_chunks;
width = &fconfig->title_width;
default_hl_id = syn_check_group(S_LEN("FloatTitle"));
break;
case kBorderTextFooter:
+ if (fconfig->footer) {
+ clear_virttext(&fconfig->footer_chunks);
+ }
+
is_present = &fconfig->footer;
chunks = &fconfig->footer_chunks;
width = &fconfig->footer_width;
@@ -462,16 +480,6 @@ static void parse_bordertext(Object bordertext, BorderTextType bordertext_type,
return;
}
- if (bordertext.type != kObjectTypeArray) {
- api_set_error(err, kErrorTypeValidation, "title must be string or array");
- return;
- }
-
- if (bordertext.data.array.size == 0) {
- api_set_error(err, kErrorTypeValidation, "title cannot be an empty array");
- return;
- }
-
*width = 0;
*chunks = parse_virt_text(bordertext.data.array, err, width);
@@ -774,10 +782,6 @@ static bool parse_float_config(Dict(float_config) *config, FloatConfig *fconfig,
return false;
}
- if (fconfig->title) {
- clear_virttext(&fconfig->title_chunks);
- }
-
parse_bordertext(config->title, kBorderTextTitle, fconfig, err);
if (ERROR_SET(err)) {
return false;
@@ -801,10 +805,6 @@ static bool parse_float_config(Dict(float_config) *config, FloatConfig *fconfig,
return false;
}
- if (fconfig->footer) {
- clear_virttext(&fconfig->footer_chunks);
- }
-
parse_bordertext(config->footer, kBorderTextFooter, fconfig, err);
if (ERROR_SET(err)) {
return false;