summaryrefslogtreecommitdiffstats
path: root/generic/tkText.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2012-01-25 21:14:19 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2012-01-25 21:14:19 (GMT)
commite00c2c981a3b57e4025d73be062318aa6ab17a6d (patch)
treee9665bba1fa5305a3954ad06939ee5bd49afcc16 /generic/tkText.c
parentd0ec7cfad69280c901ae3184aea3ca1156a60acb (diff)
parentf309ff804398b57a180a79ebaaa297a8343a1c84 (diff)
downloadtk-e00c2c981a3b57e4025d73be062318aa6ab17a6d.zip
tk-e00c2c981a3b57e4025d73be062318aa6ab17a6d.tar.gz
tk-e00c2c981a3b57e4025d73be062318aa6ab17a6d.tar.bz2
[Bug-1630271]: segfault/infinite loop when a mark is before -startline
Diffstat (limited to 'generic/tkText.c')
-rw-r--r--generic/tkText.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/generic/tkText.c b/generic/tkText.c
index fe358b6..9e14de9 100644
--- a/generic/tkText.c
+++ b/generic/tkText.c
@@ -2034,6 +2034,7 @@ ConfigureText(
if (mask & TK_TEXT_LINE_RANGE) {
int start, end, current;
+ TkTextIndex index1, index2, index3;
/*
* Line start and/or end have been adjusted. We need to validate the
@@ -2060,13 +2061,15 @@ ConfigureText(
return TCL_ERROR;
}
current = TkBTreeLinesTo(NULL, textPtr->topIndex.linePtr);
+ TkTextMakeByteIndex(textPtr->sharedTextPtr->tree, NULL, start, 0,
+ &index1);
+ TkTextMakeByteIndex(textPtr->sharedTextPtr->tree, NULL, end, 0,
+ &index2);
if (current < start || current > end) {
TkTextSearch search;
- TkTextIndex index1, first, last;
+ TkTextIndex first, last;
int selChanged = 0;
- TkTextMakeByteIndex(textPtr->sharedTextPtr->tree, NULL, start, 0,
- &index1);
TkTextSetYView(textPtr, &index1, 0);
/*
@@ -2110,6 +2113,29 @@ ConfigureText(
textPtr->abortSelections = 1;
}
}
+
+ /* Indices are potentially obsolete after changing -startline and/or
+ * -endline, therefore increase the epoch.
+ * Also, clamp the insert and current (unshared) marks to the new
+ * -startline/-endline range limits of the widget. All other (shared)
+ * marks are unchanged.
+ */
+
+ textPtr->sharedTextPtr->stateEpoch++;
+ TkTextMarkNameToIndex(textPtr, "insert", &index3);
+ if (TkTextIndexCmp(&index3, &index1) < 0) {
+ textPtr->insertMarkPtr = TkTextSetMark(textPtr, "insert", &index1);
+ }
+ if (TkTextIndexCmp(&index3, &index2) > 0) {
+ textPtr->insertMarkPtr = TkTextSetMark(textPtr, "insert", &index2);
+ }
+ TkTextMarkNameToIndex(textPtr, "current", &index3);
+ if (TkTextIndexCmp(&index3, &index1) < 0) {
+ textPtr->currentMarkPtr = TkTextSetMark(textPtr, "current", &index1);
+ }
+ if (TkTextIndexCmp(&index3, &index2) > 0) {
+ textPtr->currentMarkPtr = TkTextSetMark(textPtr, "current", &index2);
+ }
textPtr->sharedTextPtr->stateEpoch++;
}