[PATCH 1/2] shared: allocate return value from expand_macros()
John Keeping
john at keeping.me.uk
Sat Jun 16 15:07:28 CEST 2018
In preparation for switching the implementation of expand_macros away
from a static buffer, return an allocated buffer and update all callers
to release it.
Signed-off-by: John Keeping <john at keeping.me.uk>
---
cgit.c | 33 +++++++++++++++++++++++----------
shared.c | 5 ++---
ui-shared.c | 9 ++++++---
3 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/cgit.c b/cgit.c
index bd9cb3f..ca1bc15 100644
--- a/cgit.c
+++ b/cgit.c
@@ -190,7 +190,7 @@ static void config_cb(const char *name, const char *value)
else if (!strcmp(name, "cache-size"))
ctx.cfg.cache_size = atoi(value);
else if (!strcmp(name, "cache-root"))
- ctx.cfg.cache_root = xstrdup(expand_macros(value));
+ ctx.cfg.cache_root = expand_macros(value);
else if (!strcmp(name, "cache-root-ttl"))
ctx.cfg.cache_root_ttl = atoi(value);
else if (!strcmp(name, "cache-repo-ttl"))
@@ -232,16 +232,20 @@ static void config_cb(const char *name, const char *value)
else if (!strcmp(name, "max-commit-count"))
ctx.cfg.max_commit_count = atoi(value);
else if (!strcmp(name, "project-list"))
- ctx.cfg.project_list = xstrdup(expand_macros(value));
- else if (!strcmp(name, "scan-path"))
+ ctx.cfg.project_list = expand_macros(value);
+ else if (!strcmp(name, "scan-path")) {
+ char *expanded = expand_macros(value);
+
if (!ctx.cfg.nocache && ctx.cfg.cache_size)
- process_cached_repolist(expand_macros(value));
+ process_cached_repolist(expanded);
else if (ctx.cfg.project_list)
- scan_projects(expand_macros(value),
+ scan_projects(expanded,
ctx.cfg.project_list, repo_config);
else
- scan_tree(expand_macros(value), repo_config);
- else if (!strcmp(name, "scan-hidden-path"))
+ scan_tree(expanded, repo_config);
+
+ free(expanded);
+ } else if (!strcmp(name, "scan-hidden-path"))
ctx.cfg.scan_hidden_path = atoi(value);
else if (!strcmp(name, "section-from-path"))
ctx.cfg.section_from_path = atoi(value);
@@ -287,8 +291,12 @@ static void config_cb(const char *name, const char *value)
ctx.cfg.branch_sort = 0;
} else if (skip_prefix(name, "mimetype.", &arg))
add_mimetype(arg, value);
- else if (!strcmp(name, "include"))
- parse_configfile(expand_macros(value), config_cb);
+ else if (!strcmp(name, "include")) {
+ char *expanded = expand_macros(value);
+
+ parse_configfile(expanded, config_cb);
+ free(expanded);
+ }
}
static void querystring_cb(const char *name, const char *value)
@@ -1041,6 +1049,7 @@ static int calc_ttl(void)
int cmd_main(int argc, const char **argv)
{
const char *path;
+ char *expanded;
int err, ttl;
cgit_init_filters();
@@ -1052,7 +1061,11 @@ int cmd_main(int argc, const char **argv)
cgit_repolist.repos = NULL;
cgit_parse_args(argc, argv);
- parse_configfile(expand_macros(ctx.env.cgit_config), config_cb);
+
+ expanded = expand_macros(ctx.env.cgit_config);
+ parse_configfile(expanded, config_cb);
+ free(expanded);
+
ctx.repo = NULL;
http_parse_querystring(ctx.qry.raw, querystring_cb);
diff --git a/shared.c b/shared.c
index 21ac8f4..32d0f46 100644
--- a/shared.c
+++ b/shared.c
@@ -489,8 +489,7 @@ static char *expand_macro(char *name, int maxlength)
/* Replace all tokens prefixed by '$' in the specified text with the
* value of the named environment variable.
- * NB: the return value is a static buffer, i.e. it must be strdup'd
- * by the caller.
+ * NB: the return value is allocated, it must be freed by the caller.
*/
char *expand_macros(const char *txt)
{
@@ -530,7 +529,7 @@ char *expand_macros(const char *txt)
p = expand_macro(start, len);
*p = '\0';
}
- return result;
+ return xstrdup(result);
}
char *get_mimetype_for_filename(const char *filename)
diff --git a/ui-shared.c b/ui-shared.c
index 9d8f66b..c48f422 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -838,9 +838,12 @@ static void add_clone_urls(void (*fn)(const char *), char *txt, char *suffix)
void cgit_add_clone_urls(void (*fn)(const char *))
{
- if (ctx.repo->clone_url)
- add_clone_urls(fn, expand_macros(ctx.repo->clone_url), NULL);
- else if (ctx.cfg.clone_prefix)
+ if (ctx.repo->clone_url) {
+ char *expanded = expand_macros(ctx.repo->clone_url);
+
+ add_clone_urls(fn, expanded, NULL);
+ free(expanded);
+ } else if (ctx.cfg.clone_prefix)
add_clone_urls(fn, ctx.cfg.clone_prefix, ctx.repo->url);
}
--
2.17.1
More information about the CGit
mailing list