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 + -
显示快捷键?