]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
fixes some 64-bit related bugs.
authorOndrej Zajicek <santiago@crfreenet.org>
Thu, 25 Dec 2008 10:55:27 +0000 (11:55 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 25 Dec 2008 10:55:27 +0000 (11:55 +0100)
Filter code used 'aux' integer field of 'symbol' struct to store ptr
to next symbol and both 'aux2' and 'def' fields for value.
Changed to just 'def' for value and 'aux2' for ptr to next symbol.
Also another minor bugfix.

conf/conf.h
filter/config.Y
filter/filter.c
lib/resource.c

index 5d5e4bc528e8a6a8164b1f0b471a3ee802f66ca1..17b975b3a95766bfc7a234c3285287a3b65d2867 100644 (file)
@@ -76,7 +76,7 @@ struct symbol {
   struct sym_scope *scope;
   int class;
   int aux;
-  void *aux2; 
+  void *aux2;
   void *def;
   char name[1];
 };
index d131a25fee489638ca601b1b84a17e97ee1c62cb..67270b3358f3ac70dad68b022807b63588b653ee 100644 (file)
@@ -79,15 +79,11 @@ type:
 
 one_decl:
    type SYM {
-     $2 = cf_define_symbol($2, SYM_VARIABLE | $1, NULL);
+     struct f_val * val = cfg_alloc(sizeof(struct f_val)); 
+     val->type = $1; 
+     $2 = cf_define_symbol($2, SYM_VARIABLE | $1, val);
      DBG( "New variable %s type %x\n", $2->name, $1 );
-     $2->aux = 0;
-     {
-       struct f_val * val; 
-       val = cfg_alloc(sizeof(struct f_val)); 
-       val->type = $1; 
-       $2->aux2 = val;
-     }
+     $2->aux2 = NULL;
      $$=$2;
    }
  ;
@@ -96,7 +92,7 @@ one_decl:
 decls: /* EMPTY */ { $$ = NULL; }
  | one_decl ';' decls {
      $$ = $1;
-     $$->aux = (int) $3;
+     $$->aux2 = $3;
    }
  ;
 
@@ -104,7 +100,7 @@ decls: /* EMPTY */ { $$ = NULL; }
 declsn: one_decl { $$ = $1; }
  | declsn ';' one_decl {
      $$ = $1;
-     $$->aux = (int) $3;
+     $$->aux2 = $3;
    }
  ;
 
@@ -167,8 +163,7 @@ function_def:
      cf_push_scope($2);
    } function_params function_body {
      $2->def = $5;
-     $2->aux = (int) $4;
-     $2->aux2 = $5;
+     $2->aux2 = $4;
      DBG("Hmm, we've got one function here - %s\n", $2->name); 
      cf_pop_scope();
    }
@@ -313,14 +308,14 @@ function_call:
      $$ = f_new_inst();
      $$->code = P('c','a');
      $$->a1.p = inst;
-     $$->a2.p = $1->aux2;
-     sym = (void *) $1->aux;
+     $$->a2.p = $1->def;
+     sym = $1->aux2;
      while (sym || inst) {
        if (!sym || !inst)
         cf_error("Wrong number of arguments for function %s.", $1->name);
        DBG( "You should pass parameter called %s\n", sym->name);
        inst->a1.p = sym;
-       sym = (void *) sym->aux;
+       sym = sym->aux2;
        inst = inst->next;
      }
    }
@@ -377,7 +372,7 @@ term:
        case SYM_VARIABLE | T_PATH:
        case SYM_VARIABLE | T_CLIST:
         $$->code = 'C';
-        $$->a1.p = $1->aux2;
+        $$->a1.p = $1->def;
         break;
        default:
         cf_error("%s: variable expected.", $1->name );
@@ -420,14 +415,14 @@ term:
      $$ = f_new_inst();
      $$->code = P('c','a');
      $$->a1.p = inst;
-     $$->a2.p = $1->aux2;
-     sym = (void *) $1->aux;
+     $$->a2.p = $1->def;
+     sym = $1->aux2;
      while (sym || inst) {
        if (!sym || !inst)
         cf_error("Wrong number of arguments for function %s.", $1->name);
        DBG( "You should pass parameter called %s\n", sym->name);
        inst->a1.p = sym;
-       sym = (void *) sym->aux;
+       sym = sym->aux2;
        inst = inst->next;
      }
    }
index 6288df7fba082a47abc3b52a4ac5c09c9d774ff6..109c7de4e18d42b885dd09c7a6370cf3c1ed2e61 100644 (file)
@@ -437,16 +437,23 @@ interpret(struct f_inst *what)
     case T_PATH_MASK:
       if (sym->class != (SYM_VARIABLE | v2.type))
        runtime( "Assigning to variable of incompatible type" );
-      * (struct f_val *) sym->aux2 = v2; 
+      * (struct f_val *) sym->def = v2; 
       break;
     default:
       bug( "Set to invalid type" );
     }
     break;
 
-  case 'c':    /* integer (or simple type) constant */
+    /* some constants have value in a2, some in *a1.p, strange. */
+  case 'c':    /* integer (or simple type) constant, or string, or set */
     res.type = what->aux;
-    res.val.i = what->a2.i;
+
+    if (res.type == T_SET)
+      res.val.t = what->a2.p;
+    else if (res.type == T_STRING)
+      res.val.s = what->a2.p;
+    else
+      res.val.i = what->a2.i;
     break;
   case 'C':
     res = * ((struct f_val *) what->a1.p);
index 1b9150734e1e98d1512342cae022e6442f22ba71..9e6268157665c41458119810224bb2c82681b548 100644 (file)
@@ -165,8 +165,8 @@ rdump(void *res)
   char x[16];
   resource *r = res;
 
-  bsprintf(x, "%%%ds%%08x ", indent);
-  debug(x, "", (int) r);
+  bsprintf(x, "%%%ds%%p ", indent);
+  debug(x, "", r);
   if (r)
     {
       debug("%s ", r->class->name);