From: Michael Tremer Date: Mon, 11 Mar 2019 10:34:53 +0000 (+0000) Subject: libpakfire: parser: Return the declarations X-Git-Tag: 0.9.28~1285^2~1079 X-Git-Url: http://git.ipfire.org/?p=pakfire.git;a=commitdiff_plain;h=refs%2Fheads%2Fparser libpakfire: parser: Return the declarations Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index d7836bc8..405cd196 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -359,11 +359,16 @@ static int pakfire_archive_parse_entry_metadata(PakfireArchive archive, } // Parse metadata file - r = pakfire_parser_parse_metadata(archive->pakfire, (const char*)data, data_size); + struct pakfire_parser_declaration** declarations = \ + pakfire_parser_parse_metadata(archive->pakfire, (const char*)data, data_size); pakfire_free(data); - return r; + // Error when nothing was returned + if (!declarations) + return 1; + + return 0; } static int pakfire_archive_parse_entry_filelist(PakfireArchive archive, diff --git a/src/libpakfire/include/pakfire/parser.h b/src/libpakfire/include/pakfire/parser.h index 300c9e68..f08da6b2 100644 --- a/src/libpakfire/include/pakfire/parser.h +++ b/src/libpakfire/include/pakfire/parser.h @@ -30,7 +30,8 @@ struct pakfire_parser_declaration { char* value; }; -int pakfire_parser_parse_metadata(Pakfire pakfire, const char* data, size_t len); +struct pakfire_parser_declaration** pakfire_parser_parse_metadata(Pakfire pakfire, + const char* data, size_t len); #endif /* PAKFIRE_PRIVATE */ diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 5ad92670..d9c4aae9 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -216,7 +216,7 @@ static int pakfire_parser_add_declaration(Pakfire pakfire, return 0; } -int pakfire_parser_parse_metadata(Pakfire pakfire, const char* data, size_t len) { +struct pakfire_parser_declaration** pakfire_parser_parse_metadata(Pakfire pakfire, const char* data, size_t len) { DEBUG(pakfire, "Parsing the following data:\n%s\n", data); num_lines = 1; @@ -229,7 +229,20 @@ int pakfire_parser_parse_metadata(Pakfire pakfire, const char* data, size_t len) int r = yyparse(pakfire, declarations); yy_delete_buffer(buffer); - return r; + // Cleanup declarations in case of an error + if (r) { + for (unsigned int i = 0; i < NUM_DECLARATIONS; i++) { + if (declarations[i]) + pakfire_free(declarations[i]); + } + + pakfire_free(declarations); + + // Return nothing + return NULL; + } + + return declarations; } void yyerror(Pakfire pakfire, struct pakfire_parser_declaration** declarations, const char* s) {