summaryrefslogtreecommitdiffstats
path: root/generic/tkTextBTree.c
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2012-02-28 20:44:34 (GMT)
committerfvogel <fvogelnew1@free.fr>2012-02-28 20:44:34 (GMT)
commit5f980e90395c85af59bb9286b197a620d8ba911f (patch)
treed62de6938569517afd6274d9096c99eadec78078 /generic/tkTextBTree.c
parent9893c7fae421e1414f8e19acd5059350093c49c3 (diff)
parent220b6aecbb178564d3ee630cf19c6aa8ae93a67d (diff)
downloadtk-5f980e90395c85af59bb9286b197a620d8ba911f.zip
tk-5f980e90395c85af59bb9286b197a620d8ba911f.tar.gz
tk-5f980e90395c85af59bb9286b197a620d8ba911f.tar.bz2
[Bug-1630262], [Bug-1615425]: segfault when deleting lines or tagging outside of the -startline/-endline range with peer text widgets. [Bug-3487407]: Weird text indices.
Diffstat (limited to 'generic/tkTextBTree.c')
-rw-r--r--generic/tkTextBTree.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/generic/tkTextBTree.c b/generic/tkTextBTree.c
index 572c623..e34dae7 100644
--- a/generic/tkTextBTree.c
+++ b/generic/tkTextBTree.c
@@ -658,12 +658,12 @@ AdjustStartEndRefs(
if (textPtr->start != NULL) {
count--;
treePtr->startEnd[count] = textPtr->start;
- treePtr->startEndRef[count] = treePtr->sharedTextPtr->peers;
+ treePtr->startEndRef[count] = textPtr;
}
if (textPtr->end != NULL) {
count--;
treePtr->startEnd[count] = textPtr->end;
- treePtr->startEndRef[count] = treePtr->sharedTextPtr->peers;
+ treePtr->startEndRef[count] = textPtr;
}
}
}
@@ -1606,7 +1606,7 @@ TkBTreeFindLine(
}
/*
- * Check for the any start/end offset for this text widget.
+ * Check for any start/end offset for this text widget.
*/
if (textPtr != NULL) {
@@ -1988,12 +1988,37 @@ TkBTreeLinesTo(
index += nodePtr2->numLines;
}
}
- if (textPtr != NULL && textPtr->start != NULL) {
- index -= TkBTreeLinesTo(NULL, textPtr->start);
+ if (textPtr != NULL) {
+ /*
+ * The index to return must be relative to textPtr, not to the entire
+ * tree. Take care to never return a negative index when linePtr
+ * denotes a line before -startline, or an index larger than the
+ * number of lines in textPtr when linePtr is a line past -endline.
+ */
+
+ int indexStart, indexEnd;
+
+ if (textPtr->start != NULL) {
+ indexStart = TkBTreeLinesTo(NULL, textPtr->start);
+ } else {
+ indexStart = 0;
+ }
+ if (textPtr->end != NULL) {
+ indexEnd = TkBTreeLinesTo(NULL, textPtr->end);
+ } else {
+ indexEnd = TkBTreeNumLines(textPtr->sharedTextPtr->tree, NULL);
+ }
+ if (index < indexStart) {
+ index = 0;
+ } else if (index > indexEnd) {
+ index = TkBTreeNumLines(textPtr->sharedTextPtr->tree, textPtr);
+ } else {
+ index -= indexStart;
+ }
}
return index;
}
-
+
/*
*----------------------------------------------------------------------
*