diff options
author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-01-25 21:14:19 (GMT) |
---|---|---|
committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2012-01-25 21:14:19 (GMT) |
commit | e00c2c981a3b57e4025d73be062318aa6ab17a6d (patch) | |
tree | e9665bba1fa5305a3954ad06939ee5bd49afcc16 /generic/tkText.c | |
parent | d0ec7cfad69280c901ae3184aea3ca1156a60acb (diff) | |
parent | f309ff804398b57a180a79ebaaa297a8343a1c84 (diff) | |
download | tk-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.c | 32 |
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++; } |