aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-17 00:33:00 +0000
committermarkster <markster@f38db490-d61c-443f-a65b-d21fe96a405b>2005-06-17 00:33:00 +0000
commit8698db8b5da2eca74fb04b02e86a742fab4d500f (patch)
treed9fc14eb7b148abc23b71e1984a566e24cd9bc7e
parent20cc8387a96393f0583cae71150c6fb3146a0f9c (diff)
Fix expression handling for string comparisions without quotes (bug #4478)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5919 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-xast_expr2.fl7
-rwxr-xr-xast_expr2.y12
-rwxr-xr-xdoc/README.variables8
3 files changed, 20 insertions, 7 deletions
diff --git a/ast_expr2.fl b/ast_expr2.fl
index 452d28f3c..55dffd5d8 100755
--- a/ast_expr2.fl
+++ b/ast_expr2.fl
@@ -32,6 +32,7 @@ struct val {
#define SET_COLUMNS yylloc_param->first_column = (int)(yyg->yytext_r - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf);yylloc_param->last_column = yylloc_param->last_column + yyleng - 1; yylloc_param->first_line = yylloc_param->last_line = 1
#define SET_STRING yylval_param->val = (struct val *)calloc(sizeof(struct val),1); yylval_param->val->type = AST_EXPR_string; yylval_param->val->u.s = strdup(yytext);
+#define SET_NUMERIC_STRING yylval_param->val = (struct val *)calloc(sizeof(struct val),1); yylval_param->val->type = AST_EXPR_numeric_string; yylval_param->val->u.s = strdup(yytext);
struct parse_io
{
@@ -74,10 +75,8 @@ struct parse_io
\"[^"]*\" {SET_COLUMNS; SET_STRING; return TOKEN;}
[\n] {/* what to do with eol */}
-[0-9]+ { SET_COLUMNS;
- yylval_param->val = (struct val *)calloc(sizeof(struct val),1);
- yylval_param->val->type = AST_EXPR_integer;
- yylval_param->val->u.i = atoi(yytext);
+[0-9]+ { SET_COLUMNS; /* the original behavior of the expression parser was to bring in numbers as a numeric string */
+ SET_NUMERIC_STRING;
return TOKEN;}
[a-zA-Z0-9,.?';{}\\_^%$#@!]+ {SET_COLUMNS; SET_STRING; return TOKEN;}
diff --git a/ast_expr2.y b/ast_expr2.y
index 14c84e856..dc0a37528 100755
--- a/ast_expr2.y
+++ b/ast_expr2.y
@@ -296,10 +296,11 @@ to_integer (struct val *vp)
/* vp->type == AST_EXPR_numeric_string, make it numeric */
errno = 0;
- i = strtoq(vp->u.s, (char**)NULL, 10);
+ i = strtoll(vp->u.s, (char**)NULL, 10);
if (errno != 0) {
+ ast_log(LOG_WARNING,"Conversion of %s to integer under/overflowed!\n", vp->u.s);
free(vp->u.s);
- ast_log(LOG_WARNING,"overflow\n");
+ vp->u.s = 0;
return(0);
}
free (vp->u.s);
@@ -433,8 +434,15 @@ op_eq (struct val *a, struct val *b)
to_string (b);
r = make_integer ((quad_t)(strcoll (a->u.s, b->u.s) == 0));
} else {
+#ifdef DEBUG_FOR_CONVERSIONS
+ char buffer[2000];
+ sprintf(buffer,"Converting '%s' and '%s' ", a->u.s, b->u.s);
+#endif
(void)to_integer(a);
(void)to_integer(b);
+#ifdef DEBUG_FOR_CONVERSIONS
+ ast_log(LOG_WARNING,"%s to '%lld' and '%lld'\n", buffer, a->u.i, b->u.i);
+#endif
r = make_integer ((quad_t)(a->u.i == b->u.i));
}
diff --git a/doc/README.variables b/doc/README.variables
index 3a8a7b48b..1bf900798 100755
--- a/doc/README.variables
+++ b/doc/README.variables
@@ -310,7 +310,13 @@ Of course, all of the above examples use constants, but would work the same if a
numeric or string constants were replaced with a variable reference ${CALLERIDNUM}, for
instance.
-
+__________________________
+NUMBERS VS STRINGS
+--------------------------
+
+Tokens consisting only of numbers are converted to 64-bit numbers for most of the
+operators. This means that overflows can occur when the numbers get above 18 digits.
+Warnings will appear in the logs in this case.
___________________________
CONDITIONALS
---------------------------