summaryrefslogtreecommitdiff
path: root/ast_expr.y
diff options
context:
space:
mode:
authorMark Spencer <markster@digium.com>2004-12-10 23:01:48 +0000
committerMark Spencer <markster@digium.com>2004-12-10 23:01:48 +0000
commit8ed07241cb525f232db4016eb2067dd6c24d9818 (patch)
tree2e89ee9ef4b6357eed005e7f2fcc5e2af3fc9184 /ast_expr.y
parentbe2505fef8f075d65b8f9ce253f4493a15fa2cc5 (diff)
Fix setvar issue (bug #3010)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4419 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'ast_expr.y')
-rwxr-xr-xast_expr.y67
1 files changed, 39 insertions, 28 deletions
diff --git a/ast_expr.y b/ast_expr.y
index 43385ae8f..df08f6829 100755
--- a/ast_expr.y
+++ b/ast_expr.y
@@ -651,19 +651,24 @@ struct val *a, *b;
{
struct val *r;
- if (!to_integer (a) || !to_integer (b)) {
+ if (!to_integer (a)) {
ast_log(LOG_WARNING,"non-numeric argument\n");
- free_value(a);
+ if (!to_integer (b)) {
+ free_value(a);
+ free_value(b);
+ return make_integer(0);
+ } else {
+ free_value(a);
+ return (b);
+ }
+ } else if (!to_integer(b)) {
free_value(b);
- return(NULL);
+ return (a);
}
r = make_integer (/*(quad_t)*/(a->u.i + b->u.i));
if (chk_plus (a->u.i, b->u.i, r->u.i)) {
ast_log(LOG_WARNING,"overflow\n");
- free_value(a);
- free_value(b);
- return(NULL);
}
free_value (a);
free_value (b);
@@ -691,19 +696,27 @@ struct val *a, *b;
{
struct val *r;
- if (!to_integer (a) || !to_integer (b)) {
- free_value(a);
- free_value(b);
+ if (!to_integer (a)) {
ast_log(LOG_WARNING, "non-numeric argument\n");
- return(NULL);
+ if (!to_integer (b)) {
+ free_value(a);
+ free_value(b);
+ return make_integer(0);
+ } else {
+ r = make_integer(0 - b->u.i);
+ free_value(a);
+ free_value(b);
+ return (r);
+ }
+ } else if (!to_integer(b)) {
+ ast_log(LOG_WARNING, "non-numeric argument\n");
+ free_value(b);
+ return (a);
}
r = make_integer (/*(quad_t)*/(a->u.i - b->u.i));
if (chk_minus (a->u.i, b->u.i, r->u.i)) {
- free_value(a);
- free_value(b);
- ast_log(LOG_WARNING, "overload\n");
- return(NULL);
+ ast_log(LOG_WARNING, "overflow\n");
}
free_value (a);
free_value (b);
@@ -733,15 +746,12 @@ struct val *a, *b;
free_value(a);
free_value(b);
ast_log(LOG_WARNING, "non-numeric argument\n");
- return(NULL);
+ return(make_integer(0));
}
r = make_integer (/*(quad_t)*/(a->u.i * b->u.i));
if (chk_times (a->u.i, b->u.i, r->u.i)) {
ast_log(LOG_WARNING, "overflow\n");
- free_value(a);
- free_value(b);
- return(NULL);
}
free_value (a);
free_value (b);
@@ -766,26 +776,28 @@ struct val *a, *b;
{
struct val *r;
- if (!to_integer (a) || !to_integer (b)) {
+ if (!to_integer (a)) {
free_value(a);
free_value(b);
ast_log(LOG_WARNING, "non-numeric argument\n");
- return(NULL);
+ return make_integer(0);
+ } else if (!to_integer (b)) {
+ free_value(a);
+ free_value(b);
+ ast_log(LOG_WARNING, "non-numeric argument\n");
+ return make_integer(INT_MAX);
}
if (b->u.i == 0) {
ast_log(LOG_WARNING, "division by zero\n");
free_value(a);
free_value(b);
- return(NULL);
+ return make_integer(INT_MAX);
}
r = make_integer (/*(quad_t)*/(a->u.i / b->u.i));
if (chk_div (a->u.i, b->u.i)) {
ast_log(LOG_WARNING, "overflow\n");
- free_value(a);
- free_value(b);
- return(NULL);
}
free_value (a);
free_value (b);
@@ -802,14 +814,13 @@ struct val *a, *b;
ast_log(LOG_WARNING, "non-numeric argument\n");
free_value(a);
free_value(b);
- return(NULL);
+ return make_integer(0);
}
if (b->u.i == 0) {
ast_log(LOG_WARNING, "div by zero\n");
free_value(a);
- free_value(b);
- return(NULL);
+ return (b);
}
r = make_integer (/*(quad_t)*/(a->u.i % b->u.i));
@@ -839,7 +850,7 @@ struct val *a, *b;
ast_log(LOG_WARNING,"regcomp() error : %s",errbuf);
free_value(a);
free_value(b);
- return(NULL);
+ return make_str("");
}
/* compare string against pattern */