]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Filter: Don't fail badly when trying to access non-existent route in config time
authorMaria Matejka <mq@ucw.cz>
Mon, 15 Jul 2019 10:03:13 +0000 (12:03 +0200)
committerMaria Matejka <mq@ucw.cz>
Mon, 15 Jul 2019 10:03:13 +0000 (12:03 +0200)
filter/decl.m4
filter/filter.c

index aa4ab5768f47708c507dade598615ab7b88fd774..b1cdaf0df423fb1f53d6fa24aa031c867725382e 100644 (file)
@@ -189,7 +189,7 @@ m4_define(SYMBOL, `FID_MEMBER(struct symbol *, sym, [[strcmp(f1->sym->name, f2->
 m4_define(RTC, `FID_MEMBER(struct rtable_config *, rtc, [[strcmp(f1->rtc->name, f2->rtc->name)]], route table %s, item->rtc->name)')
 m4_define(STATIC_ATTR, `FID_MEMBER(struct f_static_attr, sa, f1->sa.sa_code != f2->sa.sa_code,,)')
 m4_define(DYNAMIC_ATTR, `FID_MEMBER(struct f_dynamic_attr, da, f1->da.ea_code != f2->da.ea_code,,)')
-m4_define(ACCESS_RTE, `NEVER_CONSTANT()')
+m4_define(ACCESS_RTE, `FID_HIC(,[[do { if (!fs->rte) runtime("No route to access"); } while (0)]],NEVER_CONSTANT())')
 
 #      2) Code wrapping
 #      The code produced in 1xx temporary diversions is a raw code without
index beb2457dfd8f7e70166136bf0cd970a2637a3f14..089618f45f1b08b22040f4f65741f46daf907f5d 100644 (file)
@@ -210,7 +210,6 @@ interpret(struct filter_state *fs, const struct f_line *line, struct f_val *val)
 #define falloc(size)  lp_alloc(fs->pool, size)
 #define fpool fs->pool
 
-#define ACCESS_RTE do { if (!fs->rte) runtime("No route to access"); } while (0)
 #define ACCESS_EATTRS do { if (!fs->eattrs) f_cache_eattrs(fs); } while (0)
 
 #include "filter/inst-interpret.c"
@@ -221,7 +220,6 @@ interpret(struct filter_state *fs, const struct f_line *line, struct f_val *val)
 #undef runtime
 #undef falloc
 #undef fpool
-#undef ACCESS_RTE
 #undef ACCESS_EATTRS
       }
     }
@@ -400,7 +398,7 @@ f_eval_int(const struct f_line *expr)
   LOG_BUFFER_INIT(filter_state.buf);
 
   if (interpret(&filter_state, expr, &val) > F_RETURN)
-    cf_error("Runtime error while evaluating expression");
+    cf_error("Runtime error while evaluating expression; see log for details");
 
   if (val.type != T_INT)
     cf_error("Integer expression expected");