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 <j...@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

_______________________________________________
CGit mailing list
CGit@lists.zx2c4.com
https://lists.zx2c4.com/mailman/listinfo/cgit

Reply via email to