From dc30a4a2bd1fbfaae45a2a23460ba88e108f75b2 Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Fri, 29 Nov 2013 17:03:57 +0100
Subject: [PATCH] FakeVim: Prevent crash in scrollToLine with Qt 4

There seem to be cases where QTextLines::isValid() returns true but
its lines_ are empty.

Change-Id: Ia4b9a66aec8d10754f7ff7dd0c90e7295e2a2220
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 src/plugins/fakevim/fakevimhandler.cpp | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp
index 5c14eb1b0ce..7460bb1de79 100644
--- a/src/plugins/fakevim/fakevimhandler.cpp
+++ b/src/plugins/fakevim/fakevimhandler.cpp
@@ -6477,10 +6477,19 @@ void FakeVimHandler::Private::scrollToLine(int line)
     EDITOR(setTextCursor(tc2));
     EDITOR(ensureCursorVisible());
 
+    int offset = 0;
     const QTextBlock block = document()->findBlockByLineNumber(line);
-    const QTextLine textLine = block.isValid()
-        ? block.layout()->lineAt(line - block.firstLineNumber()) : QTextLine();
-    tc2.setPosition(block.position() + (textLine.isValid() ? textLine.textStart() : 0));
+    if (block.isValid()) {
+        const int blockLineCount = block.layout()->lineCount();
+        const int lineInBlock = line - block.firstLineNumber();
+        if (0 <= lineInBlock && lineInBlock < blockLineCount) {
+            QTextLine textLine = block.layout()->lineAt(lineInBlock);
+            offset = textLine.textStart();
+        } else {
+//            QTC_CHECK(false);
+        }
+    }
+    tc2.setPosition(block.position() + offset);
     EDITOR(setTextCursor(tc2));
     EDITOR(ensureCursorVisible());
 
-- 
GitLab