From 088e96763cf18eecbe378bdbf977bbd5b76a18dd Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 11 Mar 2019 10:34:53 +0000 Subject: [PATCH] libpakfire: parser: Return the declarations Signed-off-by: Michael Tremer --- src/libpakfire/archive.c | 9 +++++++-- src/libpakfire/include/pakfire/parser.h | 3 ++- src/libpakfire/parser/grammar.y | 17 +++++++++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index d7836bc88..405cd1969 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 300c9e682..f08da6b24 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 5ad926707..d9c4aae96 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) { -- 2.39.5