aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/syntax.c
diff options
context:
space:
mode:
authoroni-link <knil.ino@gmail.com>2015-03-12 14:05:16 +0100
committerJustin M. Keyes <justinkz@gmail.com>2015-03-13 17:26:54 -0400
commita916696a130b2bb9517c01f77148dfb77ef304fd (patch)
tree43758e9c3e99a1ad65749be58a2f04f9f14a8fe8 /src/nvim/syntax.c
parentbdbbdb5888e18025b0f95849a88fe6cb53454183 (diff)
downloadrneovim-a916696a130b2bb9517c01f77148dfb77ef304fd.tar.gz
rneovim-a916696a130b2bb9517c01f77148dfb77ef304fd.tar.bz2
rneovim-a916696a130b2bb9517c01f77148dfb77ef304fd.zip
syntax.c: Prevent use after free for variable g:colors_name.
ASan spotted a problem when using 'set background={light,dark}' with color scheme solarized. While loading the colors for color scheme 'g:colors_name', the pointer on the value for this variable can become invalid, because of an 'unlet colors_name' (part of an :highlight clear, syntax.c:6173). To prevent the use of the freed value, decouple the value from 'g:colors_name' before calling load_colors() with it.
Diffstat (limited to 'src/nvim/syntax.c')
-rw-r--r--src/nvim/syntax.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 07f18bf93b..3f9466fd7c 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -5938,15 +5938,22 @@ init_highlight (
int i;
char **pp;
static int had_both = FALSE;
- char_u *p;
/*
* Try finding the color scheme file. Used when a color file was loaded
* and 'background' or 't_Co' is changed.
*/
- p = get_var_value((char_u *)"g:colors_name");
- if (p != NULL && load_colors(p) == OK)
- return;
+ char_u *p = get_var_value((char_u *)"g:colors_name");
+ if (p != NULL) {
+ // Value of g:colors_name could be freed in load_colors() and make
+ // p invalid, so copy it.
+ char_u *copy_p = vim_strsave(p);
+ bool okay = load_colors(copy_p);
+ free(copy_p);
+ if (okay) {
+ return;
+ }
+ }
/*
* Didn't use a color file, use the compiled-in colors.