# HG changeset patch # User Eli Zaretskii # Date 1269966542 -10800 # Node ID 0958f6c3f7c62efa832a6ba8830dc0a7f5df3bbc # Parent 9a8d281f69fd6712f58e8c88755407cce6f14793 Fix a crash of I-search in a bidi-reordered buffer. bidi.c (bidi_cache_iterator_state): Invalidate the cache if we are outside the range of cached character positions. diff -r 9a8d281f69fd -r 0958f6c3f7c6 src/ChangeLog --- a/src/ChangeLog Tue Mar 30 19:10:14 2010 +0300 +++ b/src/ChangeLog Tue Mar 30 19:29:02 2010 +0300 @@ -1,3 +1,8 @@ +2010-03-30 Eli Zaretskii + + * bidi.c (bidi_cache_iterator_state): Invalidate the cache if we + are outside the range of cached character positions. + 2010-03-30 Juanma Barranquero * makefile.w32-in ($(BLD)/bidi.$(O)): Add dependency on w32gui.h. diff -r 9a8d281f69fd -r 0958f6c3f7c6 src/bidi.c --- a/src/bidi.c Tue Mar 30 19:10:14 2010 +0300 +++ b/src/bidi.c Tue Mar 30 19:29:02 2010 +0300 @@ -671,10 +671,16 @@ /* 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;