From: Michael Tremer Date: Mon, 1 Mar 2021 17:08:44 +0000 (+0000) Subject: parser: Have the merge() function return an integer X-Git-Tag: 0.9.28~1285^2~675 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=122e45f5be15b43bc49fbbf85ef5e41cea3bef95;p=pakfire.git parser: Have the merge() function return an integer Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/include/pakfire/parser.h b/src/libpakfire/include/pakfire/parser.h index 7e2ae52a4..732b0c57f 100644 --- a/src/libpakfire/include/pakfire/parser.h +++ b/src/libpakfire/include/pakfire/parser.h @@ -43,7 +43,7 @@ int pakfire_parser_append(PakfireParser parser, char* pakfire_parser_expand(PakfireParser parser, const char* value); char* pakfire_parser_get(PakfireParser parser, const char* name); -PakfireParser pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2); +int pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2); int pakfire_parser_read(PakfireParser parser, FILE* f, struct pakfire_parser_error** error); int pakfire_parser_read_file(PakfireParser parser, const char* path, diff --git a/src/libpakfire/parser.c b/src/libpakfire/parser.c index 570bc879d..e9ee34252 100644 --- a/src/libpakfire/parser.c +++ b/src/libpakfire/parser.c @@ -414,12 +414,12 @@ PAKFIRE_EXPORT char* pakfire_parser_get(PakfireParser parser, const char* name) return pakfire_parser_expand(parser, value); } -PAKFIRE_EXPORT PakfireParser pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2) { +PAKFIRE_EXPORT int pakfire_parser_merge(PakfireParser parser1, PakfireParser parser2) { DEBUG(parser1->pakfire, "Merging parsers %p and %p\n", parser1, parser2); // Do not try to merge a parser with itself if (parser1 == parser2) - return parser1; + return EINVAL; for (unsigned int i = 0; i < parser2->num_declarations; i++) { struct pakfire_parser_declaration* d = parser2->declarations[i]; @@ -428,12 +428,15 @@ PAKFIRE_EXPORT PakfireParser pakfire_parser_merge(PakfireParser parser1, Pakfire char* canonical_name = pakfire_parser_make_canonical_name(parser2, d->name); - pakfire_parser_set_declaration(parser1, canonical_name, d->value); + int r = pakfire_parser_set_declaration(parser1, canonical_name, d->value); free(canonical_name); + + if (r) + return r; } - return parser1; + return 0; } PAKFIRE_EXPORT int pakfire_parser_read(PakfireParser parser, FILE* f, diff --git a/src/libpakfire/parser/grammar.y b/src/libpakfire/parser/grammar.y index 68c52e61a..1274b0751 100644 --- a/src/libpakfire/parser/grammar.y +++ b/src/libpakfire/parser/grammar.y @@ -173,13 +173,19 @@ grammar : %empty } | grammar subparser { - pakfire_parser_merge($1, $2); + int r = pakfire_parser_merge($1, $2); + if (r) + ABORT; + $$ = pakfire_parser_ref($1); } | grammar if_stmt { - if ($2) - pakfire_parser_merge($1, $2); + if ($2) { + int r = pakfire_parser_merge($1, $2); + if (r) + ABORT; + } $$ = pakfire_parser_ref($1); } @@ -337,7 +343,7 @@ int pakfire_parser_parse_data(PakfireParser parent, const char* data, size_t len // 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_parser_merge(parent, parser); } // Destroy the parser