From aff4deb1051f578be23a9c8449439e912d976c08 Mon Sep 17 00:00:00 2001
From: jenglish <jenglish@flightlab.com>
Date: Mon, 11 Oct 2010 21:34:45 +0000
Subject: Fix crash in 'tag add' / 'tag remove' when no -tags specified
 [SF#3085489].

---
 ChangeLog                 |  5 +++++
 generic/ttk/ttkTreeview.c |  8 ++++----
 tests/ttk/treeview.test   | 24 ++++++++++++++++++++++--
 3 files changed, 31 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fbbefe7..fbcc6d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-11  Joe English  <jenglish@users.sourceforge.net>
+
+	* generic/ttk/ttkTreeview.c: Fix crash in 'tag add' / 'tag remove'
+	commands when no -tags specified [Bug 3085489].
+
 2010-10-11  Jan Nijtmans  <nijtmans@users.sf.net>
 
 	* win/tkWinMenu.c:    [FRQ 2965056]: Windows build with -DUNICODE
diff --git a/generic/ttk/ttkTreeview.c b/generic/ttk/ttkTreeview.c
index 899ab17..d7afb3c 100644
--- a/generic/ttk/ttkTreeview.c
+++ b/generic/ttk/ttkTreeview.c
@@ -1,4 +1,4 @@
-/* $Id: ttkTreeview.c,v 1.40 2010/09/08 17:57:07 jenglish Exp $
+/* $Id: ttkTreeview.c,v 1.41 2010/10/11 21:34:45 jenglish Exp $
  * Copyright (c) 2004, Joe English
  *
  * ttk::treeview widget implementation.
@@ -3140,7 +3140,7 @@ static int TreeviewTagNamesCommand(
 static void AddTag(TreeItem *item, Ttk_Tag tag)
 {
     if (Ttk_TagSetAdd(item->tagset, tag)) {
-	Tcl_DecrRefCount(item->tagsObj);
+	if (item->tagsObj) Tcl_DecrRefCount(item->tagsObj);
 	item->tagsObj = Ttk_NewTagSetObj(item->tagset);
 	Tcl_IncrRefCount(item->tagsObj);
     }
@@ -3173,12 +3173,12 @@ static int TreeviewTagAddCommand(
     return TCL_OK;
 }
 
-/* + $tv tag remove $tag $items
+/* + $tv tag remove $tag ?$items?
  */
 static void RemoveTag(TreeItem *item, Ttk_Tag tag)
 {
     if (Ttk_TagSetRemove(item->tagset, tag)) {
-	Tcl_DecrRefCount(item->tagsObj);
+	if (item->tagsObj) Tcl_DecrRefCount(item->tagsObj);
 	item->tagsObj = Ttk_NewTagSetObj(item->tagset);
 	Tcl_IncrRefCount(item->tagsObj);
     }
diff --git a/tests/ttk/treeview.test b/tests/ttk/treeview.test
index 2cb1704..79d4b17 100644
--- a/tests/ttk/treeview.test
+++ b/tests/ttk/treeview.test
@@ -1,5 +1,5 @@
 #
-# $Id: treeview.test,v 1.7 2010/05/27 19:27:04 jenglish Exp $
+# $Id: treeview.test,v 1.8 2010/10/11 21:34:45 jenglish Exp $
 #
 # [7Jun2005] TO CHECK: [$tv see {}] -- shouldn't work (at least, shouldn't do
 # what it currently does)
@@ -571,7 +571,7 @@ test treeview-identify-8 "identify element" -body {
 } -match glob -result [list \
 	branch $disclosure branch2 $disclosure branch3 $disclosure]
 
-# See #2381555 
+# See #2381555
 test treeview-identify-9 "identify works when horizontally scrolled" -setup {
     .tv configure -show {tree headings}
     foreach column {#0 A B C} {
@@ -618,4 +618,24 @@ test treeview-3006842 "Null bindings" -setup {
     destroy .tv
 }
 
+test treeview-3085489-1 "tag add, no -tags" -setup {
+    ttk::treeview .tv
+} -body {
+    set item [.tv insert {} end]
+    .tv tag add foo $item
+    .tv item $item -tags
+} -cleanup {
+    destroy .tv
+} -result [list foo]
+
+test treeview-3085489-2 "tag remove, no -tags" -setup {
+    ttk::treeview .tv
+} -body {
+    set item [.tv insert {} end]
+    .tv tag remove foo $item
+    .tv item $item -tags
+} -cleanup {
+    destroy .tv
+} -result [list]
+
 tcltest::cleanupTests
-- 
cgit v0.12