summaryrefslogtreecommitdiffstats
path: root/generic/tkGrid.c
diff options
context:
space:
mode:
authorhobbs <hobbs>2006-04-05 20:54:57 (GMT)
committerhobbs <hobbs>2006-04-05 20:54:57 (GMT)
commit233def41ad7e30f677c7e69623ab106681512142 (patch)
tree87b817c26e91bf9f461be17eef696a844d18f48a /generic/tkGrid.c
parente6f05ce155f63c235dc449765bd95f23d598861e (diff)
downloadtk-233def41ad7e30f677c7e69623ab106681512142.zip
tk-233def41ad7e30f677c7e69623ab106681512142.tar.gz
tk-233def41ad7e30f677c7e69623ab106681512142.tar.bz2
* tests/grid.test: fix segfault on empty or "all" index list
* generic/tkGrid.c (GridRowColumnConfigureCommand): [Bug 1422430]
Diffstat (limited to 'generic/tkGrid.c')
-rw-r--r--generic/tkGrid.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/generic/tkGrid.c b/generic/tkGrid.c
index 2b5dfef..fc68c5b 100644
--- a/generic/tkGrid.c
+++ b/generic/tkGrid.c
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkGrid.c,v 1.42 2006/01/11 19:53:47 pspjuth Exp $
+ * RCS: @(#) $Id: tkGrid.c,v 1.43 2006/04/05 20:54:58 hobbs Exp $
*/
#include "tkInt.h"
@@ -946,15 +946,24 @@ GridRowColumnConfigureCommand(tkwin, interp, objc, objv)
}
string = Tcl_GetString(objv[1]);
- masterPtr = GetGrid(master);
slotType = (*string == 'c') ? COLUMN : ROW;
+ if (lObjc == 0) {
+ Tcl_AppendResult(interp, "no ",
+ (slotType == COLUMN) ? "column" : "row",
+ " indices specified", (char *) NULL);
+ return TCL_ERROR;
+ }
+
+ masterPtr = GetGrid(master);
first = 0; /* lint */
last = 0; /* lint */
if ((objc == 4) || (objc == 5)) {
if (lObjc != 1) {
- Tcl_AppendResult(interp, Tcl_GetString(objv[3]),
- " must be a single element.", NULL);
+ Tcl_AppendResult(interp, Tcl_GetString(objv[0]), " ",
+ Tcl_GetString(objv[1]),
+ ": must specify a single element on retrieval",
+ (char *) NULL);
return TCL_ERROR;
}
if (Tcl_GetIntFromObj(interp, lObjv[0], &slot) != TCL_OK) {
@@ -1038,6 +1047,10 @@ GridRowColumnConfigureCommand(tkwin, interp, objc, objv)
last = slot;
slavePtr = NULL;
} else if (strcmp(Tcl_GetString(lObjv[j]), "all") == 0) {
+ /*
+ * Reset any lingering error from e.g GetInt.
+ */
+ Tcl_ResetResult(interp);
slavePtr = masterPtr->slavePtr;
if (slavePtr == NULL) {
continue;
@@ -1049,9 +1062,9 @@ GridRowColumnConfigureCommand(tkwin, interp, objc, objv)
* Is it gridded in this master?
*/
+ Tcl_ResetResult(interp);
slavePtr = GetGrid(slave);
if (slavePtr->masterPtr != masterPtr) {
- Tcl_ResetResult(interp);
Tcl_AppendResult(interp, Tcl_GetString(objv[0]), " ",
Tcl_GetString(objv[1]), ": the window \"",
Tcl_GetString(lObjv[j]), "\" is not managed by \"",
@@ -1067,12 +1080,6 @@ GridRowColumnConfigureCommand(tkwin, interp, objc, objv)
}
/*
- * Reset any lingering error from e.g GetInt.
- */
-
- Tcl_ResetResult(interp);
-
- /*
* The outer loop is only to handle "all".
*/
@@ -1156,25 +1163,27 @@ GridRowColumnConfigureCommand(tkwin, interp, objc, objv)
/*
* We changed a property, re-arrange the table, and check for constraint
- * shrinkage.
+ * shrinkage. A null slotPtr will occur for 'all' checks.
*/
- if (slotType == ROW) {
- int last = masterPtr->masterDataPtr->rowMax - 1;
- while ((last >= 0) && (slotPtr[last].weight == 0)
- && (slotPtr[last].pad == 0) && (slotPtr[last].minSize == 0)
- && (slotPtr[last].uniform == NULL)) {
- last--;
- }
- masterPtr->masterDataPtr->rowMax = last+1;
- } else {
- int last = masterPtr->masterDataPtr->columnMax - 1;
- while ((last >= 0) && (slotPtr[last].weight == 0)
- && (slotPtr[last].pad == 0) && (slotPtr[last].minSize == 0)
- && (slotPtr[last].uniform == NULL)) {
- last--;
+ if (slotPtr != NULL) {
+ if (slotType == ROW) {
+ int last = masterPtr->masterDataPtr->rowMax - 1;
+ while ((last >= 0) && (slotPtr[last].weight == 0)
+ && (slotPtr[last].pad == 0) && (slotPtr[last].minSize == 0)
+ && (slotPtr[last].uniform == NULL)) {
+ last--;
+ }
+ masterPtr->masterDataPtr->rowMax = last+1;
+ } else {
+ int last = masterPtr->masterDataPtr->columnMax - 1;
+ while ((last >= 0) && (slotPtr[last].weight == 0)
+ && (slotPtr[last].pad == 0) && (slotPtr[last].minSize == 0)
+ && (slotPtr[last].uniform == NULL)) {
+ last--;
+ }
+ masterPtr->masterDataPtr->columnMax = last + 1;
}
- masterPtr->masterDataPtr->columnMax = last + 1;
}
if (masterPtr->abortPtr != NULL) {