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:
parent
9f75e1f094
commit
58e3ebf2e7
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user