summaryrefslogtreecommitdiff
path: root/path.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2008-10-30 18:08:58 -0700
committerJunio C Hamano <gitster@pobox.com>2008-10-30 18:08:58 -0700
commit98b35e2c749614446b916230148d66857e8a09f3 (patch)
tree3cf15ee4e22a7ebf84e92b019a26ef424d540857 /path.c
parent058412d09748c90be996a70729b961adad084175 (diff)
parenta4f34cbb4cea1f0b0e625b528f269f4b517c64f8 (diff)
downloadgit-98b35e2c749614446b916230148d66857e8a09f3.tar.gz
Merge branch 'ar/maint-mksnpath' into ar/mksnpath
* ar/maint-mksnpath: Use git_pathdup instead of xstrdup(git_path(...)) git_pathdup: returns xstrdup-ed copy of the formatted path Fix potentially dangerous use of git_path in ref.c Add git_snpath: a .git path formatting routine with output buffer Conflicts: builtin-revert.c refs.c rerere.c
Diffstat (limited to 'path.c')
-rw-r--r--path.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/path.c b/path.c
index 8b64878c21..092ce57190 100644
--- a/path.c
+++ b/path.c
@@ -47,6 +47,45 @@ char *mksnpath(char *buf, size_t n, const char *fmt, ...)
return cleanup_path(buf);
}
+static char *git_vsnpath(char *buf, size_t n, const char *fmt, va_list args)
+{
+ const char *git_dir = get_git_dir();
+ size_t len;
+
+ len = strlen(git_dir);
+ if (n < len + 1)
+ goto bad;
+ memcpy(buf, git_dir, len);
+ if (len && !is_dir_sep(git_dir[len-1]))
+ buf[len++] = '/';
+ len += vsnprintf(buf + len, n - len, fmt, args);
+ if (len >= n)
+ goto bad;
+ return cleanup_path(buf);
+bad:
+ snprintf(buf, n, bad_path);
+ return buf;
+}
+
+char *git_snpath(char *buf, size_t n, const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ (void)git_vsnpath(buf, n, fmt, args);
+ va_end(args);
+ return buf;
+}
+
+char *git_pathdup(const char *fmt, ...)
+{
+ char path[PATH_MAX];
+ va_list args;
+ va_start(args, fmt);
+ (void)git_vsnpath(path, sizeof(path), fmt, args);
+ va_end(args);
+ return xstrdup(path);
+}
+
char *mkpath(const char *fmt, ...)
{
va_list args;