From d14884912efc76cfef3b6bbbb679a753901d46f6 Mon Sep 17 00:00:00 2001 From: Tanaka Akira Date: Tue, 14 Mar 2000 08:17:02 +0000 Subject: zsh-workers/10125 --- Src/math.c | 82 ++++++++---------------------------------------------------- Src/params.c | 2 +- 2 files changed, 11 insertions(+), 73 deletions(-) diff --git a/Src/math.c b/Src/math.c index 2dc667c35..7eec82e63 100644 --- a/Src/math.c +++ b/Src/math.c @@ -47,6 +47,8 @@ static char *ptr; static mnumber yyval; static char *yylval; +#define MAX_MLEVEL 256 + static int mlevel = 0; /* != 0 means recognize unary plus, minus, etc. */ @@ -861,6 +863,14 @@ mathevall(char *s, int prek, char **ep) struct mathvalue *xstack = 0, nstack[STACKSZ]; mnumber ret; + if (mlevel >= MAX_MLEVEL) { + xyyval.type = MN_INTEGER; + xyyval.u.l = 0; + + zerr("math recursion limit exceeded", NULL, 0); + + return xyyval; + } if (mlevel++) { xlastbase = lastbase; xnoeval = noeval; @@ -950,78 +960,6 @@ mathevalarg(char *s, char **ss) return (x.type & MN_FLOAT) ? (zlong)x.u.d : x.u.l; } -/**/ -mod_export mnumber -mathnumber(char *s) -{ - mnumber ret; - - ret.type = MN_INTEGER; - - while (*s) { - switch (*s++) { - case '[': - { - int base = zstrtol(s, &s, 10); - - if (*s == ']') - s++; - ret.u.l = zstrtol(s, &s, base); - return ret; - } - case ' ': - case '\t': - case '\n': - break; - case '0': - if (*s == 'x' || *s == 'X') { - /* Should we set lastbase here? */ - ret.u.l = zstrtol(++s, &s, 16); - return ret; - } - /* Fall through! */ - default: - if (idigit(*--s) || *s == '.') { - char *nptr; -#ifdef USE_LOCALE - char *prev_locale; -#endif - for (nptr = s; idigit(*nptr); nptr++); - - if (*nptr == '.' || *nptr == 'e' || *nptr == 'E') { - /* it's a float */ - ret.type = MN_FLOAT; -#ifdef USE_LOCALE - prev_locale = setlocale(LC_NUMERIC, NULL); - setlocale(LC_NUMERIC, "POSIX"); -#endif - ret.u.d = strtod(s, &nptr); -#ifdef USE_LOCALE - setlocale(LC_NUMERIC, prev_locale); -#endif - if (s == nptr || *nptr == '.') - goto end; - s = nptr; - } else { - /* it's an integer */ - ret.u.l = zstrtol(s, &s, 10); - - if (*s == '#') - ret.u.l = zstrtol(++s, &s, ret.u.l); - } - return ret; - } - goto end; - } - } - end: - - ret.type = MN_INTEGER; - ret.u.l = 0; - - return ret; -} - /* * Make sure we have an operator or an operand, whatever is expected. * For this purpose, unary operators constitute part of an operand. diff --git a/Src/params.c b/Src/params.c index 5ed1c879b..d5c419daf 100644 --- a/Src/params.c +++ b/Src/params.c @@ -1420,7 +1420,7 @@ getnumvalue(Value v) mn.type = MN_FLOAT; mn.u.d = v->pm->gets.ffn(v->pm); } else - return mathnumber(getstrvalue(v)); + return matheval(getstrvalue(v)); return mn; } -- cgit 1.4.1