From: Michael Tremer Date: Fri, 31 May 2019 02:46:34 +0000 (+0100) Subject: libpakfire: parser: Leave parser untouched if a file could not be successfully parsed X-Git-Tag: 0.9.28~1285^2~1023 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abb9117f8d7142450f35581bae70906a47e55be7;p=pakfire.git libpakfire: parser: Leave parser untouched if a file could not be successfully parsed Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 21f9acd85..62d1b5a0c 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -273,18 +273,29 @@ static char* pakfire_parser_make_canonical_name(const char* name) { return buffer; } -int pakfire_parser_parse_data(PakfireParser parser, const char* data, size_t len) { +int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len) { Pakfire pakfire = pakfire_parser_get_pakfire(parser); DEBUG(pakfire, "Parsing the following data:\n%s\n", data); + // Create a new sub-parser + PakfireParser parser = pakfire_parser_create(pakfire, parent); + num_lines = 1; YY_BUFFER_STATE buffer = yy_scan_bytes(data, len); int r = yyparse(parser); yy_delete_buffer(buffer); + // If everything was parsed successfully, we merge the sub-parser into + // the parent parser. That way, it will be untouched if something could + // not be successfully parsed. + if (r == 0) { + parent = pakfire_parser_merge(parent, parser); + } + pakfire_unref(pakfire); + pakfire_parser_unref(parser); return r; }