From be327538df7738d7b1614576c4a86dcf83c0d55e Mon Sep 17 00:00:00 2001 From: Jarod Wilson Date: Thu, 14 Dec 2006 20:47:40 +0000 Subject: [PATCH] Fix for log grid memory leak (#201241) --- rrdtool-1.2.15-log_grid_leak.patch | 135 +++++++++++++++++++++++++++++ rrdtool.spec | 7 +- 2 files changed, 141 insertions(+), 1 deletion(-) create mode 100644 rrdtool-1.2.15-log_grid_leak.patch diff --git a/rrdtool-1.2.15-log_grid_leak.patch b/rrdtool-1.2.15-log_grid_leak.patch new file mode 100644 index 0000000..1c3236b --- /dev/null +++ b/rrdtool-1.2.15-log_grid_leak.patch @@ -0,0 +1,135 @@ +diff -urp rrdtool-1.2.15.orig/src/rrd_graph.c rrdtool-1.2.15/src/rrd_graph.c +--- rrdtool-1.2.15.orig/src/rrd_graph.c 2006-07-14 08:11:26.000000000 -0400 ++++ rrdtool-1.2.15/src/rrd_graph.c 2006-12-14 15:37:05.000000000 -0500 +@@ -1060,8 +1060,9 @@ data_proc( image_desc_t *im ){ + ** relevant for min and max + */ + if (finite(paintval) && im->gdes[ii].gf != GF_TICK ) { +- if (isnan(minval) || paintval < minval) +- minval = paintval; ++ if ((isnan(minval) || paintval < minval ) && ++ ! (im->logarithmic && paintval <= 0.0)) ++ minval = paintval; + if (isnan(maxval) || paintval > maxval) + maxval = paintval; + } +@@ -1710,6 +1711,35 @@ double frexp10(double x, double *e) { + return mnt; + } + ++static int AlmostEqual2sComplement (float A, float B, int maxUlps) ++{ ++ ++ int aInt = *(int*)&A; ++ int bInt = *(int*)&B; ++ int intDiff; ++ /* Make sure maxUlps is non-negative and small enough that the ++ default NAN won't compare as equal to anything. */ ++ ++ /* assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024); */ ++ ++ /* Make aInt lexicographically ordered as a twos-complement int */ ++ ++ if (aInt < 0) ++ aInt = 0x80000000l - aInt; ++ ++ /* Make bInt lexicographically ordered as a twos-complement int */ ++ ++ if (bInt < 0) ++ bInt = 0x80000000l - bInt; ++ ++ intDiff = abs(aInt - bInt); ++ ++ if (intDiff <= maxUlps) ++ return 1; ++ ++ return 0; ++} ++ + /* logaritmic horizontal grid */ + int + horizontal_log_grid(image_desc_t *im) +@@ -1719,7 +1749,8 @@ horizontal_log_grid(image_desc_t *im) + {1.0, 5.0, 10., 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.0, 2.0, 5.0, 7.0, 10., 0.0, 0.0, 0.0, 0.0, 0.0}, + {1.0, 2.0, 4.0, 6.0, 8.0, 10., 0.0, 0.0, 0.0, 0.0}, +- {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.}}; ++ {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.}, ++ {0,0,0,0,0, 0,0,0,0,0} /* last line */ }; + + int i, j, val_exp, min_exp; + double nex; /* number of decades in data */ +@@ -1728,7 +1759,7 @@ horizontal_log_grid(image_desc_t *im) + int mid = -1; /* row in yloglab for major grid */ + double mspac; /* smallest major grid spacing (pixels) */ + int flab; /* first value in yloglab to use */ +- double value, tmp; ++ double value, tmp, pre_value; + double X0,X1,Y0; + char graph_label[100]; + +@@ -1747,11 +1778,11 @@ horizontal_log_grid(image_desc_t *im) + mid++; + for(i = 0; yloglab[mid][i + 1] < 10.0; i++); + mspac = logscale * log10(10.0 / yloglab[mid][i]); +- } while(mspac > 2 * im->text_prop[TEXT_PROP_LEGEND].size && mid < 5); ++ } while(mspac > 2 * im->text_prop[TEXT_PROP_LEGEND].size && yloglab[mid][0] > 0); + if(mid) mid--; + + /* find first value in yloglab */ +- for(flab = 0; frexp10(im->minval, &tmp) > yloglab[mid][flab]; flab++); ++ for(flab = 0; yloglab[mid][flab] < 10 && frexp10(im->minval, &tmp) > yloglab[mid][flab] ; flab++); + if(yloglab[mid][flab] == 10.0) { + tmp += 1.0; + flab = 0; +@@ -1763,8 +1794,13 @@ horizontal_log_grid(image_desc_t *im) + X1=im->xorigin+im->xsize; + + /* draw grid */ +- while(1) { ++ pre_value = DNAN; ++ while(1) { ++ + value = yloglab[mid][flab] * pow(10.0, val_exp); ++ if ( AlmostEqual2sComplement(value,pre_value,4) ) break; /* it seems we are not converging */ ++ ++ pre_value = value; + + Y0 = ytr(im, value); + if(Y0 <= im->yorigin - im->ysize) break; +@@ -2484,34 +2520,6 @@ graph_size_location(image_desc_t *im, in + /* yes we are loosing precision by doing tos with floats instead of doubles + but it seems more stable this way. */ + +-static int AlmostEqual2sComplement (float A, float B, int maxUlps) +-{ +- +- int aInt = *(int*)&A; +- int bInt = *(int*)&B; +- int intDiff; +- /* Make sure maxUlps is non-negative and small enough that the +- default NAN won't compare as equal to anything. */ +- +- /* assert(maxUlps > 0 && maxUlps < 4 * 1024 * 1024); */ +- +- /* Make aInt lexicographically ordered as a twos-complement int */ +- +- if (aInt < 0) +- aInt = 0x80000000l - aInt; +- +- /* Make bInt lexicographically ordered as a twos-complement int */ +- +- if (bInt < 0) +- bInt = 0x80000000l - bInt; +- +- intDiff = abs(aInt - bInt); +- +- if (intDiff <= maxUlps) +- return 1; +- +- return 0; +-} + + /* draw that picture thing ... */ + int +Only in rrdtool-1.2.15/src: rrd_graph.c.orig diff --git a/rrdtool.spec b/rrdtool.spec index 260ee0b..5c1ce25 100644 --- a/rrdtool.spec +++ b/rrdtool.spec @@ -7,7 +7,7 @@ Summary: Round Robin Database Tool to store and display time-series data Name: rrdtool Version: 1.2.15 -Release: 7%{?dist} +Release: 8%{?dist} License: GPL Group: Applications/Databases URL: http://people.ee.ethz.ch/~oetiker/webtools/%{name}/ @@ -15,6 +15,7 @@ Source0: http://people.ee.ethz.ch/~oetiker/webtools/%{name}/pub/%{name}-%{versio Source1: php4-svn%{php_rrd_svn}.tar.gz Patch0: rrdtool-1.2.13-php.patch Patch1: rrdtool-1.2.15-initrrdtool.patch +Patch2: rrdtool-1.2.15-log_grid_leak.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: gcc-c++, openssl-devel, freetype-devel BuildRequires: libpng-devel, zlib-devel, libart_lgpl-devel >= 2.0 @@ -112,6 +113,7 @@ The %{name}-tcl package includes RRDtool bindings for Tcl. %patch0 -p0 -b .php %endif %patch1 -p1 -b .initrrdtool +%patch2 -p1 -b .leak # Fix to find correct python dir on lib64 %{__perl} -pi -e 's|get_python_lib\(0,0,prefix|get_python_lib\(1,0,prefix|g' \ @@ -270,6 +272,9 @@ find examples/ -type f -exec chmod 0644 {} \; %endif %changelog +* Thu Dec 14 2006 Jarod Wilson 1.2.15-8 +- Fix for log grid memory leak (#201241) + * Tue Dec 12 2006 Jarod Wilson 1.2.15-7 - Rebuild for python 2.5