mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2025-01-03 15:41:54 +00:00
Uninitialized filter variables of path/[el]?clist types are now explicitly empty
This commit is contained in:
parent
c6494e45a6
commit
b2ae515cf8
@ -20,6 +20,7 @@ static inline u32 pair_a(u32 p) { return p >> 16; }
|
|||||||
static inline u32 pair_b(u32 p) { return p & 0xFFFF; }
|
static inline u32 pair_b(u32 p) { return p & 0xFFFF; }
|
||||||
|
|
||||||
static struct symbol *this_function;
|
static struct symbol *this_function;
|
||||||
|
static enum f_type this_var_type;
|
||||||
|
|
||||||
static struct f_method_scope {
|
static struct f_method_scope {
|
||||||
struct f_inst *object;
|
struct f_inst *object;
|
||||||
@ -225,34 +226,22 @@ f_new_lc_item(u32 f1, u32 t1, u32 f2, u32 t2, u32 f3, u32 t3)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline struct f_inst *
|
static inline struct f_inst *
|
||||||
f_const_empty(struct f_dynamic_attr dyn)
|
f_const_empty(enum f_type t)
|
||||||
{
|
{
|
||||||
struct f_val empty;
|
switch (t) {
|
||||||
|
case T_PATH:
|
||||||
switch (dyn.type) {
|
case T_CLIST:
|
||||||
case EAF_TYPE_AS_PATH:
|
case T_ECLIST:
|
||||||
case EAF_TYPE_INT_SET:
|
case T_LCLIST:
|
||||||
case EAF_TYPE_EC_SET:
|
return f_new_inst(FI_CONSTANT, (struct f_val) {
|
||||||
case EAF_TYPE_LC_SET:
|
.type = t,
|
||||||
empty = (struct f_val) {
|
|
||||||
.type = dyn.f_type,
|
|
||||||
.val.ad = &null_adata,
|
.val.ad = &null_adata,
|
||||||
};
|
});
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
cf_error("Can't empty that attribute");
|
return f_new_inst(FI_CONSTANT, (struct f_val) {});
|
||||||
}
|
}
|
||||||
|
|
||||||
return f_new_inst(FI_CONSTANT, empty);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define f_dummy_dynattr(_type, _f_type) ((struct f_dynamic_attr) { .type = _type, .f_type = _f_type, })
|
|
||||||
|
|
||||||
#define f_const_empty_path f_const_empty(f_dummy_dynattr(EAF_TYPE_AS_PATH, T_PATH))
|
|
||||||
#define f_const_empty_clist f_const_empty(f_dummy_dynattr(EAF_TYPE_INT_SET, T_CLIST))
|
|
||||||
#define f_const_empty_eclist f_const_empty(f_dummy_dynattr(EAF_TYPE_EC_SET, T_ECLIST))
|
|
||||||
#define f_const_empty_lclist f_const_empty(f_dummy_dynattr(EAF_TYPE_LC_SET, T_LCLIST))
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove all new lines and doubled whitespaces
|
* Remove all new lines and doubled whitespaces
|
||||||
* and convert all tabulators to spaces
|
* and convert all tabulators to spaces
|
||||||
@ -880,7 +869,7 @@ method_term:
|
|||||||
;
|
;
|
||||||
|
|
||||||
method_cmd:
|
method_cmd:
|
||||||
EMPTY { $$ = f_const_empty(FM.object->i_FI_EA_GET.da); }
|
EMPTY { $$ = f_const_empty(FM.object->i_FI_EA_GET.da.f_type); }
|
||||||
| PREPEND '(' term ')' { $$ = f_new_inst(FI_PATH_PREPEND, FM.object, $3 ); }
|
| PREPEND '(' term ')' { $$ = f_new_inst(FI_PATH_PREPEND, FM.object, $3 ); }
|
||||||
| ADD '(' term ')' { $$ = f_new_inst(FI_CLIST_ADD, FM.object, $3 ); }
|
| ADD '(' term ')' { $$ = f_new_inst(FI_CLIST_ADD, FM.object, $3 ); }
|
||||||
| DELETE '(' term ')' { $$ = f_new_inst(FI_CLIST_DEL, FM.object, $3 ); }
|
| DELETE '(' term ')' { $$ = f_new_inst(FI_CLIST_DEL, FM.object, $3 ); }
|
||||||
@ -921,10 +910,10 @@ term:
|
|||||||
$$ = $4;
|
$$ = $4;
|
||||||
}
|
}
|
||||||
|
|
||||||
| '+' EMPTY '+' { $$ = f_const_empty_path; }
|
| '+' EMPTY '+' { $$ = f_const_empty(T_PATH); }
|
||||||
| '-' EMPTY '-' { $$ = f_const_empty_clist; }
|
| '-' EMPTY '-' { $$ = f_const_empty(T_CLIST); }
|
||||||
| '-' '-' EMPTY '-' '-' { $$ = f_const_empty_eclist; }
|
| '-' '-' EMPTY '-' '-' { $$ = f_const_empty(T_ECLIST); }
|
||||||
| '-' '-' '-' EMPTY '-' '-' '-' { $$ = f_const_empty_lclist; }
|
| '-' '-' '-' EMPTY '-' '-' '-' { $$ = f_const_empty(T_LCLIST); }
|
||||||
| PREPEND '(' term ',' term ')' { $$ = f_new_inst(FI_PATH_PREPEND, $3, $5); }
|
| PREPEND '(' term ',' term ')' { $$ = f_new_inst(FI_PATH_PREPEND, $3, $5); }
|
||||||
| ADD '(' term ',' term ')' { $$ = f_new_inst(FI_CLIST_ADD, $3, $5); }
|
| ADD '(' term ',' term ')' { $$ = f_new_inst(FI_CLIST_ADD, $3, $5); }
|
||||||
| DELETE '(' term ',' term ')' { $$ = f_new_inst(FI_CLIST_DEL, $3, $5); }
|
| DELETE '(' term ',' term ')' { $$ = f_new_inst(FI_CLIST_DEL, $3, $5); }
|
||||||
@ -955,14 +944,14 @@ print_list: /* EMPTY */ { $$ = NULL; }
|
|||||||
;
|
;
|
||||||
|
|
||||||
var_init:
|
var_init:
|
||||||
/* empty */ { $$ = f_new_inst(FI_CONSTANT, (struct f_val) { }); }
|
/* empty */ { $$ = f_const_empty(this_var_type); }
|
||||||
| '=' term { $$ = $2; }
|
| '=' term { $$ = $2; }
|
||||||
;
|
;
|
||||||
|
|
||||||
var:
|
var:
|
||||||
type symbol var_init ';' {
|
type symbol { this_var_type = $1; } var_init ';' {
|
||||||
struct symbol *sym = cf_define_symbol(new_config, $2, SYM_VARIABLE | $1, offset, f_new_var(sym_->scope));
|
struct symbol *sym = cf_define_symbol(new_config, $2, SYM_VARIABLE | $1, offset, f_new_var(sym_->scope));
|
||||||
$$ = f_new_inst(FI_VAR_INIT, $3, sym);
|
$$ = f_new_inst(FI_VAR_INIT, $4, sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
for_var:
|
for_var:
|
||||||
|
Loading…
Reference in New Issue
Block a user