1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-09-28 03:06:20 -04:00

Bug 957: Assert that the ECMAScript interpreter is not running.

Add ecmascript_interpreter.backend_nesting, increment it when
beginning to evaluate an expression, and decrement it when evaluation
finishes.  Then assert that it is zero in ecmascript_put_interpreter.
This detects bug 957 and similar ones before they corrupt memory.
This commit is contained in:
Kalle Olavi Niemitalo 2007-06-21 21:34:36 +03:00 committed by Kalle Olavi Niemitalo
parent 9f75e1f094
commit 58e3ebf2e7
2 changed files with 23 additions and 4 deletions

View File

@ -139,6 +139,7 @@ void
ecmascript_put_interpreter(struct ecmascript_interpreter *interpreter)
{
assert(interpreter);
assert(interpreter->backend_nesting == 0);
#ifdef CONFIG_ECMASCRIPT_SEE
see_put_interpreter(interpreter);
#else
@ -161,39 +162,51 @@ ecmascript_eval(struct ecmascript_interpreter *interpreter,
if (!get_ecmascript_enable())
return;
assert(interpreter);
interpreter->backend_nesting++;
#ifdef CONFIG_ECMASCRIPT_SEE
see_eval(interpreter, code, ret);
#else
spidermonkey_eval(interpreter, code, ret);
#endif
interpreter->backend_nesting--;
}
unsigned char *
ecmascript_eval_stringback(struct ecmascript_interpreter *interpreter,
struct string *code)
{
unsigned char *result;
if (!get_ecmascript_enable())
return NULL;
assert(interpreter);
interpreter->backend_nesting++;
#ifdef CONFIG_ECMASCRIPT_SEE
return see_eval_stringback(interpreter, code);
result = see_eval_stringback(interpreter, code);
#else
return spidermonkey_eval_stringback(interpreter, code);
result = spidermonkey_eval_stringback(interpreter, code);
#endif
interpreter->backend_nesting--;
return result;
}
int
ecmascript_eval_boolback(struct ecmascript_interpreter *interpreter,
struct string *code)
{
int result;
if (!get_ecmascript_enable())
return -1;
assert(interpreter);
interpreter->backend_nesting++;
#ifdef CONFIG_ECMASCRIPT_SEE
return see_eval_boolback(interpreter, code);
result = see_eval_boolback(interpreter, code);
#else
return spidermonkey_eval_boolback(interpreter, code);
result = spidermonkey_eval_boolback(interpreter, code);
#endif
interpreter->backend_nesting--;
return result;
}

View File

@ -18,6 +18,12 @@ struct view_state;
struct ecmascript_interpreter {
struct view_state *vs;
void *backend_data;
/* Nesting level of calls to backend functions. When this is
* nonzero, there are references to backend_data in the C
* stack, so it is not safe to free the data yet. */
int backend_nesting;
/* Used by document.write() */
struct string *ret;