diff options
author | 2015-02-18 15:32:37 +0000 | |
---|---|---|
committer | 2015-02-18 15:32:37 +0000 | |
commit | 156ea095e4a62ba65f4295245f20a2454b976f15 (patch) | |
tree | 25613bfb57c6b232ff02cf53f6a830396ace0d0b | |
parent | Make sure to replace an existing /usr/include/ssl symlink, otherwise repeated (diff) | |
download | wireguard-openbsd-156ea095e4a62ba65f4295245f20a2454b976f15.tar.xz wireguard-openbsd-156ea095e4a62ba65f4295245f20a2454b976f15.zip |
When given an invalid style, don't set the option to the default. Fix
from J Raynor. Also make style_parse not alter the grid_cell when it
fails.
-rw-r--r-- | usr.bin/tmux/options.c | 20 | ||||
-rw-r--r-- | usr.bin/tmux/style.c | 28 |
2 files changed, 30 insertions, 18 deletions
diff --git a/usr.bin/tmux/options.c b/usr.bin/tmux/options.c index 5562002d490..506a819dfda 100644 --- a/usr.bin/tmux/options.c +++ b/usr.bin/tmux/options.c @@ -1,4 +1,4 @@ -/* $OpenBSD: options.c,v 1.11 2014/10/20 23:57:14 nicm Exp $ */ +/* $OpenBSD: options.c,v 1.12 2015/02/18 15:32:37 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> @@ -167,20 +167,26 @@ options_set_style(struct options *oo, const char *name, const char *value, int append) { struct options_entry *o; + struct grid_cell tmpgc; - if ((o = options_find1(oo, name)) == NULL) { + o = options_find1(oo, name); + if (o == NULL || !append) + memcpy(&tmpgc, &grid_default_cell, sizeof tmpgc); + else + memcpy(&tmpgc, &o->style, sizeof tmpgc); + + if (style_parse(&grid_default_cell, &tmpgc, value) == -1) + return (NULL); + + if (o == NULL) { o = xmalloc(sizeof *o); o->name = xstrdup(name); RB_INSERT(options_tree, &oo->tree, o); } else if (o->type == OPTIONS_STRING) free(o->str); - if (!append) - memcpy(&o->style, &grid_default_cell, sizeof o->style); - o->type = OPTIONS_STYLE; - if (style_parse(&grid_default_cell, &o->style, value) == -1) - return (NULL); + memcpy(&o->style, &tmpgc, sizeof o->style); return (o); } diff --git a/usr.bin/tmux/style.c b/usr.bin/tmux/style.c index ed0f71f298b..ff480674eaf 100644 --- a/usr.bin/tmux/style.c +++ b/usr.bin/tmux/style.c @@ -1,4 +1,4 @@ -/* $OpenBSD: style.c,v 1.4 2014/10/20 23:27:14 nicm Exp $ */ +/* $OpenBSD: style.c,v 1.5 2015/02/18 15:32:37 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -28,16 +28,18 @@ int style_parse(const struct grid_cell *defgc, struct grid_cell *gc, const char *in) { - const char delimiters[] = " ,"; - char tmp[32]; - int val; - size_t end; - u_char fg, bg, attr, flags; + struct grid_cell savedgc; + const char delimiters[] = " ,"; + char tmp[32]; + int val; + size_t end; + u_char fg, bg, attr, flags; if (*in == '\0') return (0); if (strchr(delimiters, in[strlen(in) - 1]) != NULL) return (-1); + memcpy(&savedgc, gc, sizeof savedgc); fg = gc->fg; bg = gc->bg; @@ -46,7 +48,7 @@ style_parse(const struct grid_cell *defgc, struct grid_cell *gc, do { end = strcspn(in, delimiters); if (end > (sizeof tmp) - 1) - return (-1); + goto error; memcpy(tmp, in, end); tmp[end] = '\0'; @@ -59,7 +61,7 @@ style_parse(const struct grid_cell *defgc, struct grid_cell *gc, defgc->flags & (GRID_FLAG_FG256|GRID_FLAG_BG256); } else if (end > 3 && strncasecmp(tmp + 1, "g=", 2) == 0) { if ((val = colour_fromstring(tmp + 3)) == -1) - return (-1); + goto error; if (*in == 'f' || *in == 'F') { if (val != 8) { if (val & 0x100) { @@ -87,16 +89,16 @@ style_parse(const struct grid_cell *defgc, struct grid_cell *gc, flags |= defgc->flags & GRID_FLAG_BG256; } } else - return (-1); + goto error; } else if (strcasecmp(tmp, "none") == 0) attr = 0; else if (end > 2 && strncasecmp(tmp, "no", 2) == 0) { if ((val = attributes_fromstring(tmp + 2)) == -1) - return (-1); + goto error; attr &= ~val; } else { if ((val = attributes_fromstring(tmp)) == -1) - return (-1); + goto error; attr |= val; } @@ -108,6 +110,10 @@ style_parse(const struct grid_cell *defgc, struct grid_cell *gc, gc->flags = flags; return (0); + +error: + memcpy(gc, &savedgc, sizeof *gc); + return (-1); } /* Convert style to a string. */ |