Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
PATCH: Re: `foo=foo; (( foo ))' => infinite recursion
- X-seq: zsh-workers 10125
- From: Sven Wischnowsky <wischnow@xxxxxxxxxxxxxxxxxxxxxxx>
- To: zsh-workers@xxxxxxxxxxxxxx
- Subject: PATCH: Re: `foo=foo; (( foo ))' => infinite recursion
- Date: Tue, 14 Mar 2000 09:05:52 +0100 (MET)
- In-reply-to: "Bart Schaefer"'s message of Mon, 13 Mar 2000 16:05:38 +0000
- Mailing-list: contact zsh-workers-help@xxxxxxxxxxxxxx; run by ezmlm
Bart Schaefer wrote:
> On Mar 13, 10:34am, Sven Wischnowsky wrote:
> } Subject: Re: `foo=foo; (( foo ))' => infinite recursion
> }
> } What really irritated me was that getnumvalue() called matheval().
> } That meant that in cases like the one above $foo could contain any
> } mathematical expression and that would get evaluated.
>
> Urgh. This is ugly, but appears to have been done for a long time, so
> I'm a bit leery of changing it. (( foo == $foo )) is probably meant to
> be true, which won't be the case any more with your patch.
>
> Maybe just a recursion counter with a reasonably large limit?
Ok. The patch is relative to my last one for this. If you haven't
applied that, just ignore anything but the first two hunks.
Bye
Sven
diff -ru ../z.old/Src/math.c Src/math.c
--- ../z.old/Src/math.c Mon Mar 13 17:49:30 2000
+++ Src/math.c Tue Mar 14 09:03:54 2000
@@ -47,6 +47,8 @@
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 @@
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;
@@ -948,78 +958,6 @@
(*ss)--;
mtok = xmtok;
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;
}
/*
diff -ru ../z.old/Src/params.c Src/params.c
--- ../z.old/Src/params.c Mon Mar 13 17:49:31 2000
+++ Src/params.c Tue Mar 14 09:03:55 2000
@@ -1420,7 +1420,7 @@
mn.type = MN_FLOAT;
mn.u.d = v->pm->gets.ffn(v->pm);
} else
- return mathnumber(getstrvalue(v));
+ return matheval(getstrvalue(v));
return mn;
}
--
Sven Wischnowsky wischnow@xxxxxxxxxxxxxxxxxxxxxxx
Messages sorted by:
Reverse Date,
Date,
Thread,
Author