>> define myvar = false;
>>
>> function something () {
>>     if myvar then {
>>         return false;
>>     }
>>
>>     return true;
>> }
>>
>> protocol device DEVICE {
>>
>> }
>>
>> Could this be because of the new filter code or something else?
> 
> Hello
> 
> Thanks for bugreport. Yes, it is the new filter code, most likely
> it is a bug in handling of statically eliminable (constant-false)
> if statements without else branch.
> 
> Similar issue also happens for empty blocks:
> 
>   if true then { }
> 

What about the attached patch?
Maria
diff --git a/filter/config.Y b/filter/config.Y
index a67a72a8..340053ba 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -446,7 +446,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
 %nonassoc THEN
 %nonassoc ELSE
 
-%type <xp> cmds_int
+%type <xp> cmds_int cmd_prep
 %type <x> term block cmd cmds constant constructor print_list var_list function_call symbol_value bgp_path_expr bgp_path bgp_path_tail
 %type <fda> dynamic_attr
 %type <fsa> static_attr
@@ -624,17 +624,25 @@ cmds: /* EMPTY */ { $$ = NULL; }
  | cmds_int { $$ = $1.begin; }
  ;
 
-cmds_int: cmd {
+cmd_prep: cmd {
   $$.begin = $$.end = $1;
-  while ($$.end->next)
-    $$.end = $$.end->next;
+  if ($1)
+    while ($$.end->next)
+      $$.end = $$.end->next;
+}
+ ;
+
+cmds_int: cmd_prep
+ | cmds_int cmd_prep {
+  if (!$1.begin)
+    $$ = $2;
+  else if (!$2.begin)
+    $$ = $1;
+  else {
+    $$.begin = $1.begin;
+    $$.end = $2.end;
+    $1.end->next = $2.begin;
   }
- | cmds_int cmd {
-  $$.begin = $1.begin;
-  $1.end->next = $2;
-  $$.end = $2;
-  while ($$.end->next)
-    $$.end = $$.end->next;
  }
  ;
 
diff --git a/filter/test.conf b/filter/test.conf
index 09a4a88a..b1342819 100644
--- a/filter/test.conf
+++ b/filter/test.conf
@@ -1178,6 +1178,10 @@ bt_test_suite(t_include, "Testing including another config file");
 function t_if_else()
 int i;
 {
+	/* Empty blocks regression test */
+	if true then {}
+	else {}
+
 	if true then
 		bt_assert(true);
 
@@ -1187,6 +1191,10 @@ int i;
 		bt_assert(true);
 	else
 		bt_assert(false);
+
+	/* Empty blocks regression test */
+	if true then {}
+	else {}
 }
 
 bt_test_suite(t_if_else, "Testing if-else statement");

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

Reply via email to