From 116285f2b000a4b78044f1bcf1eb1d6655f1d2fe Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Fri, 25 Aug 2023 04:32:01 +0200 Subject: [PATCH] RPKI: Fix conflict in config grammar --- conf/confbase.Y | 20 +++++++++++++++++++- proto/rpki/config.Y | 30 ++++++++++++++++-------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/conf/confbase.Y b/conf/confbase.Y index f8d24415..a6b4b1ee 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -121,7 +121,7 @@ CF_DECLS %type symbol %type kw_sym -%type bytestring_text +%type bytestring_text text_or_ipa %type bytestring_expr %nonassoc PREFIX_DUMMY @@ -399,6 +399,24 @@ opttext: | /* empty */ { $$ = NULL; } ; +text_or_ipa: + TEXT { $$.type = T_STRING; $$.val.s = $1; } + | IP4 { $$.type = T_IP; $$.val.ip = ipa_from_ip4($1); } + | IP6 { $$.type = T_IP; $$.val.ip = ipa_from_ip6($1); } + | CF_SYM_KNOWN { + if (($1->class == (SYM_CONSTANT | T_STRING)) || + ($1->class == (SYM_CONSTANT | T_IP))) + $$ = *($1->val); + else + cf_error("String or IP constant expected"); + } + | '(' term ')' { + $$ = cf_eval($2, T_VOID); + if (($$.type != T_BYTESTRING) && ($$.type != T_STRING)) + cf_error("Bytestring or string value expected"); + } + ; + bytestring: BYTETEXT | bytestring_expr { $$ = cf_eval($1, T_BYTESTRING).val.bs; } diff --git a/proto/rpki/config.Y b/proto/rpki/config.Y index d6d326b8..c28cab7a 100644 --- a/proto/rpki/config.Y +++ b/proto/rpki/config.Y @@ -89,20 +89,22 @@ rpki_keep_interval: rpki_proto_item_port: PORT expr { check_u16($2); RPKI_CFG->port = $2; }; -rpki_cache_addr: - text { - rpki_check_unused_hostname(); - RPKI_CFG->hostname = $1; - } - | ipa { - rpki_check_unused_hostname(); - RPKI_CFG->ip = $1; - /* Ensure hostname is filled */ - char *hostname = cfg_allocz(INET6_ADDRSTRLEN + 1); - bsnprintf(hostname, INET6_ADDRSTRLEN+1, "%I", RPKI_CFG->ip); - RPKI_CFG->hostname = hostname; - } - ; +rpki_cache_addr: text_or_ipa +{ + rpki_check_unused_hostname(); + if ($1.type == T_STRING) + RPKI_CFG->hostname = $1.val.s; + else if ($1.type == T_IP) + { + RPKI_CFG->ip = $1.val.ip; + + /* Ensure hostname is filled */ + char *hostname = cfg_allocz(INET6_ADDRSTRLEN + 1); + bsnprintf(hostname, INET6_ADDRSTRLEN+1, "%I", RPKI_CFG->ip); + RPKI_CFG->hostname = hostname; + } + else bug("Bad text_or_ipa"); +}; rpki_transport: TCP rpki_transport_tcp_init