]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix spurious regexp reentrancy error
authorMattias Engdegård <mattiase@acm.org>
Tue, 19 Mar 2019 12:06:20 +0000 (13:06 +0100)
committerMattias Engdegård <mattiase@acm.org>
Sat, 30 Mar 2019 10:48:25 +0000 (11:48 +0100)
* src/search.c (compile_pattern): Don't give up if the last regexp
cache entry is busy.  Instead, use the last (least recently used)
non-busy entry, and only signal a reentrancy error if there is no free
entry at all (Bug#34910).

src/search.c

index e15e2b94e5f97c28e77414571a70581b512ef055..07ff0e47643b99c7238a073f9adf01d4ab575a7b 100644 (file)
@@ -198,11 +198,13 @@ static struct regexp_cache *
 compile_pattern (Lisp_Object pattern, struct re_registers *regp,
                 Lisp_Object translate, bool posix, bool multibyte)
 {
-  struct regexp_cache *cp, **cpp;
+  struct regexp_cache *cp, **cpp, **lru_nonbusy;
 
-  for (cpp = &searchbuf_head; ; cpp = &cp->next)
+  for (cpp = &searchbuf_head, lru_nonbusy = NULL; ; cpp = &cp->next)
     {
       cp = *cpp;
+      if (!cp->busy)
+        lru_nonbusy = cpp;
       /* Entries are initialized to nil, and may be set to nil by
         compile_pattern_1 if the pattern isn't valid.  Don't apply
         string accessors in those cases.  However, compile_pattern_1
@@ -222,13 +224,14 @@ compile_pattern (Lisp_Object pattern, struct re_registers *regp,
          && cp->buf.charset_unibyte == charset_unibyte)
        break;
 
-      /* If we're at the end of the cache, compile into the nil cell
-        we found, or the last (least recently used) cell with a
-        string value.  */
+      /* If we're at the end of the cache, compile into the last
+        (least recently used) non-busy cell in the cache.  */
       if (cp->next == 0)
        {
-          if (cp->busy)
+          if (!lru_nonbusy)
             error ("Too much matching reentrancy");
+          cpp = lru_nonbusy;
+          cp = *cpp;
        compile_it:
           eassert (!cp->busy);
          compile_pattern_1 (cp, pattern, translate, posix);