diff options
| author | Sergey Poznyakoff <[email protected]> | 2017-11-17 10:46:41 +0200 |
|---|---|---|
| committer | Sergey Poznyakoff <[email protected]> | 2017-11-17 10:46:41 +0200 |
| commit | e92379df658e3b259a0ad2dd1bcdc3fd7e00e5eb (patch) | |
| tree | 364ccf7a23f7345f54e9c82122678735cb573ed8 | |
| parent | d91dd0a1c54ed1d88500d6a33795a77b927d7134 (diff) | |
| download | radius-master.tar.gz | |
* include/radius/radius.h (grad_avl_fprint): Add missing prototype.
* lib/ascend.c (_get_hex_string): Fix boundary violation.
* lib/raddb.c (continuation_line_p)
(grad_read_raddb_file): Fix arguments to get_argcv.
* radiusd/auth.c: Likewise.
* radiusd/log.c (category_set_flag): Cast to int through intptr_t.
* radiusd/rewrite.y: Use union type to handle stack and code segment
data.
* radtest/gram.y: Minor fix.
* scripts/mktypes.c: Minor change.
| -rw-r--r-- | include/radius/radius.h | 6 | ||||
| -rw-r--r-- | lib/ascend.c | 5 | ||||
| -rw-r--r-- | lib/raddb.c | 7 | ||||
| -rw-r--r-- | radiusd/auth.c | 5 | ||||
| -rw-r--r-- | radiusd/log.c | 7 | ||||
| -rw-r--r-- | radiusd/rewrite.y | 631 | ||||
| -rw-r--r-- | radtest/gram.y | 9 | ||||
| -rw-r--r-- | scripts/mktypes.c | 4 |
8 files changed, 371 insertions, 303 deletions
diff --git a/include/radius/radius.h b/include/radius/radius.h index 0937c981..f96c065f 100644 --- a/include/radius/radius.h +++ b/include/radius/radius.h @@ -1,6 +1,5 @@ /* This file is part of GNU Radius. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2010, 2013 Free Software Foundation, Inc. + Copyright (C) 2000-2017 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -26,6 +25,7 @@ #include <radius/mem.h> #include <radius/dictionary.h> #include <stdarg.h> +#include <stdio.h> #ifdef HAVE_SYS_TIME_H # include <sys/time.h> @@ -393,6 +393,8 @@ int grad_avp_cmp(grad_avp_t *a, grad_avp_t *b); int grad_avl_cmp(grad_avp_t *a, grad_avp_t *b, int prop); int grad_avp_null_string_p(grad_avp_t *pair); +void grad_avl_fprint(FILE *fp, char *prefix, int typeflag, grad_avp_t *avl); + extern int grad_resolve_hostnames; char *grad_ip_gethostname (grad_uint32_t, char *buf, size_t size); diff --git a/lib/ascend.c b/lib/ascend.c index 8839ab41..d50458f0 100644 --- a/lib/ascend.c +++ b/lib/ascend.c @@ -1,6 +1,5 @@ /* This file is part of GNU Radius. - Copyright (C) 2002, 2003, 2004, 2005, 2007, 2010, 2013 Free Software - Foundation, Inc. + Copyright (C) 2002-2017 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -258,7 +257,7 @@ _get_hex_string(struct ascend_parse_buf *pb, u_char *buf) } } - for (i = 0; i < 2*ASCEND_MAX_CMP_LENGTH; i++) + for (i = 0; i < ASCEND_MAX_CMP_LENGTH; i += 2) *buf++ = (tmp[i] << 4) | tmp[i+1]; return rc; } diff --git a/lib/raddb.c b/lib/raddb.c index eff6a28f..5ecf975b 100644 --- a/lib/raddb.c +++ b/lib/raddb.c @@ -1,6 +1,5 @@ /* This file is part of GNU Radius. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010, - 2013 Free Software Foundation, Inc. + Copyright (C) 2000-2017 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -49,7 +48,7 @@ get_argcv(const char *str, const char *delim, size_t *pargc, char ***pargv) static int continuation_line_p(const char *str, const char *delim) { - int argc; + size_t argc; char **argv; int rc = get_argcv(str, delim, &argc, &argv) == 0 && argc > 0 @@ -62,7 +61,7 @@ int grad_read_raddb_file(char *filename, int vital, char *delim, int (*fun)(), void *closure) { - int argc; + size_t argc; char **argv; grad_locus_t loc; int fd; diff --git a/radiusd/auth.c b/radiusd/auth.c index c75a5ac9..2c70579c 100644 --- a/radiusd/auth.c +++ b/radiusd/auth.c @@ -1,6 +1,5 @@ /* This file is part of GNU Radius - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008, 2010, - 2013 Free Software Foundation, Inc. + Copyright (C) 2000-2017 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -1060,7 +1059,7 @@ sfn_simuse(AUTH_MACH *m) { char name[GRAD_STRING_LENGTH]; int rc; - int count; + size_t count; strip_username(strip_names, m->namepair->avp_strvalue, m->user_check, name); diff --git a/radiusd/log.c b/radiusd/log.c index 0b8a68db..b70437ef 100644 --- a/radiusd/log.c +++ b/radiusd/log.c @@ -1,6 +1,5 @@ /* This file is part of GNU Radius. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2010, - 2013 Free Software Foundation, Inc. + Copyright (C) 2000-2017 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -967,7 +966,7 @@ static int category_set_flag(int argc, cfg_value_t *argv, void *block_data, void *handler_data) { - int flag = (int) handler_data; + int flag = (int) (intptr_t) handler_data; if (argc != 2) { cfg_argc_error(argc < 2); return 0; @@ -1103,7 +1102,7 @@ static int channel_set_flag(int argc, cfg_value_t *argv, void *block_data, void *handler_data) { - int flag = (int) handler_data; + int flag = (int) (intptr_t) handler_data; if (argc != 2) { cfg_argc_error(argc < 2); return 0; diff --git a/radiusd/rewrite.y b/radiusd/rewrite.y index 7b7f6a6e..fe693557 100644 --- a/radiusd/rewrite.y +++ b/radiusd/rewrite.y @@ -1,7 +1,6 @@ %{ /* This file is part of GNU Radius. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, - 2010, 2013 Free Software Foundation, Inc. + Copyright (C) 2000-2017 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -35,7 +34,6 @@ # include <radius/radscm.h> #endif -typedef long RWSTYPE; #define RW_MIN(a,b) ((a)<(b)) ? (a) : (b) /* @@ -77,6 +75,31 @@ typedef struct { typedef int stkoff_t; /* Offset on stack */ typedef unsigned int pctr_t; /* Program counter */ +typedef void (*INSTR)(); /* program instruction */ + +typedef union rw_code_cell { + void *v_ptr; + char *v_str; + int v_int; + long v_long; + u_int v_u_int; + stkoff_t v_off; + pctr_t v_pc; + struct comp_regex *v_rx; + size_t v_size; +} RWSTYPE; + +#define rw_cat(a,b) a ## b +#define rw_c_val(x,t) ((x).rw_cat(v_,t)) +#define rw_c_cast(x,t) ((RWSTYPE)(t)(x)) + +typedef union { + INSTR c_instr; + RWSTYPE c_value; +} RWCODE; + +#define rw_code_instr(p) ((p).c_instr) +#define rw_code_value(p) ((p).c_value) #define RW_REG ('z'-'a'+1) @@ -100,8 +123,6 @@ typedef struct { jmp_buf jmp; } RWMACH; -typedef void (*INSTR)(); /* program instruction */ - /* Compiled regular expression */ typedef struct comp_regex COMP_REGEX; @@ -639,8 +660,7 @@ static void code_check(); /* * Auxiliary and debugging functions */ -static void debug_dump_code(); -static const char * datatype_str_nom(grad_data_type_t type); +/*static const char * datatype_str_nom(grad_data_type_t type);*/ static const char * datatype_str_acc(grad_data_type_t type); static const char * datatype_str_abl(grad_data_type_t type); static grad_data_type_t attr_datatype(grad_dict_attr_t *); @@ -1894,19 +1914,19 @@ yylex() return c; } - if (var = var_lookup(yylval.string)) { + if ((var = var_lookup(yylval.string))) { DEBUG_LEX2("VARIABLE: %s", yylval.string); yylval.var = var; return VARIABLE; } - if (fun = (FUNCTION*) grad_sym_lookup(rewrite_tab, yylval.string)) { + if ((fun = (FUNCTION*) grad_sym_lookup(rewrite_tab, yylval.string))) { DEBUG_LEX2("FUN %s", yylval.string); yylval.fun = fun; return FUN; } - if (btin = builtin_lookup(yylval.string)) { + if ((btin = builtin_lookup(yylval.string))) { DEBUG_LEX2("BUILTIN %s", yylval.string); yylval.btin = btin; return BUILTIN; @@ -2056,7 +2076,7 @@ _list_insert(RWLIST **first, RWLIST **last, RWLIST *prev, RWLIST *obj, obj->prev = prev; obj->next = prev->next; - if (next = prev->next) + if ((next = prev->next)) next->prev = obj; prev->next = obj; @@ -2072,12 +2092,12 @@ _list_remove(RWLIST **first, RWLIST **last, RWLIST *obj) { RWLIST *temp; - if (temp = obj->prev) + if ((temp = obj->prev) ) temp->next = obj->next; else *first = obj->next; - if (temp = obj->next) + if ((temp = obj->next)) temp->prev = obj->prev; else if (last) *last = obj->prev; @@ -2332,7 +2352,7 @@ mtx_insert(MTX *prev, MTX *mtx) MTX *up; rw_list_insert(&mtx_first, &mtx_last, prev, mtx, 0); - if (up = prev->gen.uplink) { + if ((up = prev->gen.uplink)) { switch (up->gen.type) { case Unary: up->un.arg = mtx; @@ -2762,7 +2782,7 @@ mtx_builtin(builtin_t *bin, MTX *args) BTIN_MTX *call; int argn; char *parmp; - grad_data_type_t type; + grad_data_type_t type = Integer; /* * Test the number and types of arguments. Insert reasonable * typecasts. @@ -2821,7 +2841,7 @@ mtx_builtin(builtin_t *bin, MTX *args) /* **************************************************************************** * Code optimizer (rudimentary) */ - +#if 0 const char * datatype_str_nom(grad_data_type_t type) { @@ -2836,6 +2856,7 @@ datatype_str_nom(grad_data_type_t type) return _("UNKNOWN"); } } +#endif const char * datatype_str_abl(grad_data_type_t type) @@ -3493,7 +3514,7 @@ optimize() */ -static INSTR *rw_code; /* Code segment */ +static RWCODE *rw_code; /* Code segment */ static pctr_t rw_pc; /* PC when compiling the code */ static size_t rw_codesize; /* Length of code segment */ @@ -3511,7 +3532,7 @@ code_init() { code_check(); /* code cell #0 is the default return address */ - rw_code[0] = 0; + rw_c_val(rw_code_value(rw_code[0]),pc) = 0; rw_pc = 1; } @@ -3532,7 +3553,7 @@ debug_dump_code() do { fprintf(fp, "%4d:", pc); for (i = 0; i < 8 && pc < rw_codesize; i++, pc++) - fprintf(fp, " %8x", (u_int) rw_code[pc]); + fprintf(fp, " %8x", rw_c_val(rw_code[pc], uint)); fprintf(fp, "\n"); } while (pc < rw_codesize); @@ -3542,14 +3563,17 @@ debug_dump_code() /* * Runtime function prototypes */ -static int pushn(RWSTYPE n); +static void pushn(RWSTYPE n); static int cpopn(RWSTYPE *np); static RWSTYPE popn(); static void checkpop(int cnt); static void pushref(char *str, int from, int to); static RWSTYPE *heap_reserve(int size); static void pushs(RWSTYPE *sptr, size_t size, int len); -static void pushstr(const char *str, int len); +static void pushstr(const char *str, size_t len); + +static void pushint(int); +static int popint(void); static void rw_pushn(); static void rw_pushs(); @@ -3656,9 +3680,12 @@ INSTR coerce_tab[Max_datatype][Max_datatype] = { }; static void check_codesize(int delta); -static int code(INSTR instr); -static int data(int val); -static int data_str(char *ptr); +static pctr_t code_cell(RWCODE cell); +static pctr_t code_cell(RWCODE cell); +static pctr_t code_instr(INSTR instr); +static pctr_t code_value(RWSTYPE val); +static pctr_t data(int val); +static pctr_t data_str(char *ptr); static void add_target(NOP_MTX *mtx, pctr_t pc); @@ -3677,7 +3704,7 @@ fixup_target(NOP_MTX *mtx, pctr_t pc) TGT_MTX *tgt; for (tgt = (TGT_MTX*)mtx->tgt; tgt; tgt = (TGT_MTX*)tgt->next) - rw_code[tgt->pc] = (INSTR)pc; + rw_c_val(rw_code_value(rw_code[tgt->pc]), pc) = pc; mtx->tgt = NULL; } @@ -3704,21 +3731,21 @@ codegen() case Stop: break; case Enter: - code(rw_enter); + code_instr(rw_enter); data(mtx->frame.stacksize); break; case Leave: - code(rw_leave); + code_instr(rw_leave); break; case Constant: switch (mtx->cnst.datatype) { case Integer: - code(rw_pushn); + code_instr(rw_pushn); data(mtx->cnst.datum.ival); break; case String: - code(rw_pushs); + code_instr(rw_pushs); data_str(mtx->cnst.datum.sval.data); break; @@ -3727,23 +3754,23 @@ codegen() } break; case Matchref: - code(rw_pushref); + code_instr(rw_pushref); data(mtx->ref.num); break; case Variable: /* Variable dereference. */ - code(rw_pushv); + code_instr(rw_pushv); data(mtx->var.var->offset); break; case Unary: switch (mtx->un.opcode) { case Not: - code(rw_not); + code_instr(rw_not); break; case Neg: - code(rw_neg); + code_instr(rw_neg); break; default: @@ -3752,90 +3779,90 @@ codegen() break; case Binary: if (mtx->bin.arg[0]->gen.datatype == String) - code(bin_string_codetab[mtx->bin.opcode]); + code_instr(bin_string_codetab[mtx->bin.opcode]); else - code(bin_codetab[mtx->bin.opcode]); + code_instr(bin_codetab[mtx->bin.opcode]); break; case Cond: /*FIXME: this needs optimization */ - code(rw_jne); + code_instr(rw_jne); add_target(&mtx->cond.if_true->nop, rw_pc); - code(NULL); + code_instr(NULL); if (mtx->cond.if_false) { - code(rw_jmp); + code_instr(rw_jmp); add_target(&mtx->cond.if_false->nop, rw_pc); - code(NULL); + code_instr(NULL); } break; case Asgn: - code(rw_asgn); + code_instr(rw_asgn); data(mtx->asgn.lval->offset); break; case Match: - code(rw_match); - code((INSTR)mtx->match.rx); + code_instr(rw_match); + code_value((RWSTYPE)mtx->match.rx); if (mtx->match.negated) - code(rw_not); + code_instr(rw_not); break; case Coercion: - code(coerce_tab[mtx->coerce.arg->gen.datatype][mtx->coerce.datatype]); + code_instr(coerce_tab[mtx->coerce.arg->gen.datatype][mtx->coerce.datatype]); break; case Jump: - code(rw_jmp); + code_instr(rw_jmp); add_target(&mtx->jump.dest->nop, rw_pc); - code(NULL); + code_instr(NULL); break; case Branch: - code(mtx->branch.cond ? rw_jne : rw_je); + code_instr(mtx->branch.cond ? rw_jne : rw_je); add_target(&mtx->branch.dest->nop, rw_pc); - code(NULL); + code_instr(NULL); break; case Call: - code(rw_call); - code((INSTR) mtx->call.fun->entry); - code(rw_adjstk); + code_instr(rw_call); + code_value((RWSTYPE) mtx->call.fun->entry); + code_instr(rw_adjstk); data(mtx->call.nargs); break; case Builtin: - code(rw_builtin); - code(mtx->btin.fun); - code(rw_adjstk); + code_instr(rw_builtin); + code_instr(mtx->btin.fun); + code_instr(rw_adjstk); data(mtx->btin.nargs); break; case Pop: - code(rw_popn); + code_instr(rw_popn); break; case Popa: - code(rw_popa); + code_instr(rw_popa); break; case Pusha: - code(rw_pusha); + code_instr(rw_pusha); break; case Attr: switch (mtx->attr.datatype) { case Integer: if (mtx->attr.index) - code(rw_attrn); + code_instr(rw_attrn); else - code(rw_attrn0); + code_instr(rw_attrn0); break; case String: if (mtx->attr.index) - code(rw_attrs); + code_instr(rw_attrs); else - code(rw_attrs0); + code_instr(rw_attrs0); break; default: @@ -3846,25 +3873,25 @@ codegen() case Attr_check: if (mtx->attr.index) - code(rw_attrcheck); + code_instr(rw_attrcheck); else - code(rw_attrcheck0); + code_instr(rw_attrcheck0); data(mtx->attr.attrno); break; case Attr_asgn: if (mtx->attr.index) - code(rw_attrasgn); + code_instr(rw_attrasgn); else - code(rw_attrasgn0); + code_instr(rw_attrasgn0); data(mtx->attr.attrno); break; case Attr_delete: if (mtx->attr.index) - code(rw_attr_delete); + code_instr(rw_attr_delete); else - code(rw_attr_delete0); + code_instr(rw_attr_delete0); data(mtx->attr.attrno); break; } @@ -3893,7 +3920,7 @@ void check_codesize(int delta) { if (rw_pc + delta >= rw_codesize) { - INSTR *p = grad_emalloc((rw_codesize + 4096) * sizeof(rw_code[0])); + RWCODE *p = grad_emalloc((rw_codesize + 4096) * sizeof(rw_code[0])); memcpy(p, rw_code, rw_codesize * sizeof(rw_code[0])); grad_free(rw_code); rw_code = p; @@ -3901,28 +3928,45 @@ check_codesize(int delta) } } -int -code(INSTR instr) +pctr_t +code_cell(RWCODE cell) { check_codesize(1); - rw_code[rw_pc] = instr; + rw_code[rw_pc] = cell; return rw_pc++; } -int +pctr_t +code_instr(INSTR instr) +{ + RWCODE c; + rw_code_instr(c) = instr; + return code_cell(c); +} + +pctr_t +code_value(RWSTYPE val) +{ + RWCODE c; + rw_code_value(c) = val; + return code_cell(c); +} + +pctr_t data(int val) { - return code((INSTR)(RWSTYPE)val); + return code_value((RWSTYPE)val); } -int +pctr_t data_str(char *ptr) { int len = strlen(ptr) + 1; - RWSTYPE delta = (len + sizeof(rw_code[0])) / sizeof(rw_code[0]); + u_int delta = (len + sizeof(rw_code[0])) / sizeof(rw_code[0]); check_codesize(delta+1); - rw_code[rw_pc++] = (INSTR)delta; + rw_c_val(rw_code_value(rw_code[rw_pc]), u_int) = delta; + rw_pc++; memcpy(rw_code + rw_pc, ptr, len); rw_pc += delta; return rw_pc; @@ -4012,7 +4056,7 @@ function_cleanup() /* * Push a number on stack */ -int +void pushn(RWSTYPE n) { if (mach.st >= mach.ht) { @@ -4021,7 +4065,6 @@ pushn(RWSTYPE n) rw_error(_("out of pushdown space")); } mach.stack[mach.st++] = n; - return 0; } /* @@ -4038,19 +4081,19 @@ pushs(RWSTYPE *sptr, size_t size, int len) while (len) mach.stack[mach.ht--] = sptr[--len]; - mach.stack[mach.ht--] = size; - pushn((RWSTYPE) (mach.stack + mach.ht + 1)); + rw_c_val(mach.stack[mach.ht--], size) = size; + pushn(rw_c_cast(mach.stack + mach.ht + 1, void*)); } void -pushstr(const char *str, int len) +pushstr(const char *str, size_t len) { RWSTYPE *p = heap_reserve(sizeof(RWSTYPE) + len + 1); char *s = (char*)(p + 1); memcpy(s, str, len); s[len] = 0; - p[0] = len; - pushn((RWSTYPE)p); + rw_c_val(p[0], size) = len; + pushn(rw_c_cast(p,void*)); } #define B2RW(s) (s + sizeof(mach.stack[0]) - 1) / sizeof(mach.stack[0]) @@ -4105,7 +4148,7 @@ temp_space_fix(char *end) len = B2RW(size); mach.ht -= len; memmove(mach.stack + mach.ht, base, size); - mach.stack[--mach.ht] = strlen(base); + rw_c_val(mach.stack[--mach.ht], size) = strlen(base); return mach.stack + mach.ht--; } @@ -4136,14 +4179,15 @@ popn() void mem2string(grad_string_t *p, RWSTYPE *loc) { - p->size = loc[0]; - p->data = (unsigned char*) (loc + 1); + p->size = rw_c_val(loc[0], size); + p->data = (char*) (loc + 1); } void poparr(grad_string_t *p) { - mem2string(p, (RWSTYPE*) popn()); + RWSTYPE v = popn(); + mem2string(p, (RWSTYPE*) rw_c_val(v, ptr)); } RWSTYPE @@ -4174,13 +4218,26 @@ pushref(char *str, int from, int to) pushstr(str + from, to - from); } +static void +pushint(int v) +{ + pushn((RWSTYPE)v); +} + +static int +popint(void) +{ + RWSTYPE t = popn(); + return rw_c_val(t, int); +} + /* * Create a stack frame and enter the function */ void enter(int n) { - pushn(mach.sb); + pushn((RWSTYPE)mach.sb); mach.sb = mach.st; mach.st += n; } @@ -4195,8 +4252,8 @@ leave() mach.rA = popn(); /* Restore stack frame */ mach.st = mach.sb; - mach.sb = popn(); - mach.pc = (pctr_t) popn(); + mach.sb = rw_c_val(popn(), int); + mach.pc = rw_c_val(popn(), pc); } RWSTYPE @@ -4234,15 +4291,16 @@ rw_error_free(char *msg) void rw_call() { - pctr_t pc = (pctr_t) rw_code[mach.pc++]; - pushn(mach.pc); /* save return address */ + pctr_t pc = rw_c_val(rw_code_value(rw_code[mach.pc]), pc); + pushn((RWSTYPE)(mach.pc + 1)); /* save return address */ mach.pc = pc; } void rw_adjstk() { - int delta = (int) rw_code[mach.pc++]; + u_int delta = rw_c_val(rw_code_value(rw_code[mach.pc]), u_int); + mach.pc++; mach.st -= delta; pushn(mach.rA); /* Push the return back on stack */ } @@ -4251,7 +4309,7 @@ void rw_enter() { /*FIXME: runtime checking */ - int n = (int) rw_code[mach.pc++]; + int n = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); enter(n); } @@ -4267,7 +4325,7 @@ rw_leave() void rw_pushn() { - RWSTYPE n = (RWSTYPE) rw_code[mach.pc++]; + RWSTYPE n = rw_code_value(rw_code[mach.pc++]); pushn(n); } @@ -4277,8 +4335,8 @@ rw_pushn() void rw_pushref() { - int i = (int) rw_code[mach.pc++]; - + int i = rw_c_val(rw_code_value(rw_code[mach.pc]), int); + mach.pc++; pushref(mach.sA, mach.pmatch[i].rm_so, mach.pmatch[i].rm_eo); } @@ -4288,15 +4346,15 @@ rw_pushref() void rw_pushv() { - stkoff_t n = (stkoff_t) rw_code[mach.pc++]; - + stkoff_t n = rw_c_val(rw_code_value(rw_code[mach.pc]), off); + mach.pc++; pushn(mach.stack[mach.sb + n]); } void rw_pushs() { - int len = (int) rw_code[mach.pc++]; + int len = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); RWSTYPE *sptr = (RWSTYPE*) (rw_code + mach.pc); mach.pc += len; @@ -4309,7 +4367,7 @@ rw_pushs() void rw_asgn() { - stkoff_t off = (stkoff_t) rw_code[mach.pc++]; + stkoff_t off = rw_c_val(rw_code_value(rw_code[mach.pc++]), off); RWSTYPE n; cpopn(&n); @@ -4330,19 +4388,21 @@ assert_request_presence() void rw_attrcheck0() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); - pushn(grad_avl_find(AVPLIST(&mach), attr) != NULL); + pushn(rw_c_cast(grad_avl_find(AVPLIST(&mach), attr) != NULL, int)); } void rw_attrcheck() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); RWSTYPE index; - + int res; + cpopn(&index); - pushn(grad_avl_find_n(AVPLIST(&mach), attr, index) != NULL); + res = grad_avl_find_n(AVPLIST(&mach), attr, rw_c_val(index, int)) != NULL; + pushn((RWSTYPE)res); } /* @@ -4364,7 +4424,7 @@ attrasgn_internal(int attr, grad_avp_t *pair, RWSTYPE val) switch (pair->type) { case GRAD_TYPE_STRING: case GRAD_TYPE_DATE: - mem2string(&str, (RWSTYPE*)val); + mem2string(&str, (RWSTYPE*)rw_c_val(val, ptr)); grad_free(pair->avp_strvalue); pair->avp_strvalue = grad_malloc(str.size+1); memcpy(pair->avp_strvalue, str.data, str.size); @@ -4374,7 +4434,7 @@ attrasgn_internal(int attr, grad_avp_t *pair, RWSTYPE val) case GRAD_TYPE_INTEGER: case GRAD_TYPE_IPADDR: - pair->avp_lvalue = val; + pair->avp_lvalue = rw_c_val(val, u_int); break; } @@ -4384,7 +4444,7 @@ attrasgn_internal(int attr, grad_avp_t *pair, RWSTYPE val) void rw_attrasgn0() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); RWSTYPE val; cpopn(&val); @@ -4394,20 +4454,22 @@ rw_attrasgn0() void rw_attrasgn() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); RWSTYPE val; RWSTYPE index; cpopn(&val); cpopn(&index); - attrasgn_internal(attr, grad_avl_find_n(AVPLIST(&mach), attr, index), + attrasgn_internal(attr, + grad_avl_find_n(AVPLIST(&mach), attr, + rw_c_val(index, int)), val); } void rw_attrs0() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); grad_avp_t *pair; if ((pair = grad_avl_find(AVPLIST(&mach), attr)) == NULL) @@ -4425,24 +4487,25 @@ rw_attrs0() void rw_attrn0() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); grad_avp_t *pair; if ((pair = grad_avl_find(AVPLIST(&mach), attr)) == NULL) - pushn(0); + pushn(rw_c_cast(0, int)); else - pushn(pair->avp_lvalue); + pushn(rw_c_cast(pair->avp_lvalue, u_int)); } void rw_attrs() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); grad_avp_t *pair; RWSTYPE index; cpopn(&index); - if ((pair = grad_avl_find_n(AVPLIST(&mach), attr, index)) == NULL) + pair = grad_avl_find_n(AVPLIST(&mach), attr, rw_c_val(index, int)); + if (pair == NULL) pushstr("", 0); else pushstr(pair->avp_strvalue, pair->avp_strlength); @@ -4451,33 +4514,34 @@ rw_attrs() void rw_attrn() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); grad_avp_t *pair; RWSTYPE index; cpopn(&index); - if ((pair = grad_avl_find_n(AVPLIST(&mach), attr, index)) == NULL) - pushn(0); + pair = grad_avl_find_n(AVPLIST(&mach), attr, rw_c_val(index, int)); + if (pair == NULL) + pushn(rw_c_cast(0, int)); else - pushn(pair->avp_lvalue); + pushn(rw_c_cast(pair->avp_lvalue, u_int)); } void rw_attr_delete0() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); grad_avl_delete(&mach.req->avlist, attr); } void rw_attr_delete() { - int attr = (int) rw_code[mach.pc++]; + int attr = rw_c_val(rw_code_value(rw_code[mach.pc++]), int); RWSTYPE index; assert_request_presence(); cpopn(&index); - grad_avl_delete_n(&mach.req->avlist, attr, index); + grad_avl_delete_n(&mach.req->avlist, attr, rw_c_val(index, int)); } /* @@ -4528,8 +4592,8 @@ rw_adds() memcpy(s, s2.data, s2.size); s += s2.size; *s = 0; - p[0] = s1.size + s2.size; - pushn((RWSTYPE)p); + rw_c_val(p[0], size) = s1.size + s2.size; + pushn(rw_c_cast(p, void*)); } /* @@ -4539,7 +4603,7 @@ void rw_neg() { checkpop(1); - pushn(-popn()); + pushint(-popint()); } /* @@ -4551,9 +4615,9 @@ rw_b_and() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 & n2); + n2 = popint(); + n1 = popint(); + pushint(n1 & n2); } void @@ -4562,9 +4626,9 @@ rw_b_or() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 | n2); + n2 = popint(); + n1 = popint(); + pushint(n1 | n2); } void @@ -4573,9 +4637,9 @@ rw_b_xor() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 ^ n2); + n2 = popint(); + n1 = popint(); + pushint(n1 ^ n2); } void @@ -4584,9 +4648,9 @@ rw_shl() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 << n2); + n2 = popint(); + n1 = popint(); + pushint(n1 << n2); } void @@ -4595,9 +4659,9 @@ rw_shr() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 >> n2); + n2 = popint(); + n1 = popint(); + pushint(n1 >> n2); } /* @@ -4609,9 +4673,9 @@ rw_add() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1+n2); + n2 = popint(); + n1 = popint(); + pushint(n1+n2); } /* @@ -4623,9 +4687,9 @@ rw_sub() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1-n2); + n2 = popint(); + n1 = popint(); + pushint(n1-n2); } /* @@ -4637,9 +4701,9 @@ rw_mul() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1*n2); + n2 = popint(); + n1 = popint(); + pushint(n1*n2); } /* @@ -4651,11 +4715,11 @@ rw_div() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); + n2 = popint(); + n1 = popint(); if (n2 == 0) rw_error(_("division by zero!")); - pushn(n1/n2); + pushint(n1/n2); } /* @@ -4667,11 +4731,11 @@ rw_rem() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); + n2 = popint(); + n1 = popint(); if (n2 == 0) rw_error(_("division by zero!")); - pushn(n1%n2); + pushint(n1%n2); } @@ -4679,7 +4743,7 @@ rw_rem() void rw_i2s() { - int n = popn(); + int n = popint(); char buf[64]; snprintf(buf, sizeof(buf), "%d", n); @@ -4690,8 +4754,8 @@ void rw_s2i() { grad_string_t s; - mem2string(&s, (RWSTYPE *)popn()); - pushn(strtol(s.data, NULL, 0)); + mem2string(&s, (RWSTYPE *)rw_c_val(popn(), ptr)); + pushint(strtol(s.data, NULL, 0)); } @@ -4702,9 +4766,9 @@ rw_eq() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 == n2); + n2 = popint(); + n1 = popint(); + pushint(n1 == n2); } void @@ -4713,9 +4777,9 @@ rw_ne() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 != n2); + n2 = popint(); + n1 = popint(); + pushint(n1 != n2); } void @@ -4724,9 +4788,9 @@ rw_lt() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 < n2); + n2 = popint(); + n1 = popint(); + pushint(n1 < n2); } void @@ -4735,9 +4799,9 @@ rw_le() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 <= n2); + n2 = popint(); + n1 = popint(); + pushint(n1 <= n2); } void @@ -4746,9 +4810,9 @@ rw_gt() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 > n2); + n2 = popint(); + n1 = popint(); + pushint(n1 > n2); } void @@ -4757,9 +4821,9 @@ rw_ge() int n1, n2; checkpop(2); - n2 = popn(); - n1 = popn(); - pushn(n1 >= n2); + n2 = popint(); + n1 = popint(); + pushint(n1 >= n2); } void @@ -4771,7 +4835,7 @@ rw_eqs() poparr(&s2); poparr(&s1); - pushn(s1.size == s2.size && memcmp(s1.data, s2.data, s1.size) == 0); + pushint(s1.size == s2.size && memcmp(s1.data, s2.data, s1.size) == 0); } void @@ -4783,7 +4847,7 @@ rw_nes() poparr(&s2); poparr(&s1); - pushn(!(s1.size == s2.size && memcmp(s1.data, s2.data, s1.size) == 0)); + pushint(!(s1.size == s2.size && memcmp(s1.data, s2.data, s1.size) == 0)); } void @@ -4796,7 +4860,7 @@ rw_lts() poparr(&s2); poparr(&s1); size = RW_MIN(s1.size, s2.size); - pushn(memcmp(s1.data, s2.data, size < 0) || s1.size < s2.size); + pushint(memcmp(s1.data, s2.data, size < 0) || s1.size < s2.size); } void @@ -4809,7 +4873,7 @@ rw_les() poparr(&s2); poparr(&s1); size = RW_MIN(s1.size, s2.size); - pushn(memcmp(s1.data, s2.data, size <= 0) || s1.size <= s2.size); + pushint(memcmp(s1.data, s2.data, size <= 0) || s1.size <= s2.size); } void @@ -4822,7 +4886,7 @@ rw_gts() poparr(&s2); poparr(&s1); size = RW_MIN(s1.size, s2.size); - pushn(memcmp(s1.data, s2.data, size > 0) || s1.size > s2.size); + pushint(memcmp(s1.data, s2.data, size > 0) || s1.size > s2.size); } void @@ -4835,7 +4899,7 @@ rw_ges() poparr(&s2); poparr(&s1); size = RW_MIN(s1.size, s2.size); - pushn(memcmp(s1.data, s2.data, size >= 0) || s1.size >= s2.size); + pushint(memcmp(s1.data, s2.data, size >= 0) || s1.size >= s2.size); } void @@ -4844,8 +4908,8 @@ rw_not() int n; checkpop(1); - n = popn(); - pushn(!n); + n = popint(); + pushint(!n); } static void @@ -4862,7 +4926,7 @@ need_pmatch(size_t n) void rw_match() { - COMP_REGEX *rx = (COMP_REGEX *)rw_code[mach.pc++]; + COMP_REGEX *rx = rw_c_val(rw_code_value(rw_code[mach.pc++]), rx); grad_string_t s; int rc; @@ -4878,15 +4942,15 @@ rw_match() errbuf, sizeof(errbuf)); grad_log(GRAD_LOG_DEBUG, _("rewrite regex failure: %s. Input: %s"), - errbuf, (char*)mach.rA); + errbuf, (char*)rw_c_val(mach.rA, ptr)); } - pushn(rc == 0); + pushint(rc == 0); } void rw_jmp() { - pctr_t pc = (pctr_t) rw_code[mach.pc++]; + pctr_t pc = rw_c_val(rw_code_value(rw_code[mach.pc++]), pc); mach.pc = pc; } @@ -4894,9 +4958,9 @@ void rw_jne() { int n; - pctr_t pc = (pctr_t) rw_code[mach.pc++]; + pctr_t pc = rw_c_val(rw_code_value(rw_code[mach.pc++]), pc); - n = popn(); + n = popint(); if (n != 0) mach.pc = pc; } @@ -4905,9 +4969,9 @@ void rw_je() { int n; - pctr_t pc = (pctr_t) rw_code[mach.pc++]; + pctr_t pc = rw_c_val(rw_code_value(rw_code[mach.pc++]), pc); - n = popn(); + n = popint(); if (n == 0) mach.pc = pc; } @@ -4915,8 +4979,8 @@ rw_je() void rw_builtin() { - INSTR fun = (INSTR) rw_code[mach.pc++]; - pushn(mach.pc); + INSTR fun = rw_code_instr(rw_code[mach.pc++]); + pushn((RWSTYPE)mach.pc); enter(0); fun(); leave(); @@ -4925,11 +4989,15 @@ rw_builtin() void run(pctr_t pc) { + INSTR ip; + mach.pc = pc; - while (rw_code[mach.pc]) { + while ((ip = rw_code_instr(rw_code[mach.pc]))) { if (mach.pc >= rw_codesize) rw_error(_("pc out of range")); - (*(rw_code[mach.pc++]))(); +// (*(rw_code[mach.pc++]))(); + mach.pc++; + (*ip)(); } } @@ -4955,8 +5023,8 @@ static void bi_length() { grad_string_t s; - mem2string(&s, (RWSTYPE*)getarg(1)); - pushn(s.size); + mem2string(&s, (RWSTYPE*)rw_c_val(getarg(1), ptr)); + pushn((RWSTYPE)s.size); } /* @@ -4969,10 +5037,10 @@ bi_index() char *p; int c; - mem2string(&s, (RWSTYPE*) getarg(2)); - c = (int) getarg(1); + mem2string(&s, (RWSTYPE*) rw_c_val(getarg(2), ptr)); + c = rw_c_val(getarg(1), int); p = memchr(s.data, c, s.size); - pushn(p ? p - s.data : -1); + pushint(p ? p - s.data : -1); } /* @@ -4985,11 +5053,12 @@ bi_rindex() int i; int c; - mem2string(&s, (RWSTYPE*) getarg(2)); + mem2string(&s, (RWSTYPE*)rw_c_val(getarg(2), ptr)); + c = rw_c_val(getarg(1), int); for (i = s.size - 1; i >= 0; i--) if (s.data[i] == c) break; - pushn(i); + pushint(i); } /* @@ -5003,9 +5072,9 @@ bi_substr() char *dest; int start, length; - mem2string(&src, (RWSTYPE*)getarg(3)); - start = getarg(2); - length = getarg(1); + mem2string(&src, (RWSTYPE*)rw_c_val(getarg(3), ptr)); + start = rw_c_val(getarg(2), int); + length = rw_c_val(getarg(1), int); if (length < 0) length = src.size - start; @@ -5014,8 +5083,8 @@ bi_substr() if (length > 0) memcpy(dest, src.data + start, length); dest[length] = 0; - p[0] = length; - pushn((RWSTYPE)p); + rw_c_val(p[0], size) = length; + pushn(rw_c_cast(p, void*)); } static void @@ -5023,11 +5092,11 @@ bi_field() { grad_string_t str; char *p, *endp; - int fn = getarg(1); + int fn = rw_c_val(getarg(1), int); char *s = ""; int len = 1; - mem2string(&str, (RWSTYPE*) getarg(2)); + mem2string(&str, (RWSTYPE*) rw_c_val(getarg(2), ptr)); endp = str.data + str.size; for (p = str.data; p < endp && fn--; ) { /* skip initial whitespace */ @@ -5052,40 +5121,44 @@ static void bi_logit() { grad_string_t msg; - mem2string(&msg, (RWSTYPE*) getarg(1)); + mem2string(&msg, (RWSTYPE*) rw_c_val(getarg(1), ptr)); grad_log(GRAD_LOG_INFO, "%s", msg.data); - pushn(0); + pushint(0); } static void bi_htonl() { - pushn(htonl(getarg(1))); + uint32_t val = rw_c_val(getarg(1), u_int); + pushn(rw_c_cast(htonl(val), u_int)); } static void bi_ntohl() { - pushn(ntohl(getarg(1))); + uint32_t val = rw_c_val(getarg(1), u_int); + pushn(rw_c_cast(ntohl(val), u_int)); } static void bi_htons() { - pushn(htons(getarg(1) & 0xffff)); + uint16_t val = rw_c_val(getarg(1), u_int); /* FIXME: range checking */ + pushn(rw_c_cast(htons(val), u_int)); } static void bi_ntohs() { - pushn(ntohs(getarg(1) & 0xffff)); + uint16_t val = rw_c_val(getarg(1), u_int); /* FIXME: range checking */ + pushn(rw_c_cast(ntohs(val & 0xffff), u_int)); } static void bi_inet_ntoa() { char buffer[GRAD_IPV4_STRING_LENGTH]; - char *s = grad_ip_iptostr(getarg(1), buffer); + char *s = grad_ip_iptostr(rw_c_val(getarg(1), u_int), buffer); pushstr(s, strlen(s)); } @@ -5093,9 +5166,9 @@ static void bi_inet_aton() { grad_string_t s; - mem2string(&s, (RWSTYPE*)getarg(1)); + mem2string(&s, (RWSTYPE*)rw_c_val(getarg(1), ptr)); /* Note: inet_aton is not always present. See lib/iputils.c */ - pushn(grad_ip_strtoip(s.data)); + pushn(rw_c_cast(grad_ip_strtoip(s.data), u_int)); } static void @@ -5105,9 +5178,9 @@ bi_tolower() grad_string_t dest; int i; - mem2string(&src, (RWSTYPE*) getarg(1)); + mem2string(&src, (RWSTYPE*) rw_c_val(getarg(1), ptr)); pushstr(src.data, src.size); - mem2string(&dest, (RWSTYPE*) tos()); + mem2string(&dest, (RWSTYPE*) rw_c_val(tos(), ptr)); for (i = 0; i < dest.size; i++) dest.data[i] = tolower(dest.data[i]); } @@ -5119,9 +5192,9 @@ bi_toupper() grad_string_t dest; int i; - mem2string(&src, (RWSTYPE*) getarg(1)); + mem2string(&src, (RWSTYPE*) rw_c_val(getarg(1), ptr)); pushstr(src.data, src.size); - mem2string(&dest, (RWSTYPE*) tos()); + mem2string(&dest, (RWSTYPE*) rw_c_val(tos(), ptr)); for (i = 0; i < dest.size; i++) dest.data[i] = toupper(dest.data[i]); } @@ -5129,7 +5202,7 @@ bi_toupper() static void bi_request_code_string() { - int code = (int) getarg(1); + int code = rw_c_val(getarg(1), int); const char *s = grad_request_code_to_name(code); pushstr(s, strlen(s)); } @@ -5138,35 +5211,35 @@ static void bi_request_source_ip() { assert_request_presence(); - pushn((RWSTYPE) mach.req->ipaddr); + pushn(rw_c_cast(mach.req->ipaddr, u_int)); } static void bi_request_source_port() { assert_request_presence(); - pushn((RWSTYPE) mach.req->udp_port); + pushn(rw_c_cast(mach.req->udp_port, u_int)); } static void bi_request_id() { assert_request_presence(); - pushn((RWSTYPE) mach.req->id); + pushn(rw_c_cast(mach.req->id, u_int)); } static void bi_request_code() { assert_request_presence(); - pushn((RWSTYPE) mach.req->code); + pushn(rw_c_cast(mach.req->code, u_int)); } static void bi_nas_name() { grad_nas_t *nas; - grad_uint32_t ip = (grad_uint32_t) getarg(1); + grad_uint32_t ip = (grad_uint32_t) rw_c_val(getarg(1), u_int); if ((nas = grad_nas_lookup_ip(ip)) != NULL) { char *s = nas->shortname[0] ? nas->shortname : nas->longname; @@ -5183,7 +5256,7 @@ static void bi_nas_short_name() { grad_nas_t *nas; - grad_uint32_t ip = (grad_uint32_t) getarg(1); + grad_uint32_t ip = (grad_uint32_t) rw_c_val(getarg(1), u_int); if ((nas = grad_nas_lookup_ip(ip)) && nas->shortname[0]) { pushstr(nas->shortname, strlen(nas->shortname)); @@ -5199,7 +5272,7 @@ static void bi_nas_full_name() { grad_nas_t *nas; - grad_uint32_t ip = (grad_uint32_t) getarg(1); + grad_uint32_t ip = (grad_uint32_t) rw_c_val(getarg(1), u_int); if ((nas = grad_nas_lookup_ip(ip)) != NULL) { pushstr(nas->longname, strlen(nas->longname)); @@ -5214,7 +5287,7 @@ bi_nas_full_name() static void bi_gethostbyaddr() { - grad_uint32_t ip = (grad_uint32_t) getarg(1); + grad_uint32_t ip = (grad_uint32_t) rw_c_val(getarg(1), u_int); char nasname[GRAD_MAX_LONGNAME]; grad_ip_gethostname(ip, nasname, sizeof(nasname)); @@ -5225,14 +5298,14 @@ static void bi_gethostbyname() { grad_string_t s; - mem2string(&s, (RWSTYPE*)getarg(1)); - pushn((RWSTYPE) grad_ip_gethostaddr(s.data)); + mem2string(&s, (RWSTYPE*) rw_c_val(getarg(1), ptr)); + pushn(rw_c_cast(grad_ip_gethostaddr(s.data), u_int)); } static void bi_time() { - pushn((RWSTYPE) time(NULL)); + pushn(rw_c_cast(time(NULL), u_int)); } static void @@ -5240,11 +5313,11 @@ bi_strftime() { struct tm *tm; char *base; - time_t t = (time_t) getarg(1); + time_t t = (time_t) rw_c_val(getarg(1), u_int); grad_string_t fmt; size_t n; - mem2string(&fmt, (RWSTYPE*) getarg(2)); + mem2string(&fmt, (RWSTYPE*) rw_c_val(getarg(2), ptr)); tm = localtime(&t); base = temp_space_create(); n = strftime(base, temp_space_size(), fmt.data, tm); @@ -5259,7 +5332,7 @@ rw_regerror(const char *prefix, regex_t *rx, int rc) if (!errbuf) rw_error(prefix); else { - strcpy (errbuf, prefix); + strcpy(errbuf, prefix); regerror(rc, rx, errbuf + strlen(prefix), sz); rw_error_free(errbuf); } @@ -5412,9 +5485,9 @@ bi_gsub() grad_list_t *subst; int rc; - mem2string(&re_str, (RWSTYPE*) getarg(3)); - mem2string(&repl, (RWSTYPE*) getarg(2)); - mem2string(&arg, (RWSTYPE*) getarg(1)); + mem2string(&re_str, (RWSTYPE*) rw_c_val(getarg(3), ptr)); + mem2string(&repl, (RWSTYPE*) rw_c_val(getarg(2), ptr)); + mem2string(&arg, (RWSTYPE*) rw_c_val(getarg(1), ptr)); p = arg.data; rc = regcomp(&rx, re_str.data, regcomp_flags); @@ -5439,8 +5512,8 @@ bi_gsub() temp_space_copy(&base, p, strlen(p) + 1); subst_destroy(subst); regfree(&rx); - - pushn((RWSTYPE)temp_space_fix(base)); + + pushn(rw_c_cast(temp_space_fix(base), void *)); } static void @@ -5455,9 +5528,9 @@ bi_sub() grad_list_t *subst; int rc; - mem2string(&re_str, (RWSTYPE*) getarg(3)); - mem2string(&repl, (RWSTYPE*) getarg(2)); - mem2string(&arg, (RWSTYPE*) getarg(1)); + mem2string(&re_str, (RWSTYPE*) rw_c_val(getarg(3), ptr)); + mem2string(&repl, (RWSTYPE*) rw_c_val(getarg(2), ptr)); + mem2string(&arg, (RWSTYPE*) rw_c_val(getarg(1), ptr)); rc = regcomp(&rx, re_str.data, regcomp_flags); if (rc) @@ -5480,7 +5553,7 @@ bi_sub() subst_destroy(subst); regfree(&rx); - pushn((RWSTYPE)temp_space_fix(base)); + pushn(rw_c_cast(temp_space_fix(base), void*)); } #define ISPRINT(c) (((unsigned char)c) < 128 && (isalnum(c) || c == '-')) @@ -5493,7 +5566,7 @@ bi_qprn() size_t count; RWSTYPE *sp; - mem2string(&arg, (RWSTYPE*)getarg(1)); + mem2string(&arg, (RWSTYPE*) rw_c_val(getarg(1), ptr)); end = arg.data + arg.size; for (count = 0, p = arg.data; p < end; p++) if (!ISPRINT(*p)) @@ -5501,8 +5574,8 @@ bi_qprn() /* Each encoded character takes 3 bytes. */ sp = heap_reserve(sizeof(RWSTYPE) + arg.size + 2*count + 1); - sp[0] = arg.size + 2*count; - pushn((RWSTYPE) sp); + rw_c_val(sp[0], size) = arg.size + 2*count; + pushn(rw_c_cast(sp, void*)); for (p = (char*)(sp + 1), s = arg.data; s < end; s++) { if (ISPRINT(*s)) @@ -5527,11 +5600,11 @@ bi_quote_string() char *p; size_t size; - mem2string(&arg, (RWSTYPE*)getarg(1)); + mem2string(&arg, (RWSTYPE*) rw_c_val(getarg(1), ptr)); size = grad_argcv_quoted_length_n(arg.data, arg.size, "e); sp = heap_reserve(sizeof(RWSTYPE) + size + 1); - sp[0] = size; - pushn((RWSTYPE)sp); + rw_c_val(sp[0], size) = size; + pushn(rw_c_cast(sp, void*)); p = (char*)(sp + 1); grad_argcv_quote_copy_n(p, arg.data, arg.size); } @@ -5539,25 +5612,23 @@ bi_quote_string() static void bi_unquote_string() { - int quote; grad_string_t arg; RWSTYPE *sp; char *p; - size_t size; - mem2string(&arg, (RWSTYPE*)getarg(1)); + mem2string(&arg, (RWSTYPE*) rw_c_val(getarg(1), ptr)); sp = heap_reserve(sizeof(RWSTYPE) + arg.size + 1); p = (char*)(sp + 1); grad_argcv_unquote_copy(p, arg.data, arg.size); - sp[0] = strlen(p); - pushn((RWSTYPE)sp); + rw_c_val(sp[0], u_int) = strlen(p); + pushn(rw_c_cast(sp, void*)); } static void bi_textdomain() { grad_string_t s; - mem2string(&s, (RWSTYPE*)getarg(1)); + mem2string(&s, (RWSTYPE*) rw_c_val(getarg(1), ptr)); pushstr(default_gettext_domain, strlen (default_gettext_domain)); grad_string_replace(&default_gettext_domain, s.data); } @@ -5568,7 +5639,7 @@ bi_gettext() grad_string_t s; const char *p; - mem2string(&s, (RWSTYPE*)getarg(1)); + mem2string(&s, (RWSTYPE*) rw_c_val(getarg(1), ptr)); p = dgettext(default_gettext_domain, s.data); pushstr(p, strlen(p)); } @@ -5580,8 +5651,8 @@ bi_dgettext() grad_string_t text; const char *p; - mem2string(&domain, (RWSTYPE*)getarg(2)); - mem2string(&text, (RWSTYPE*)getarg(1)); + mem2string(&domain, (RWSTYPE*) rw_c_val(getarg(2), ptr)); + mem2string(&text, (RWSTYPE*) rw_c_val(getarg(1), ptr)); p = dgettext(domain.data, text.data); pushstr(p, strlen(p)); } @@ -5595,9 +5666,9 @@ bi_ngettext() unsigned long n; const char *p; - mem2string(&s, (RWSTYPE*)getarg(3)); - mem2string(&pl, (RWSTYPE*)getarg(2)); - n = (unsigned long) getarg(1); + mem2string(&s, (RWSTYPE*) rw_c_val(getarg(3), ptr)); + mem2string(&pl, (RWSTYPE*) rw_c_val(getarg(2), ptr)); + n = (unsigned long) rw_c_val(getarg(1), u_int); p = dngettext(default_gettext_domain, s.data, pl.data, @@ -5614,10 +5685,10 @@ bi_dngettext() unsigned long n; const char *p; - mem2string(&domain, (RWSTYPE*)getarg(4)); - mem2string(&s, (RWSTYPE*)getarg(3)); - mem2string(&pl, (RWSTYPE*)getarg(2)); - n = (unsigned long) getarg(1); + mem2string(&domain, (RWSTYPE*) rw_c_val(getarg(4), ptr)); + mem2string(&s, (RWSTYPE*) rw_c_val(getarg(3), ptr)); + mem2string(&pl, (RWSTYPE*) rw_c_val(getarg(2), ptr)); + n = (unsigned long) rw_c_val(getarg(1), u_int); p = dngettext(domain.data, s.data, pl.data, n); pushstr(p, strlen(p)); @@ -5705,7 +5776,7 @@ function_install(FUNCTION *fun) { FUNCTION *fp; - if (fp = (FUNCTION *)grad_sym_lookup(rewrite_tab, fun->name)) { + if ((fp = (FUNCTION *)grad_sym_lookup(rewrite_tab, fun->name))) { grad_log_loc(GRAD_LOG_ERR, &fun->loc, _("redefinition of function %s")); grad_log_loc(GRAD_LOG_ERR, &fp->loc, @@ -5832,8 +5903,8 @@ run_init(pctr_t pc, grad_request_t *request) } /* Imitate a function call */ - pushn(0); /* Return address */ - run(pc); /* call function */ + pushn(rw_c_cast(0, pctr_t)); /* Return address */ + run(pc); /* call function */ if (GRAD_DEBUG_LEVEL(2)) { fp = debug_open_file(); fprintf(fp, "After rewriting\n"); @@ -5851,15 +5922,15 @@ return_value(grad_value_t *val) switch (val->type) { case Integer: - val->datum.ival = mach.rA; + val->datum.ival = rw_c_val(mach.rA, u_int); break; case String: - mem2string(&val->datum.sval, (RWSTYPE*) mach.rA); + mem2string(&val->datum.sval, (RWSTYPE*) rw_c_val(mach.rA, ptr)); p = grad_emalloc (val->datum.sval.size + 1); memcpy (p, val->datum.sval.data, val->datum.sval.size); p[val->datum.sval.size] = 0; - val->datum.sval.data = p; + val->datum.sval.data = (char*) p; break; default: @@ -5914,7 +5985,7 @@ rewrite_invoke(grad_data_type_t rettype, grad_value_t *val, nargs++; switch (*typestr++) { case 'i': - pushn(va_arg(ap, int)); + pushint(va_arg(ap, int)); break; case 's': s = va_arg(ap, char*); @@ -5927,8 +5998,8 @@ rewrite_invoke(grad_data_type_t rettype, grad_value_t *val, va_end(ap); /* Imitate a function call */ - pushn(0); /* Return address */ - run(fun->entry); /* call function */ + pushn(rw_c_cast(0, pctr_t)); /* Return address */ + run(fun->entry); /* call function */ if (GRAD_DEBUG_LEVEL(2)) { fp = debug_open_file(); fprintf(fp, "After rewriting\n"); diff --git a/radtest/gram.y b/radtest/gram.y index 94c70e37..3e801b8e 100644 --- a/radtest/gram.y +++ b/radtest/gram.y @@ -1,7 +1,6 @@ %{ /* This file is part of GNU Radius. - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2010, - 2013 Free Software Foundation, Inc. + Copyright (C) 2000-2017 Free Software Foundation, Inc. Written by Sergey Poznyakoff @@ -103,7 +102,7 @@ peek_ctx() /* Forward declarations */ static void run_statement(radtest_node_t *node); static void errsync(); -int yyerror(char *s); +int yyerror(char const *s); %} @@ -895,7 +894,7 @@ pritem : expr %prec PRITEM %% int -yyerror(char *s) +yyerror(char const *s) { if (strcmp(s, "parse error") == 0 || strcmp(s, "syntax error") == 0) { @@ -920,7 +919,7 @@ yyerror(char *s) static char *funcname_displayed = NULL; static int -namecmp(char *a, char *b) +namecmp(char const *a, char const *b) { if (!a || !b) return a != b; diff --git a/scripts/mktypes.c b/scripts/mktypes.c index 5ed32a62..ded445a2 100644 --- a/scripts/mktypes.c +++ b/scripts/mktypes.c @@ -1,6 +1,6 @@ char header_text[] = "\ /* This file is part of GNU Radius.\n\ - Copyright (C) 2004, 2007, 2008, 2010, 2013 Free Software Foundation, Inc.\n\ + Copyright (C) 2000-2017 Free Software Foundation, Inc.\n\ \n\ GNU Radius is free software; you can redistribute it and/or modify\n\ it under the terms of the GNU General Public License as published by\n\ @@ -11,7 +11,7 @@ char header_text[] = "\ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ GNU General Public License for more details.\n\ -\n\ +\n\ You should have received a copy of the GNU General Public License\n\ along with GNU Radius. If not, see <http://www.gnu.org/licenses/>.\n\ \n\ |
