The name, email and date strings are some times allocated on the heap, but not free'd. Fix this by making sure they are allways heap-allocated, so we can safely free the memory. At the same time, this fixes a problem with strict-POSIX getenv implementations. POSIX says "The return value from getenv() may point to static data which may be overwritten by subsequent calls to getenv()", so duplicating the strings is a potential bug. Signed-off-by: Erik Faye-Lund <kusmabite@xxxxxxxxx> --- This was found when investigating how to fix UTF-8 support in getenv on Windows. I introduced the xgetenv-function (that returns a pointer that can be passed to free) because I suspect we'll find other similar code-paths. builtin/commit.c | 9 ++++++--- git-compat-util.h | 1 + wrapper.c | 6 ++++++ 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/builtin/commit.c b/builtin/commit.c index 03cff5a..e5a649e 100644 --- a/builtin/commit.c +++ b/builtin/commit.c @@ -465,9 +465,9 @@ static void determine_author_info(struct strbuf *author_ident) { char *name, *email, *date; - name = getenv("GIT_AUTHOR_NAME"); - email = getenv("GIT_AUTHOR_EMAIL"); - date = getenv("GIT_AUTHOR_DATE"); + name = xgetenv("GIT_AUTHOR_NAME"); + email = xgetenv("GIT_AUTHOR_EMAIL"); + date = xgetenv("GIT_AUTHOR_DATE"); if (use_message && !renew_authorship) { const char *a, *lb, *rb, *eol; @@ -507,6 +507,9 @@ static void determine_author_info(struct strbuf *author_ident) date = force_date; strbuf_addstr(author_ident, fmt_ident(name, email, date, IDENT_ERROR_ON_NO_NAME)); + free(name); + free(email); + free(date); } static int ends_rfc2822_footer(struct strbuf *sb) diff --git a/git-compat-util.h b/git-compat-util.h index d6d269f..12f111f 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -409,6 +409,7 @@ typedef void (*try_to_free_t)(size_t); extern try_to_free_t set_try_to_free_routine(try_to_free_t); extern char *xstrdup(const char *str); +extern char *xgetenv(const char *name); extern void *xmalloc(size_t size); extern void *xmallocz(size_t size); extern void *xmemdupz(const void *data, size_t len); diff --git a/wrapper.c b/wrapper.c index 8d7dd31..e6173c4 100644 --- a/wrapper.c +++ b/wrapper.c @@ -30,6 +30,12 @@ char *xstrdup(const char *str) return ret; } +char *xgetenv(const char *name) +{ + char *tmp = getenv(name); + return tmp ? xstrdup(tmp) : NULL; +} + void *xmalloc(size_t size) { void *ret = malloc(size); -- 1.7.4.msysgit.0 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html