Fix computation of regex stack limit
The regex stack limit was being computed as the number of stack entries, whereas it was being compared with the current size as measured in bytes. This could cause indefinite looping when nearing the stack limit if re_max_failures happened not to be a multiple of sizeof fail_stack_elt_t (Bug #24751). * src/regex.c (GROW_FAIL_STACK): Compute both current stack size and limit as numbers of stack entries.
This commit is contained in:
parent
88a501b30d
commit
9a19f26cd7
1 changed files with 6 additions and 9 deletions
15
src/regex.c
15
src/regex.c
|
@ -1320,23 +1320,20 @@ typedef struct
|
|||
#define FAIL_STACK_GROWTH_FACTOR 4
|
||||
|
||||
#define GROW_FAIL_STACK(fail_stack) \
|
||||
(((fail_stack).size * sizeof (fail_stack_elt_t) \
|
||||
>= re_max_failures * TYPICAL_FAILURE_SIZE) \
|
||||
(((fail_stack).size >= re_max_failures * TYPICAL_FAILURE_SIZE) \
|
||||
? 0 \
|
||||
: ((fail_stack).stack \
|
||||
= REGEX_REALLOCATE_STACK ((fail_stack).stack, \
|
||||
(fail_stack).size * sizeof (fail_stack_elt_t), \
|
||||
min (re_max_failures * TYPICAL_FAILURE_SIZE, \
|
||||
((fail_stack).size * sizeof (fail_stack_elt_t) \
|
||||
* FAIL_STACK_GROWTH_FACTOR))), \
|
||||
min (re_max_failures * TYPICAL_FAILURE_SIZE, \
|
||||
((fail_stack).size * FAIL_STACK_GROWTH_FACTOR)) \
|
||||
* sizeof (fail_stack_elt_t)), \
|
||||
\
|
||||
(fail_stack).stack == NULL \
|
||||
? 0 \
|
||||
: ((fail_stack).size \
|
||||
= (min (re_max_failures * TYPICAL_FAILURE_SIZE, \
|
||||
((fail_stack).size * sizeof (fail_stack_elt_t) \
|
||||
* FAIL_STACK_GROWTH_FACTOR)) \
|
||||
/ sizeof (fail_stack_elt_t)), \
|
||||
= (min (re_max_failures * TYPICAL_FAILURE_SIZE, \
|
||||
((fail_stack).size * FAIL_STACK_GROWTH_FACTOR))), \
|
||||
1)))
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue