From 083c43e22efb5353a258827a9e6f2f995cfe822d Mon Sep 17 00:00:00 2001 From: Ondrej Zajicek Date: Thu, 25 Dec 2008 11:55:27 +0100 Subject: [PATCH] fixes some 64-bit related bugs. 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 | 2 +- filter/config.Y | 33 ++++++++++++++------------------- filter/filter.c | 13 ++++++++++--- lib/resource.c | 4 ++-- 4 files changed, 27 insertions(+), 25 deletions(-) diff --git a/conf/conf.h b/conf/conf.h index 5d5e4bc5..17b975b3 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -76,7 +76,7 @@ struct symbol { struct sym_scope *scope; int class; int aux; - void *aux2; + void *aux2; void *def; char name[1]; }; diff --git a/filter/config.Y b/filter/config.Y index d131a25f..67270b33 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -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; } } diff --git a/filter/filter.c b/filter/filter.c index 6288df7f..109c7de4 100644 --- a/filter/filter.c +++ b/filter/filter.c @@ -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); diff --git a/lib/resource.c b/lib/resource.c index 1b915073..9e626815 100644 --- a/lib/resource.c +++ b/lib/resource.c @@ -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);