Fix a crash of I-search in a bidi-reordered buffer.
authorEli Zaretskii <eliz@gnu.org>
Tue, 30 Mar 2010 16:29:02 +0000 (19:29 +0300)
committerEli Zaretskii <eliz@gnu.org>
Tue, 30 Mar 2010 16:29:02 +0000 (19:29 +0300)
 bidi.c (bidi_cache_iterator_state): Invalidate the cache if we
 are outside the range of cached character positions.

src/ChangeLog
src/bidi.c

index 7809565..44c5525 100644 (file)
@@ -1,3 +1,8 @@
+2010-03-30  Eli Zaretskii  <eliz@gnu.org>
+
+       * bidi.c (bidi_cache_iterator_state): Invalidate the cache if we
+       are outside the range of cached character positions.
+
 2010-03-30  Juanma Barranquero  <lekktu@gmail.com>
 
        * makefile.w32-in ($(BLD)/bidi.$(O)): Add dependency on w32gui.h.
index d5e28cd..ea47cd3 100644 (file)
@@ -671,10 +671,16 @@ bidi_cache_iterator_state (struct bidi_it *bidi_it, int resolved)
       /* Don't overrun the cache limit.  */
       if (idx > sizeof (bidi_cache) / sizeof (bidi_cache[0]) - 1)
        abort ();
-      /* Don't violate cache integrity: character positions should
-        correspond to cache positions 1:1.  */
-      if (idx > 0 && bidi_it->charpos != bidi_cache[idx - 1].charpos + 1)
-       abort ();
+      /* Character positions should correspond to cache positions 1:1.
+        If we are outside the range of cached positions, the cache is
+        useless and must be reset.  */
+      if (idx > 0 &&
+         (bidi_it->charpos > bidi_cache[idx - 1].charpos + 1
+          || bidi_it->charpos < bidi_cache[0].charpos))
+       {
+         bidi_cache_reset ();
+         idx = 0;
+       }
       bidi_copy_it (&bidi_cache[idx], bidi_it);
       if (!resolved)
        bidi_cache[idx].resolved_level = -1;