diff options
| author | Junio C Hamano <gitster@pobox.com> | 2008-10-30 18:08:58 -0700 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2008-10-30 18:08:58 -0700 |
| commit | 98b35e2c749614446b916230148d66857e8a09f3 (patch) | |
| tree | 3cf15ee4e22a7ebf84e92b019a26ef424d540857 /path.c | |
| parent | 058412d09748c90be996a70729b961adad084175 (diff) | |
| parent | a4f34cbb4cea1f0b0e625b528f269f4b517c64f8 (diff) | |
| download | git-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.c | 39 |
1 files changed, 39 insertions, 0 deletions
@@ -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; |
