From 32a81e197bce3b16113c7603a766773c1a5cdcaf Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 25 Apr 2019 18:18:55 +0000 Subject: [PATCH] Make options_tostring allocate its result instead of using a stack buffer (needed for something in the future). --- cmd-show-options.c | 5 +++-- format.c | 27 ++++++++++++--------------- options.c | 39 ++++++++++++++++----------------------- tmux.h | 2 +- 4 files changed, 32 insertions(+), 41 deletions(-) diff --git a/cmd-show-options.c b/cmd-show-options.c index b8b9a9bd..328e9c03 100644 --- a/cmd-show-options.c +++ b/cmd-show-options.c @@ -162,8 +162,8 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item, struct options_entry *o, int idx) { struct options_array_item *a; - const char *name, *value; - char *tmp, *escaped; + const char *name; + char *value, *tmp, *escaped; if (idx != -1) { xasprintf(&tmp, "%s[%d]", options_name(o), idx); @@ -191,6 +191,7 @@ cmd_show_options_print(struct cmd *self, struct cmdq_item *item, free(escaped); } else cmdq_print(item, "%s %s", name, value); + free(value); free(tmp); } diff --git a/format.c b/format.c index e544e6b3..abcdb1d7 100644 --- a/format.c +++ b/format.c @@ -904,9 +904,8 @@ format_find(struct format_tree *ft, const char *key, int modifiers) struct environ_entry *envent; static char s[64]; struct options_entry *o; - const char *found; int idx; - char *copy, *saved; + char *found, *saved; if (~modifiers & FORMAT_TIMESTRING) { o = options_parse_get(global_options, key, &idx, 0); @@ -933,12 +932,11 @@ format_find(struct format_tree *ft, const char *key, int modifiers) return (NULL); ctime_r(&fe->t, s); s[strcspn(s, "\n")] = '\0'; - found = s; + found = xstrdup(s); goto found; } if (fe->t != 0) { - xsnprintf(s, sizeof s, "%lld", (long long)fe->t); - found = s; + xasprintf(&found, "%lld", (long long)fe->t); goto found; } if (fe->value == NULL && fe->cb != NULL) { @@ -946,7 +944,7 @@ format_find(struct format_tree *ft, const char *key, int modifiers) if (fe->value == NULL) fe->value = xstrdup(""); } - found = fe->value; + found = xstrdup(fe->value); goto found; } @@ -957,7 +955,7 @@ format_find(struct format_tree *ft, const char *key, int modifiers) if (envent == NULL) envent = environ_find(global_environ, key); if (envent != NULL) { - found = envent->value; + found = xstrdup(envent->value); goto found; } } @@ -967,23 +965,22 @@ format_find(struct format_tree *ft, const char *key, int modifiers) found: if (found == NULL) return (NULL); - copy = xstrdup(found); if (modifiers & FORMAT_BASENAME) { - saved = copy; - copy = xstrdup(basename(saved)); + saved = found; + found = xstrdup(basename(saved)); free(saved); } if (modifiers & FORMAT_DIRNAME) { - saved = copy; - copy = xstrdup(dirname(saved)); + saved = found; + found = xstrdup(dirname(saved)); free(saved); } if (modifiers & FORMAT_QUOTE) { - saved = copy; - copy = xstrdup(format_quote(saved)); + saved = found; + found = xstrdup(format_quote(saved)); free(saved); } - return (copy); + return (found); } /* Skip until end. */ diff --git a/options.c b/options.c index 0b13bca0..fb271d5e 100644 --- a/options.c +++ b/options.c @@ -110,47 +110,43 @@ options_value_free(struct options_entry *o, union options_value *ov) free(ov->string); } -static const char * +static char * options_value_tostring(struct options_entry *o, union options_value *ov, int numeric) { - static char s[1024]; - const char *tmp; + char *s; if (OPTIONS_IS_STYLE(o)) - return (style_tostring(&ov->style)); + return (xstrdup(style_tostring(&ov->style))); if (OPTIONS_IS_NUMBER(o)) { - tmp = NULL; switch (o->tableentry->type) { case OPTIONS_TABLE_NUMBER: - xsnprintf(s, sizeof s, "%lld", ov->number); + xasprintf(&s, "%lld", ov->number); break; case OPTIONS_TABLE_KEY: - tmp = key_string_lookup_key(ov->number); + s = xstrdup(key_string_lookup_key(ov->number)); break; case OPTIONS_TABLE_COLOUR: - tmp = colour_tostring(ov->number); + s = xstrdup(colour_tostring(ov->number)); break; case OPTIONS_TABLE_FLAG: if (numeric) - xsnprintf(s, sizeof s, "%lld", ov->number); + xasprintf(&s, "%lld", ov->number); else - tmp = (ov->number ? "on" : "off"); + s = xstrdup(ov->number ? "on" : "off"); break; case OPTIONS_TABLE_CHOICE: - tmp = o->tableentry->choices[ov->number]; + s = xstrdup(o->tableentry->choices[ov->number]); break; case OPTIONS_TABLE_STRING: case OPTIONS_TABLE_STYLE: - break; + fatalx("not a number option type"); } - if (tmp != NULL) - xsnprintf(s, sizeof s, "%s", tmp); return (s); } if (OPTIONS_IS_STRING(o)) - return (ov->string); - return (""); + return (xstrdup(ov->string)); + return (xstrdup("")); } struct options * @@ -218,11 +214,8 @@ options_empty(struct options *oo, const struct options_table_entry *oe) o = options_add(oo, oe->name); o->tableentry = oe; - if (oe->flags & OPTIONS_TABLE_IS_ARRAY) { - if (oe->type != OPTIONS_TABLE_STRING) - fatalx("arrays can only be strings"); + if (oe->flags & OPTIONS_TABLE_IS_ARRAY) RB_INIT(&o->value.array); - } return (o); } @@ -443,17 +436,17 @@ options_isstring(struct options_entry *o) return (OPTIONS_IS_STRING(o)); } -const char * +char * options_tostring(struct options_entry *o, int idx, int numeric) { struct options_array_item *a; if (OPTIONS_IS_ARRAY(o)) { if (idx == -1) - return (NULL); + return (xstrdup("")); a = options_array_item(o, idx); if (a == NULL) - return (""); + return (xstrdup("")); return (options_value_tostring(o, &a->value, numeric)); } return (options_value_tostring(o, &o->value, numeric)); diff --git a/tmux.h b/tmux.h index 31514e84..ab8142f7 100644 --- a/tmux.h +++ b/tmux.h @@ -1742,7 +1742,7 @@ u_int options_array_item_index(struct options_array_item *); union options_value *options_array_item_value(struct options_array_item *); int options_isarray(struct options_entry *); int options_isstring(struct options_entry *); -const char *options_tostring(struct options_entry *, int, int); +char *options_tostring(struct options_entry *, int, int); char *options_parse(const char *, int *); struct options_entry *options_parse_get(struct options *, const char *, int *, int);