diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-05-25 14:14:30 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-05-25 14:14:35 -0700 |
commit | 0a5aadcce474a139cb9c2014a66299eb759b34c4 (patch) | |
tree | 941089bf65cece7eb74e8dd55be4047bc69d53b7 | |
parent | a3ee722903b0bf9775e0d1fe384dcbd5ef03b0d2 (diff) | |
download | git-0a5aadcce474a139cb9c2014a66299eb759b34c4.tar.gz |
attr.c: plug small leak in parse_attr_line()
If any error is noticed after the match_attr structure is allocated,
we shouldn't just return NULL from this function.
Add a fail_return label that frees the allocated structure and
returns NULL, and consistently jump there when we want to return
NULL after cleaning up.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r-- | attr.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -223,7 +223,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, if (!macro_ok) { fprintf(stderr, "%s not allowed: %s:%d\n", name, src, lineno); - return NULL; + goto fail_return; } is_macro = 1; name += strlen(ATTRIBUTE_MACRO_PREFIX); @@ -233,7 +233,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, fprintf(stderr, "%.*s is not a valid attribute name: %s:%d\n", namelen, name, src, lineno); - return NULL; + goto fail_return; } } else @@ -246,7 +246,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, for (cp = states, num_attr = 0; *cp; num_attr++) { cp = parse_attr(src, lineno, cp, NULL); if (!cp) - return NULL; + goto fail_return; } res = xcalloc(1, @@ -267,7 +267,7 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, if (res->u.pat.flags & EXC_FLAG_NEGATIVE) { warning(_("Negative patterns are ignored in git attributes\n" "Use '\\!' for literal leading exclamation.")); - return NULL; + goto fail_return; } } res->is_macro = is_macro; @@ -283,6 +283,10 @@ static struct match_attr *parse_attr_line(const char *line, const char *src, } return res; + +fail_return: + free(res); + return NULL; } /* |