Add RegExp recursion depth limit (#2543)
The regexp engine does not have any recursion depth check, thus it can cause problems with various regexps. Added a new build option `--regexp-recursion-limit N` whose default value is 0, which is for unlimited recursion depth. Also added a build-option-test. Fixes #2448 Fixes #2190 JerryScript-DCO-1.0-Signed-off-by: Istvan Miklos imiklos2@inf.u-szeged.hu
This commit is contained in:
@@ -28,6 +28,46 @@
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifdef REGEXP_RECURSION_LIMIT
|
||||
/**
|
||||
* Decrease the recursion counter and test it.
|
||||
* If the counter reaches the limit of the recursion depth
|
||||
* it will return with a range error.
|
||||
*/
|
||||
#define REGEXP_RECURSION_COUNTER_DECREASE_AND_TEST() \
|
||||
do \
|
||||
{ \
|
||||
if (--re_ctx_p->recursion_counter == 0) \
|
||||
{ \
|
||||
return ecma_raise_range_error (ECMA_ERR_MSG ("RegExp recursion limit is exceeded.")); \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
/**
|
||||
* Increase the recursion counter.
|
||||
*/
|
||||
#define REGEXP_RECURSION_COUNTER_INCREASE() (++re_ctx_p->recursion_counter)
|
||||
/**
|
||||
* Set the recursion counter to the max depth of the recursion.
|
||||
*/
|
||||
#define REGEXP_RECURSION_COUNTER_INIT() (re_ctx.recursion_counter = REGEXP_RECURSION_LIMIT)
|
||||
#else /* !REGEXP_RECURSION_LIMIT */
|
||||
/**
|
||||
* Decrease the recursion counter and test it.
|
||||
* If the counter reaches the limit of the recursion depth
|
||||
* it will return with a range error.
|
||||
*/
|
||||
#define REGEXP_RECURSION_COUNTER_DECREASE_AND_TEST()
|
||||
/**
|
||||
* Increase the recursion counter.
|
||||
*/
|
||||
#define REGEXP_RECURSION_COUNTER_INCREASE()
|
||||
/**
|
||||
* Set the recursion counter to the max depth of the recursion.
|
||||
*/
|
||||
#define REGEXP_RECURSION_COUNTER_INIT()
|
||||
#endif /* REGEXP_RECURSION_LIMIT */
|
||||
|
||||
/**
|
||||
* RegExp flags
|
||||
* Note:
|
||||
@@ -48,6 +88,9 @@ typedef struct
|
||||
const lit_utf8_byte_t **saved_p; /**< saved result string pointers, ECMA 262 v5, 15.10.2.1, State */
|
||||
const lit_utf8_byte_t *input_start_p; /**< start of input pattern string */
|
||||
const lit_utf8_byte_t *input_end_p; /**< end of input pattern string */
|
||||
#ifdef REGEXP_RECURSION_LIMIT
|
||||
uint32_t recursion_counter; /**< RegExp recursion counter */
|
||||
#endif /* REGEXP_RECURSION_LIMIT */
|
||||
uint32_t num_of_captures; /**< number of capture groups */
|
||||
uint32_t num_of_non_captures; /**< number of non-capture groups */
|
||||
uint32_t *num_of_iterations_p; /**< number of iterations */
|
||||
|
||||
Reference in New Issue
Block a user