summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkjnash <k.j.nash@usa.net>2017-06-13 18:15:46 (GMT)
committerkjnash <k.j.nash@usa.net>2017-06-13 18:15:46 (GMT)
commit0d8755e7bb74882ca10bb7cbde4fb4097cb2cc51 (patch)
tree0783d7c109ac2b5667533b5299d32a80deb45d8c
parentd28664f9b1810d40530b09cdcb91eddede0f298d (diff)
downloadtk-0d8755e7bb74882ca10bb7cbde4fb4097cb2cc51.zip
tk-0d8755e7bb74882ca10bb7cbde4fb4097cb2cc51.tar.gz
tk-0d8755e7bb74882ca10bb7cbde4fb4097cb2cc51.tar.bz2
Test whether in a safe interpreter before writing to the PRIMARY selection. Fixes bug [de156e9efe]. Ready for testing.
-rw-r--r--generic/tkEntry.c18
-rw-r--r--generic/tkListbox.c15
-rw-r--r--generic/tkText.c8
-rw-r--r--generic/tkTextTag.c1
-rw-r--r--generic/ttk/ttkEntry.c9
5 files changed, 32 insertions, 19 deletions
diff --git a/generic/tkEntry.c b/generic/tkEntry.c
index 9e25bed..25774cc 100644
--- a/generic/tkEntry.c
+++ b/generic/tkEntry.c
@@ -887,7 +887,8 @@ EntryWidgetObjCmd(
entryPtr->selectLast = index2;
}
if (!(entryPtr->flags & GOT_SELECTION)
- && (entryPtr->exportSelection)) {
+ && (entryPtr->exportSelection)
+ && (!Tcl_IsSafe(entryPtr->interp))) {
Tk_OwnSelection(entryPtr->tkwin, XA_PRIMARY,
EntryLostSelection, entryPtr);
entryPtr->flags |= GOT_SELECTION;
@@ -1122,7 +1123,7 @@ ConfigureEntry(
* value.
*/
- oldExport = entryPtr->exportSelection;
+ oldExport = (entryPtr->exportSelection) && (!Tcl_IsSafe(entryPtr->interp));
if (entryPtr->type == TK_SPINBOX) {
oldValues = sbPtr->valueStr;
oldFormat = sbPtr->reqFormat;
@@ -1276,6 +1277,7 @@ ConfigureEntry(
*/
if (entryPtr->exportSelection && (!oldExport)
+ && (!Tcl_IsSafe(entryPtr->interp))
&& (entryPtr->selectFirst != -1)
&& !(entryPtr->flags & GOT_SELECTION)) {
Tk_OwnSelection(entryPtr->tkwin, XA_PRIMARY, EntryLostSelection,
@@ -2745,7 +2747,8 @@ EntrySelectTo(
* Grab the selection if we don't own it already.
*/
- if (!(entryPtr->flags & GOT_SELECTION) && (entryPtr->exportSelection)) {
+ if (!(entryPtr->flags & GOT_SELECTION) && (entryPtr->exportSelection)
+ && (!Tcl_IsSafe(entryPtr->interp))) {
Tk_OwnSelection(entryPtr->tkwin, XA_PRIMARY, EntryLostSelection,
entryPtr);
entryPtr->flags |= GOT_SELECTION;
@@ -2812,7 +2815,8 @@ EntryFetchSelection(
const char *string;
const char *selStart, *selEnd;
- if ((entryPtr->selectFirst < 0) || !(entryPtr->exportSelection)) {
+ if ((entryPtr->selectFirst < 0) || (!entryPtr->exportSelection)
+ || Tcl_IsSafe(entryPtr->interp)) {
return -1;
}
string = entryPtr->displayString;
@@ -2865,7 +2869,8 @@ EntryLostSelection(
*/
if (TkpAlwaysShowSelection(entryPtr->tkwin)
- && (entryPtr->selectFirst >= 0) && entryPtr->exportSelection) {
+ && (entryPtr->selectFirst >= 0) && entryPtr->exportSelection
+ && (!Tcl_IsSafe(entryPtr->interp))) {
entryPtr->selectFirst = -1;
entryPtr->selectLast = -1;
EventuallyRedraw(entryPtr);
@@ -4034,7 +4039,8 @@ SpinboxWidgetObjCmd(
entryPtr->selectLast = index2;
}
if (!(entryPtr->flags & GOT_SELECTION)
- && entryPtr->exportSelection) {
+ && entryPtr->exportSelection
+ && (!Tcl_IsSafe(entryPtr->interp))) {
Tk_OwnSelection(entryPtr->tkwin, XA_PRIMARY,
EntryLostSelection, entryPtr);
entryPtr->flags |= GOT_SELECTION;
diff --git a/generic/tkListbox.c b/generic/tkListbox.c
index b059727..b18a7f4 100644
--- a/generic/tkListbox.c
+++ b/generic/tkListbox.c
@@ -1565,7 +1565,7 @@ ConfigureListbox(
Tcl_Obj *errorResult = NULL;
int oldExport, error;
- oldExport = listPtr->exportSelection;
+ oldExport = (listPtr->exportSelection) && (!Tcl_IsSafe(listPtr->interp));
if (listPtr->listVarName != NULL) {
Tcl_UntraceVar2(interp, listPtr->listVarName, NULL,
TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,
@@ -1607,10 +1607,11 @@ ConfigureListbox(
/*
* Claim the selection if we've suddenly started exporting it and
- * there is a selection to export.
+ * there is a selection to export and this interp is unsafe.
*/
- if (listPtr->exportSelection && !oldExport
+ if (listPtr->exportSelection && (!oldExport)
+ && (!Tcl_IsSafe(listPtr->interp))
&& (listPtr->numSelected != 0)) {
Tk_OwnSelection(listPtr->tkwin, XA_PRIMARY,
ListboxLostSelection, listPtr);
@@ -3079,7 +3080,8 @@ ListboxSelect(
EventuallyRedrawRange(listPtr, first, last);
}
if ((oldCount == 0) && (listPtr->numSelected > 0)
- && listPtr->exportSelection) {
+ && (listPtr->exportSelection)
+ && (!Tcl_IsSafe(listPtr->interp))) {
Tk_OwnSelection(listPtr->tkwin, XA_PRIMARY,
ListboxLostSelection, listPtr);
}
@@ -3125,7 +3127,7 @@ ListboxFetchSelection(
const char *stringRep;
Tcl_HashEntry *entry;
- if (!listPtr->exportSelection) {
+ if ((!listPtr->exportSelection) || Tcl_IsSafe(listPtr->interp)) {
return -1;
}
@@ -3196,7 +3198,8 @@ ListboxLostSelection(
{
register Listbox *listPtr = clientData;
- if ((listPtr->exportSelection) && (listPtr->nElements > 0)) {
+ if ((listPtr->exportSelection) && (!Tcl_IsSafe(listPtr->interp))
+ && (listPtr->nElements > 0)) {
ListboxSelect(listPtr, 0, listPtr->nElements-1, 0);
GenerateListboxSelectEvent(listPtr);
}
diff --git a/generic/tkText.c b/generic/tkText.c
index 6ff1db9..b5ba1c4 100644
--- a/generic/tkText.c
+++ b/generic/tkText.c
@@ -2077,7 +2077,7 @@ ConfigureText(
Tcl_Obj *const objv[]) /* Argument objects. */
{
Tk_SavedOptions savedOptions;
- int oldExport = textPtr->exportSelection;
+ int oldExport = (textPtr->exportSelection) && (!Tcl_IsSafe(textPtr->interp));
int mask = 0;
if (Tk_SetOptions(interp, (char *) textPtr, textPtr->optionTable,
@@ -2306,7 +2306,7 @@ ConfigureText(
* are tagged characters.
*/
- if (textPtr->exportSelection && (!oldExport)) {
+ if (textPtr->exportSelection && (!oldExport) && (!Tcl_IsSafe(textPtr->interp))) {
TkTextSearch search;
TkTextIndex first, last;
@@ -3377,7 +3377,7 @@ TextFetchSelection(
TkTextSearch search;
TkTextSegment *segPtr;
- if (!textPtr->exportSelection) {
+ if ((!textPtr->exportSelection) || Tcl_IsSafe(textPtr->interp)) {
return -1;
}
@@ -3507,7 +3507,7 @@ TkTextLostSelection(
if (TkpAlwaysShowSelection(textPtr->tkwin)) {
TkTextIndex start, end;
- if (!textPtr->exportSelection) {
+ if ((!textPtr->exportSelection) || Tcl_IsSafe(textPtr->interp)) {
return;
}
diff --git a/generic/tkTextTag.c b/generic/tkTextTag.c
index d9329f5..9ade3ad 100644
--- a/generic/tkTextTag.c
+++ b/generic/tkTextTag.c
@@ -243,6 +243,7 @@ TkTextTagCmd(
TkTextSelectionEvent(textPtr);
if (addTag && textPtr->exportSelection
+ && (!Tcl_IsSafe(textPtr->interp))
&& !(textPtr->flags & GOT_SELECTION)) {
Tk_OwnSelection(textPtr->tkwin, XA_PRIMARY,
TkTextLostSelection, textPtr);
diff --git a/generic/ttk/ttkEntry.c b/generic/ttk/ttkEntry.c
index a25574a..83f1a38 100644
--- a/generic/ttk/ttkEntry.c
+++ b/generic/ttk/ttkEntry.c
@@ -337,7 +337,8 @@ EntryFetchSelection(
const char *string;
const char *selStart, *selEnd;
- if (entryPtr->entry.selectFirst < 0 || !entryPtr->entry.exportSelection) {
+ if (entryPtr->entry.selectFirst < 0 || (!entryPtr->entry.exportSelection)
+ || Tcl_IsSafe(entryPtr->core.interp)) {
return -1;
}
string = entryPtr->entry.displayString;
@@ -372,11 +373,12 @@ static void EntryLostSelection(ClientData clientData)
/* EntryOwnSelection --
* Assert ownership of the PRIMARY selection,
- * if -exportselection set and selection is present.
+ * if -exportselection set and selection is present and interp is unsafe.
*/
static void EntryOwnSelection(Entry *entryPtr)
{
if (entryPtr->entry.exportSelection
+ && (!Tcl_IsSafe(entryPtr->core.interp))
&& !(entryPtr->core.flags & GOT_SELECTION)) {
Tk_OwnSelection(entryPtr->core.tkwin, XA_PRIMARY, EntryLostSelection,
(ClientData) entryPtr);
@@ -999,7 +1001,8 @@ static int EntryConfigure(Tcl_Interp *interp, void *recordPtr, int mask)
/* Claim the selection, in case we've suddenly started exporting it.
*/
- if (entryPtr->entry.exportSelection && entryPtr->entry.selectFirst != -1) {
+ if (entryPtr->entry.exportSelection && (entryPtr->entry.selectFirst != -1)
+ && (!Tcl_IsSafe(entryPtr->core.interp))) {
EntryOwnSelection(entryPtr);
}