exec.c
来自「大国补丁后的nessus2.2.8的源代码」· C语言 代码 · 共 1,881 行 · 第 1/3 页
C
1,881 行
case CONST_INT: fprintf(fp, "%d", c->x.i_val); break; case CONST_STR: case CONST_DATA: fprintf(fp, "\"%s\"", c->x.str_val); break; case NODE_ARRAY_EL: fprintf(fp, "%s[", c->x.str_val); nasl_dump_expr(fp, c->link[0]); fprintf(fp, "]"); break; case NODE_FUN_CALL: fprintf(fp, "%s(...)", c->x.str_val); break; case NODE_AFF: nasl_dump_expr(fp, c->link[0]); putc('=', fp); nasl_dump_expr(fp, c->link[1]); break; case NODE_PLUS_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, "+= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; case NODE_MINUS_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, "-= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; case NODE_MULT_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, "*= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; case NODE_DIV_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, "/= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; case NODE_MODULO_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, "%%= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; case NODE_L_SHIFT_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, " <<= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; case NODE_R_SHIFT_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, " >>= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; case NODE_R_USHIFT_EQ: nasl_dump_expr(fp, c->link[0]); fprintf(fp, " >>>= ("); nasl_dump_expr(fp, c->link[1]); fprintf(fp, ")"); break; default: fprintf(fp, "*%d*", c->type); break; }}static voidnasl_short_dump(FILE* fp, const tree_cell* c){ if (c == NULL || c == FAKE_CELL) return; switch (c->type) { case NODE_IF_ELSE: fprintf(fp, "NASL:%04d> if (", c->line_nb); nasl_dump_expr(fp, c->link[0]); fprintf(fp, ") { ... }"); if (c->link[2] != NULL) fprintf(fp, " else { ... }"); putc('\n', fp); break; case NODE_FOR: fprintf(fp, "NASL:%04d> for (", c->line_nb); nasl_dump_expr(fp, c->link[0]); fprintf(fp, "; "); nasl_dump_expr(fp, c->link[1]); fprintf(fp, "; "); nasl_dump_expr(fp, c->link[2]); fprintf(fp, ") { ... }\n"); break; case NODE_WHILE: fprintf(fp, "NASL:%04d> while (", c->line_nb); nasl_dump_expr(fp, c->link[0]); fprintf(fp, ") { ... }\n"); break; case NODE_FOREACH: fprintf(fp, "NASL:%04d> foreach %s (", c->line_nb, c->x.str_val); nasl_dump_expr(fp, c->link[0]); fprintf(fp, ") { ... }\n"); break; case NODE_REPEAT_UNTIL: fprintf(fp, "NASL:%04d> repeat { ... } until (", c->line_nb); nasl_dump_expr(fp, c->link[0]); fprintf(fp, ")\n"); break; case NODE_REPEATED: fprintf(fp, "NASL:%04d> ... x ", c->line_nb); nasl_dump_expr(fp, c->link[1]); putc('\n', fp); break; case NODE_RETURN: fprintf(fp, "NASL:%04d> return ", c->line_nb); nasl_dump_expr(fp, c->link[0]); fprintf(fp, ";\n"); break; case NODE_BREAK: fprintf(fp, "NASL:%04d> break\n", c->line_nb); break; case NODE_CONTINUE: fprintf(fp, "NASL:%04d> continue\n", c->line_nb); break; case NODE_AFF: case NODE_PLUS_EQ: case NODE_MINUS_EQ: case NODE_MULT_EQ: case NODE_DIV_EQ: case NODE_MODULO_EQ: case NODE_R_SHIFT_EQ: case NODE_R_USHIFT_EQ: case NODE_L_SHIFT_EQ: fprintf(fp, "NASL:%04d> ", c->line_nb); nasl_dump_expr(fp, c); fprintf(fp, ";\n"); break; case NODE_FUN_CALL: fprintf(fp, "NASL:%04d> %s(...)\n", c->line_nb, c->x.str_val); break; case NODE_LOCAL: fprintf(fp, "NASL:%04d> local_var ...\n", c->line_nb); break; case NODE_GLOBAL: fprintf(fp, "NASL:%04d> global_var ...\n", c->line_nb); break; }}static intexpo(int x, int y){ int z; if (y == 0) return 1; else if (y < 0) if (x == 1) return 1; else return 0; else if (y == 1) return x; z = expo(x, y /2); if (y % 2 == 0) return z * z; else return x * z * z;}tree_cell*nasl_exec(lex_ctxt* lexic, tree_cell* st){ tree_cell *ret = NULL, *ret2 = NULL, *tc1 = NULL, *tc2 = NULL, *tc3 = NULL, *idx = NULL, *args; int flag, x, y, z; char *s1 = NULL, *s2 = NULL, *s3 = NULL, *p = NULL; char *p1, *p2; int len1, len2; nasl_func *pf = NULL; int i, n; unsigned long sz;#if 0 nasl_dump_tree(st); /* See rt.value, rt.type, rt.length */#endif /* return */ if (lexic->ret_val != NULL) { ref_cell(lexic->ret_val); return lexic->ret_val; } /* break or continue */ if (lexic->break_flag || lexic->cont_flag) return FAKE_CELL; if (st == FAKE_CELL) return FAKE_CELL; if (st == NULL) {#if NASL_DEBUG > 0 nasl_perror(lexic, "nasl_exec: st == NULL\n");#endif return NULL; } if (nasl_trace_fp != NULL) nasl_short_dump(nasl_trace_fp, st); switch(st->type) { case NODE_IF_ELSE: ret = nasl_exec(lexic, st->link[0]);#ifdef STOP_AT_FIRST_ERROR if (ret == NULL) return NULL;#endif if (cvt_bool(lexic, ret)) ret2 = nasl_exec(lexic, st->link[1]); else if (st->link[2] != NULL) /* else branch */ ret2 = nasl_exec(lexic, st->link[2]); else /* No else */ ret2 = FAKE_CELL; deref_cell(ret); return ret2; case NODE_INSTR_L: /* Block. [0] = first instr, [1] = tail */ ret = nasl_exec(lexic, st->link[0]);#if NASL_DEBUG > 1 if (ret == NULL) nasl_perror(lexic, "Instruction failed. Going on in block\n");#endif if (st->link[1] == NULL || lexic->break_flag || lexic->cont_flag) return ret; deref_cell(ret); ret = nasl_exec(lexic, st->link[1]); return ret; case NODE_FOR: /* [0] = start expr, [1] = cond, [2] = end_expr, [3] = block */ ret2 = nasl_exec(lexic, st->link[0]);#ifdef STOP_AT_FIRST_ERROR if (ret2 == NULL) return NULL;#endif deref_cell(ret2); for (;;) { /* Break the loop if 'return' */ if (lexic->ret_val != NULL) { ref_cell(lexic->ret_val); return lexic->ret_val; } /* condition */ if ((ret = nasl_exec(lexic, st->link[1])) == NULL) return NULL; /* We can return here, as NULL is false */ flag = cvt_bool(lexic, ret); deref_cell(ret); if (! flag) break; /* block */ ret = nasl_exec(lexic, st->link[3]);#ifdef STOP_AT_FIRST_ERROR if (ret == NULL) return NULL;#endif deref_cell(ret); /* break */ if (lexic->break_flag) { lexic->break_flag = 0; return FAKE_CELL; } lexic->cont_flag = 0; /* No need to test if set */ /* end expression */ ret = nasl_exec(lexic, st->link[2]);#ifdef STOP_AT_FIRST_ERROR if (ret == NULL) return NULL;#endif deref_cell(ret); } return FAKE_CELL; case NODE_WHILE: /* [0] = cond, [1] = block */ for (;;) { /* return? */ if (lexic->ret_val != NULL) { ref_cell(lexic->ret_val); return lexic->ret_val; } /* Condition */ if ((ret = nasl_exec(lexic, st->link[0])) == NULL) return NULL; /* NULL is false */ flag = cvt_bool(lexic, ret); deref_cell(ret); if (! flag) break; /* Block */ ret = nasl_exec(lexic, st->link[1]);#ifdef STOP_AT_FIRST_ERROR if (ret == NULL) return NULL;#endif deref_cell(ret); /* break */ if (lexic->break_flag) { lexic->break_flag = 0; return FAKE_CELL; } lexic->cont_flag = 0; } return FAKE_CELL; case NODE_REPEAT_UNTIL: /* [0] = block, [1] = cond */ for (;;) { /* return? */ if (lexic->ret_val != NULL) { ref_cell(lexic->ret_val); return lexic->ret_val; } /* Block */ ret = nasl_exec(lexic, st->link[0]);#ifdef STOP_AT_FIRST_ERROR if (ret == NULL) return NULL;#endif deref_cell(ret); /* break */ if (lexic->break_flag) { lexic->break_flag = 0; return FAKE_CELL; } lexic->cont_flag = 0; /* Condition */ ret = nasl_exec(lexic, st->link[1]);#ifdef STOP_AT_FIRST_ERROR if (ret == NULL) return NULL;#endif flag = cvt_bool(lexic, ret); deref_cell(ret); if (flag) break; } return FAKE_CELL; case NODE_FOREACH: /* str_val = index name, [0] = array, [1] = block */ { nasl_iterator ai; tree_cell *v, *a, *val; v = get_variable_by_name(lexic, st->x.str_val); if (v == NULL) return NULL; /* We cannot go on if we have no variable to iterate */ a = nasl_exec(lexic, st->link[0]); ai = nasl_array_iterator(a); while ((val = nasl_iterate_array(&ai)) != NULL) { tc1 = nasl_affect(v, val); ret = nasl_exec(lexic, st->link[1]); deref_cell(val); deref_cell(tc1);#ifdef STOP_AT_FIRST_ERROR if (ret == NULL) break;#endif deref_cell(ret); /* return */ if (lexic->ret_val != NULL) break; /* break */ if (lexic->break_flag) { lexic->break_flag = 0; break; } lexic->cont_flag = 0; } deref_cell(a); deref_cell(v); } return FAKE_CELL; case NODE_FUN_DEF: /* x.str_val = function name, [0] = argdecl, [1] = block */ ret = decl_nasl_func(lexic, st); return ret; case NODE_FUN_CALL: pf = get_func_ref_by_name(lexic, st->x.str_val); if (pf == NULL) { nasl_perror(lexic, "Undefined function '%s'\n", st->x.str_val); return NULL; } args = st->link[0];#if 0 printf("****************\n"); nasl_dump_tree(args); printf("****************\n");#endif ret = nasl_func_call(lexic, pf, args); return ret; case NODE_REPEATED: n = cell2intW(lexic, st->link[1]); if (n <= 0) return NULL; #ifdef STOP_AT_FIRST_ERROR for (tc1 = NULL, i = 1; i <= n; i ++) { deref_cell(tc1); if ((tc1 = nasl_exec(lexic, st->link[0])) == NULL) return NULL; } return tc1;#else for (i = 1; i <= n; i ++) { tc1 = nasl_exec(lexic, st->link[0]); deref_cell(tc1); } return FAKE_CELL;#endif /* * I wonder... * Will nasl_exec be really called with NODE_EXEC or NODE_ARG? */ case NODE_DECL: /* Used in function declarations */ /* [0] = next arg in list */ /* TBD? */ return st; /* ? */ case NODE_ARG: /* Used function calls */ /* val = name can be NULL, [0] = val, [1] = next arg */ ret = nasl_exec(lexic, st->link[0]); /* Is this wise? */ return ret; case NODE_RETURN: /* [0] = ret val */ ret = nasl_return(lexic, st->link[0]); return ret; case NODE_BREAK: lexic->break_flag = 1; return FAKE_CELL; case NODE_CONTINUE: lexic->cont_flag = 1; return FAKE_CELL; case NODE_ARRAY_EL: /* val = array name, [0] = index */ idx = cell2atom(lexic, st->link[0]); ret = get_array_elem(lexic, st->x.str_val, idx); deref_cell(idx); return ret; case NODE_AFF: /* [0] = lvalue, [1] = rvalue */ tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); ret = nasl_affect(tc1, tc2); deref_cell(tc1); /* Must free VAR_REF */ deref_cell(ret); return tc2; /* So that "a = b = e;" works */ case NODE_PLUS_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_PLUS, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; /* So that "a = b += e;" works */ case NODE_MINUS_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_MINUS, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; /* So that "a = b -= e;" works */ case NODE_MULT_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_MULT, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; case NODE_DIV_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_DIV, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; case NODE_MODULO_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_MODULO, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; case NODE_L_SHIFT_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_L_SHIFT, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; case NODE_R_SHIFT_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_R_SHIFT, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; case NODE_R_USHIFT_EQ: tc1 = nasl_exec(lexic, st->link[0]); tc2 = nasl_exec(lexic, st->link[1]); tc3 = alloc_expr_cell(0, EXPR_R_USHIFT, tc1, tc2); ret2 = nasl_exec(lexic, tc3); ret = nasl_affect(tc1, ret2); deref_cell(tc3); /* Frees tc1 and tc2 */ deref_cell(ret); return ret2; case NODE_VAR: /* val = variable name */ ret = get_variable_by_name(lexic, st->x.str_val); return ret; case NODE_LOCAL: /* [0] = argdecl */ ret = decl_local_variables(lexic, st->link[0]); return ret; case NODE_GLOBAL: /* [0] = argdecl */ ret = decl_global_variables(lexic, st->link[0]); return ret; case EXPR_AND: x = cell2bool(lexic, st->link[0]); if(! x) return bool2cell(0); y = cell2bool(lexic, st->link[1]); return bool2cell(y); case EXPR_OR: x = cell2bool(lexic, st->link[0]); if(x) return bool2cell(x); y = cell2bool(lexic, st->link[1]); return bool2cell(y);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?