summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNoam Postavsky <npostavs@gmail.com>2016-11-05 16:51:53 -0400
committerNoam Postavsky <npostavs@gmail.com>2017-01-08 18:45:52 -0500
commit9a19f26cd796c7321f659a8dbea5296b0eeea51d (patch)
tree4ad260064fe3688a22f269896233d3e5adb35169
parent88a501b30d18bf1965f5416df477521ed2ca3c89 (diff)
downloademacs-9a19f26cd796c7321f659a8dbea5296b0eeea51d.tar.gz
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.
-rw-r--r--src/regex.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/src/regex.c b/src/regex.c
index 7e70c494f47..8aa54331fc7 100644
--- a/src/regex.c
+++ b/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)))