Commit 39706ded by Patrick Steinhardt

config_parse: refactor error handling when parsing multiline variables

The current error handling for the multiline variable parser is a bit
fragile, as each error condition has its own code to clear memory.
Instead, unify error handling as far as possible to avoid this
repetitive code. While at it, make use of `GITERR_CHECK_ALLOC` to
correctly handle OOM situations and verify that the buffer we print into
does not run out of memory either.

(cherry picked from commit bc63e1ef)
parent 68823395
...@@ -315,46 +315,52 @@ done: ...@@ -315,46 +315,52 @@ done:
static int parse_multiline_variable(git_config_parser *reader, git_buf *value, int in_quotes) static int parse_multiline_variable(git_config_parser *reader, git_buf *value, int in_quotes)
{ {
char *line = NULL, *proc_line = NULL;
int quote_count; int quote_count;
bool multiline = true; bool multiline = true;
while (multiline) { while (multiline) {
char *line = NULL, *proc_line = NULL;
int error;
/* Check that the next line exists */ /* Check that the next line exists */
git_parse_advance_line(&reader->ctx); git_parse_advance_line(&reader->ctx);
line = git__strndup(reader->ctx.line, reader->ctx.line_len); line = git__strndup(reader->ctx.line, reader->ctx.line_len);
if (line == NULL) GITERR_CHECK_ALLOC(line);
return -1;
/* We've reached the end of the file, there is no continuation. /*
* We've reached the end of the file, there is no continuation.
* (this is not an error). * (this is not an error).
*/ */
if (line[0] == '\0') { if (line[0] == '\0') {
git__free(line); error = 0;
return 0; goto out;
} }
/* If it was just a comment, pretend it didn't exist */
quote_count = strip_comments(line, !!in_quotes); quote_count = strip_comments(line, !!in_quotes);
if (line[0] == '\0')
goto next;
/* If it was just a comment, pretend it didn't exist */ if ((error = unescape_line(&proc_line, &multiline,
if (line[0] == '\0') { line, in_quotes)) < 0)
git__free(line); goto out;
in_quotes = quote_count;
continue;
}
if (unescape_line(&proc_line, &multiline, line, in_quotes) < 0) { /* Add this line to the multiline var */
git__free(line); if ((error = git_buf_puts(value, proc_line)) < 0)
return -1; goto out;
}
/* add this line to the multiline var */
git_buf_puts(value, proc_line); next:
git__free(line); git__free(line);
git__free(proc_line); git__free(proc_line);
in_quotes = quote_count; in_quotes = quote_count;
continue;
out:
git__free(line);
git__free(proc_line);
return error;
} }
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment