From: Scott Kostyshak Date: Fri, 27 Jul 2018 19:28:22 +0000 (-0400) Subject: Fix crash when selecting text with changes X-Git-Tag: 2.3.3~102 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=0af6a43b6aec8ccc4afe36545a76cd6be727c7b6;p=features.git Fix crash when selecting text with changes When selecting text, in some cases a DocIterator could be forwarded to a (non-existant) paragraph after the end. The critical part of this fix is to break the loop at the correct place. The following are additional improvements: - increase readability by defining a bool named "in_last_par" - use cur.selectionEnd().pit() instead of cur.selectionEnd().paragraph().id() - use it.lastpos() instead of it.paragraph().size() This commit fixes a regression introduced by 23de5e5e, and reported at #11204. Thanks to Jürgen and JMarc. (cherry picked from commit d12798759aeb7bae77bec63098fd81f8cc9e554b) --- diff --git a/src/Text3.cpp b/src/Text3.cpp index e75fad0548..b5f9e33f47 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -3207,17 +3207,20 @@ bool Text::getStatus(Cursor & cur, FuncRequest const & cmd, if (!cur.buffer()->areChangesPresent()) break; - for (DocIterator it = cur.selectionBegin(); it < cur.selectionEnd(); it.forwardPar()) { + for (DocIterator it = cur.selectionBegin(); ; it.forwardPar()) { pos_type const beg = it.pos(); pos_type end; - if (it.paragraph().id() == cur.selectionEnd().paragraph().id()) + bool const in_last_par = (it.pit() == cur.selectionEnd().pit()); + if (in_last_par) end = cur.selectionEnd().pos(); else - end = it.paragraph().size(); + end = it.lastpos(); if (beg != end && it.paragraph().isChanged(beg, end)) { enable = true; break; } + if (in_last_par) + break; } } break;