diff options
author | dgp <dgp@users.sourceforge.net> | 2014-10-30 15:26:42 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2014-10-30 15:26:42 (GMT) |
commit | 56e5cece3f50562969449e4357e5dc1cf3907c1a (patch) | |
tree | c02cfebbe3bcc52d1170176fc41c1f6b977ed2ac | |
parent | 2de899be4f282336d57ace6810563233c87b13d6 (diff) | |
parent | 277e4c03ced86ddf627807595297854fac523c9a (diff) | |
download | tk-56e5cece3f50562969449e4357e5dc1cf3907c1a.zip tk-56e5cece3f50562969449e4357e5dc1cf3907c1a.tar.gz tk-56e5cece3f50562969449e4357e5dc1cf3907c1a.tar.bz2 |
[3417012] Stop [scale] segfault when -digits too big. Thanks fvogel.
-rw-r--r-- | generic/tkScale.c | 7 | ||||
-rw-r--r-- | generic/tkScale.h | 6 | ||||
-rw-r--r-- | macosx/tkMacOSXScale.c | 2 | ||||
-rw-r--r-- | tests/scale.test | 5 | ||||
-rw-r--r-- | unix/tkUnixScale.c | 8 |
5 files changed, 15 insertions, 13 deletions
diff --git a/generic/tkScale.c b/generic/tkScale.c index 7d72990..cc7c294 100644 --- a/generic/tkScale.c +++ b/generic/tkScale.c @@ -800,6 +800,9 @@ ComputeFormat( */ numDigits = scalePtr->digits; + if (numDigits > TCL_MAX_PREC) { + numDigits = 0; + } if (numDigits <= 0) { if (scalePtr->resolution > 0) { /* @@ -880,7 +883,7 @@ static void ComputeScaleGeometry( register TkScale *scalePtr) /* Information about widget. */ { - char valueString[PRINT_CHARS]; + char valueString[TCL_DOUBLE_SPACE]; int tmp, valuePixels, x, y, extraSpace; Tk_FontMetrics fm; @@ -1296,7 +1299,7 @@ ScaleSetVariable( register TkScale *scalePtr) /* Info about widget. */ { if (scalePtr->varNamePtr != NULL) { - char string[PRINT_CHARS]; + char string[TCL_DOUBLE_SPACE]; sprintf(string, scalePtr->format, scalePtr->value); scalePtr->flags |= SETTING_VAR; diff --git a/generic/tkScale.h b/generic/tkScale.h index af35978..4fd9995 100644 --- a/generic/tkScale.h +++ b/generic/tkScale.h @@ -215,12 +215,6 @@ typedef struct TkScale { #define SPACING 2 /* - * How many characters of space to provide when formatting the scale's value: - */ - -#define PRINT_CHARS 150 - -/* * Declaration of procedures used in the implementation of the scale widget. */ diff --git a/macosx/tkMacOSXScale.c b/macosx/tkMacOSXScale.c index 0bca521..c5a6f76 100644 --- a/macosx/tkMacOSXScale.c +++ b/macosx/tkMacOSXScale.c @@ -145,7 +145,7 @@ TkpDisplayScale( Tk_Window tkwin = scalePtr->tkwin; Tcl_Interp *interp = scalePtr->interp; int result; - char string[PRINT_CHARS]; + char string[TCL_DOUBLE_SPACE]; MacScale *macScalePtr = (MacScale *) clientData; Rect r; WindowRef windowRef; diff --git a/tests/scale.test b/tests/scale.test index 13ccb4d..1e072a0 100644 --- a/tests/scale.test +++ b/tests/scale.test @@ -688,6 +688,11 @@ test scale-6.20 {ComputeFormat procedure} -body { .s set 1001.23456789 .s get } -result {1001.235} +test scale-6.21 {ComputeFormat procedure} -body { + .s configure -length 200 -from 1000 -to 1001.8 -resolution 0 -digits 200 + .s set 1001.23456789 + .s get +} -result {1001.235} destroy .s diff --git a/unix/tkUnixScale.c b/unix/tkUnixScale.c index cc33a27..c348037 100644 --- a/unix/tkUnixScale.c +++ b/unix/tkUnixScale.c @@ -262,7 +262,7 @@ DisplayVerticalValue( { register Tk_Window tkwin = scalePtr->tkwin; int y, width, length; - char valueString[PRINT_CHARS]; + char valueString[TCL_DOUBLE_SPACE]; Tk_FontMetrics fm; Tk_GetFontMetrics(scalePtr->tkfont, &fm); @@ -341,7 +341,7 @@ DisplayHorizontalScale( */ if (tickInterval != 0) { - char valueString[PRINT_CHARS]; + char valueString[TCL_DOUBLE_SPACE]; double ticks, maxTicks; /* @@ -478,7 +478,7 @@ DisplayHorizontalValue( { register Tk_Window tkwin = scalePtr->tkwin; int x, y, length, width; - char valueString[PRINT_CHARS]; + char valueString[TCL_DOUBLE_SPACE]; Tk_FontMetrics fm; x = TkScaleValueToPixel(scalePtr, value); @@ -535,7 +535,7 @@ TkpDisplayScale( Tcl_Interp *interp = scalePtr->interp; Pixmap pixmap; int result; - char string[PRINT_CHARS]; + char string[TCL_DOUBLE_SPACE]; XRectangle drawnArea; Tcl_DString buf; |