]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix computation of regex stack limit
authorNoam Postavsky <npostavs@gmail.com>
Sat, 5 Nov 2016 20:51:53 +0000 (16:51 -0400)
committerNoam Postavsky <npostavs@gmail.com>
Sun, 8 Jan 2017 23:45:52 +0000 (18:45 -0500)
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.

src/regex.c

index 7e70c494f471b78f7d31a190fc1df49d5245d309..8aa54331fc7663db138a91ef773c3a0f348ea141 100644 (file)
@@ -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)))