diff options
| author | schu <schu-github@schulog.org> | 2011-08-17 14:05:41 +0200 |
|---|---|---|
| committer | schu <schu-github@schulog.org> | 2011-08-17 14:36:53 +0200 |
| commit | 5a0659fe3ba020181a07464c4c92b06a5c21b43a (patch) | |
| tree | 09df006bf62db5f535a59513ba7226d5768519bf /src/config_file.c | |
| parent | b6817692a6d1eb617bda96a64c66c8e02988fc12 (diff) | |
| download | libgit2-5a0659fe3ba020181a07464c4c92b06a5c21b43a.tar.gz | |
config_file.c: fix memory leaks
Signed-off-by: schu <schu-github@schulog.org>
Diffstat (limited to 'src/config_file.c')
| -rw-r--r-- | src/config_file.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/config_file.c b/src/config_file.c index 044a24310..837d42dbf 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -212,8 +212,10 @@ static int cvar_normalize_name(cvar_t *var, char **output) /* If there aren't any spaces in the section, it's easy */ if (section_sp == NULL) { ret = snprintf(name, len + 1, "%s.%s", var->section, var->name); - if (ret < 0) + if (ret < 0) { + free(name); return git__throw(GIT_EOSERR, "Failed to normalize name. OS err: %s", strerror(errno)); + } *output = name; return GIT_SUCCESS; @@ -701,12 +703,16 @@ static int parse_section_header(diskfile_backend *cfg, char **section_out) /* find the end of the variable's name */ name_end = strchr(line, ']'); - if (name_end == NULL) + if (name_end == NULL) { + free(line); return git__throw(GIT_EOBJCORRUPTED, "Failed to parse header. Can't find header name end"); + } name = (char *)git__malloc((size_t)(name_end - line) + 1); - if (name == NULL) + if (name == NULL) { + free(line); return GIT_ENOMEM; + } name_length = 0; pos = 0; @@ -738,8 +744,10 @@ static int parse_section_header(diskfile_backend *cfg, char **section_out) } while ((c = line[pos++]) != ']'); - if (line[pos - 1] != ']') - return git__throw(GIT_EOBJCORRUPTED, "Failed to parse header. Config file ended unexpectedly"); + if (line[pos - 1] != ']') { + error = git__throw(GIT_EOBJCORRUPTED, "Failed to parse header. Config file ended unexpectedly"); + goto error; + } name[name_length] = 0; free(line); @@ -957,7 +965,8 @@ static int config_write(diskfile_backend *cfg, cvar_t *var) * default case will take care of updating them. */ pre_end = post_start = cfg->reader.read_ptr; - free(current_section); + if (current_section) + free(current_section); error = parse_section_header(cfg, ¤t_section); if (error < GIT_SUCCESS) break; |
