From: Olivier Courtin Date: Tue, 27 Oct 2009 21:39:35 +0000 (+0000) Subject: Fix huge number overflow in export functions, cf #277 X-Git-Tag: 1.5.0b1~342 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d8b24fc8879267b6ddd56cdfd602584f1cc34655;p=postgis Fix huge number overflow in export functions, cf #277 git-svn-id: http://svn.osgeo.org/postgis/trunk@4682 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis/lwgeom_export.h b/postgis/lwgeom_export.h index e63a246a0..6b91f35a3 100644 --- a/postgis/lwgeom_export.h +++ b/postgis/lwgeom_export.h @@ -13,7 +13,8 @@ * Commons define and prototype function for all export functions */ -#define SHOW_DIGS_DOUBLE 15 +#define MAX_DOUBLE 1E15 +#define SHOW_DIGS_DOUBLE 20 #define MAX_DOUBLE_PRECISION 15 #define MAX_DIGS_DOUBLE (SHOW_DIGS_DOUBLE + 2) /* +2 mean add dot and sign */ diff --git a/postgis/lwgeom_geojson.c b/postgis/lwgeom_geojson.c index e0ce03b12..ea0bd00d0 100644 --- a/postgis/lwgeom_geojson.c +++ b/postgis/lwgeom_geojson.c @@ -833,10 +833,19 @@ pointArray_to_geojson(POINTARRAY *pa, char *output, int precision) { POINT2D pt; getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); + if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s]", x, y); } @@ -847,12 +856,25 @@ pointArray_to_geojson(POINTARRAY *pa, char *output, int precision) { POINT4D pt; getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); + + if (fabs(pt.z) < MAX_DOUBLE) + sprintf(z, "%.*f", precision, pt.z); + else + sprintf(z, "%g", pt.z); trim_trailing_zeros(z); + if ( i ) ptr += sprintf(ptr, ","); ptr += sprintf(ptr, "[%s,%s,%s]", x, y, z); } diff --git a/postgis/lwgeom_gml.c b/postgis/lwgeom_gml.c index 68200d1d7..ffa39b710 100644 --- a/postgis/lwgeom_gml.c +++ b/postgis/lwgeom_gml.c @@ -459,10 +459,19 @@ pointArray_toGML2(POINTARRAY *pa, char *output, int precision) { POINT2D pt; getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); + if ( i ) ptr += sprintf(ptr, " "); ptr += sprintf(ptr, "%s,%s", x, y); } @@ -473,12 +482,25 @@ pointArray_toGML2(POINTARRAY *pa, char *output, int precision) { POINT4D pt; getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); + + if (fabs(pt.z) < MAX_DOUBLE) + sprintf(z, "%.*f", precision, pt.z); + else + sprintf(z, "%g", pt.z); trim_trailing_zeros(z); + if ( i ) ptr += sprintf(ptr, " "); ptr += sprintf(ptr, "%s,%s,%s", x, y, z); } @@ -839,10 +861,19 @@ pointArray_toGML3(POINTARRAY *pa, char *output, int precision, bool is_deegree) { POINT2D pt; getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); + if ( i ) ptr += sprintf(ptr, " "); if (is_deegree) ptr += sprintf(ptr, "%s %s", y, x); @@ -856,12 +887,25 @@ pointArray_toGML3(POINTARRAY *pa, char *output, int precision, bool is_deegree) { POINT4D pt; getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); + + if (fabs(pt.z) < MAX_DOUBLE) + sprintf(z, "%.*f", precision, pt.z); + else + sprintf(z, "%g", pt.z); trim_trailing_zeros(z); + if ( i ) ptr += sprintf(ptr, " "); if (is_deegree) ptr += sprintf(ptr, "%s %s %s", y, x, z); diff --git a/postgis/lwgeom_kml.c b/postgis/lwgeom_kml.c index 552ad6936..6d8136880 100644 --- a/postgis/lwgeom_kml.c +++ b/postgis/lwgeom_kml.c @@ -391,10 +391,19 @@ pointArray_toKML2(POINTARRAY *pa, char *output, int precision) { POINT2D pt; getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); + if ( i ) ptr += sprintf(ptr, " "); ptr += sprintf(ptr, "%s,%s", x, y); } @@ -405,12 +414,25 @@ pointArray_toKML2(POINTARRAY *pa, char *output, int precision) { POINT4D pt; getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); + + if (fabs(pt.z) < MAX_DOUBLE) + sprintf(z, "%.*f", precision, pt.z); + else + sprintf(z, "%g", pt.z); trim_trailing_zeros(z); + if ( i ) ptr += sprintf(ptr, " "); ptr += sprintf(ptr, "%s,%s,%s", x, y, z); } diff --git a/postgis/lwgeom_svg.c b/postgis/lwgeom_svg.c index ee60ab0a1..93e283489 100644 --- a/postgis/lwgeom_svg.c +++ b/postgis/lwgeom_svg.c @@ -152,10 +152,18 @@ assvg_point_buf(LWPOINT *point, char * output, bool circle, int precision) POINT2D pt; getPoint2d_p(point->point, 0, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); + /* SVG Y axis is reversed, an no need to transform 0 into -0 */ - sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1 : pt.y); + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1 : pt.y); + else + sprintf(y, "%g", fabs(pt.y) ? pt.y * -1 : pt.y); trim_trailing_zeros(y); if (circle) ptr += sprintf(ptr, "x=\"%s\" y=\"%s\"", x, y); @@ -616,23 +624,42 @@ pointArray_svg_rel(POINTARRAY *pa, char *output, bool close_ring, int precision) /* Starting point */ getPoint2d_p(pa, 0, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1 : pt.y); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1 : pt.y); + else + sprintf(y, "%g", fabs(pt.y) ? pt.y * -1 : pt.y); trim_trailing_zeros(y); + ptr += sprintf(ptr,"%s %s l", x, y); /* All the following ones */ for (i=1 ; i < end ; i++) { lpt = pt; + getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x -lpt.x); + if (fabs(pt.x -lpt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x -lpt.x); + else + sprintf(x, "%g", pt.x -lpt.x); trim_trailing_zeros(x); + /* SVG Y axis is reversed, an no need to transform 0 into -0 */ - sprintf(y, "%.*f", precision, - fabs(pt.y -lpt.y) ? (pt.y - lpt.y) * -1: (pt.y - lpt.y)); + if (fabs(pt.y -lpt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, + fabs(pt.y -lpt.y) ? (pt.y - lpt.y) * -1: (pt.y - lpt.y)); + else + sprintf(y, "%g", + fabs(pt.y -lpt.y) ? (pt.y - lpt.y) * -1: (pt.y - lpt.y)); trim_trailing_zeros(y); + ptr += sprintf(ptr," %s %s", x, y); } @@ -660,11 +687,20 @@ pointArray_svg_abs(POINTARRAY *pa, char *output, bool close_ring, int precision) for (i=0 ; i < end ; i++) { getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); trim_trailing_zeros(x); + /* SVG Y axis is reversed, an no need to transform 0 into -0 */ - sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1:pt.y); + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1:pt.y); + else + sprintf(y, "%g", fabs(pt.y) ? pt.y * -1:pt.y); trim_trailing_zeros(y); + if (i == 1) ptr += sprintf(ptr, " L "); else if (i) ptr += sprintf(ptr, " "); ptr += sprintf(ptr,"%s %s", x, y);