0
0
mirror of https://github.com/rkd77/elinks.git synced 2025-06-30 22:19:29 -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) ecmascript_put_interpreter(struct ecmascript_interpreter *interpreter)
{ {
assert(interpreter); assert(interpreter);
assert(interpreter->backend_nesting == 0);
#ifdef CONFIG_ECMASCRIPT_SEE #ifdef CONFIG_ECMASCRIPT_SEE
see_put_interpreter(interpreter); see_put_interpreter(interpreter);
#else #else
@ -161,39 +162,51 @@ ecmascript_eval(struct ecmascript_interpreter *interpreter,
if (!get_ecmascript_enable()) if (!get_ecmascript_enable())
return; return;
assert(interpreter); assert(interpreter);
interpreter->backend_nesting++;
#ifdef CONFIG_ECMASCRIPT_SEE #ifdef CONFIG_ECMASCRIPT_SEE
see_eval(interpreter, code, ret); see_eval(interpreter, code, ret);
#else #else
spidermonkey_eval(interpreter, code, ret); spidermonkey_eval(interpreter, code, ret);
#endif #endif
interpreter->backend_nesting--;
} }
unsigned char * unsigned char *
ecmascript_eval_stringback(struct ecmascript_interpreter *interpreter, ecmascript_eval_stringback(struct ecmascript_interpreter *interpreter,
struct string *code) struct string *code)
{ {
unsigned char *result;
if (!get_ecmascript_enable()) if (!get_ecmascript_enable())
return NULL; return NULL;
assert(interpreter); assert(interpreter);
interpreter->backend_nesting++;
#ifdef CONFIG_ECMASCRIPT_SEE #ifdef CONFIG_ECMASCRIPT_SEE
return see_eval_stringback(interpreter, code); result = see_eval_stringback(interpreter, code);
#else #else
return spidermonkey_eval_stringback(interpreter, code); result = spidermonkey_eval_stringback(interpreter, code);
#endif #endif
interpreter->backend_nesting--;
return result;
} }
int int
ecmascript_eval_boolback(struct ecmascript_interpreter *interpreter, ecmascript_eval_boolback(struct ecmascript_interpreter *interpreter,
struct string *code) struct string *code)
{ {
int result;
if (!get_ecmascript_enable()) if (!get_ecmascript_enable())
return -1; return -1;
assert(interpreter); assert(interpreter);
interpreter->backend_nesting++;
#ifdef CONFIG_ECMASCRIPT_SEE #ifdef CONFIG_ECMASCRIPT_SEE
return see_eval_boolback(interpreter, code); result = see_eval_boolback(interpreter, code);
#else #else
return spidermonkey_eval_boolback(interpreter, code); result = spidermonkey_eval_boolback(interpreter, code);
#endif #endif
interpreter->backend_nesting--;
return result;
} }

View File

@ -18,6 +18,12 @@ struct view_state;
struct ecmascript_interpreter { struct ecmascript_interpreter {
struct view_state *vs; struct view_state *vs;
void *backend_data; 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() */ /* Used by document.write() */
struct string *ret; struct string *ret;