From: Olivier Courtin Date: Tue, 27 Oct 2009 21:37:37 +0000 (+0000) Subject: Fix huge number overflow in export functions, cf #277 X-Git-Tag: 1.4.1rc1~19 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e58b289686abad7323bde37ccdb652bd5c300f8b;p=postgis Fix huge number overflow in export functions, cf #277 git-svn-id: http://svn.osgeo.org/postgis/branches/1.4@4681 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis/lwgeom_geojson.c b/postgis/lwgeom_geojson.c index 0d46fb45b..3b5d87624 100644 --- a/postgis/lwgeom_geojson.c +++ b/postgis/lwgeom_geojson.c @@ -39,7 +39,8 @@ static size_t pointArray_to_geojson(POINTARRAY *pa, char *buf, int precision); static size_t pointArray_geojson_size(POINTARRAY *pa, int precision); static char *getSRSbySRID(int SRID, bool short_crs); -#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 */ @@ -839,29 +840,51 @@ pointArray_to_geojson(POINTARRAY *pa, char *output, int precision) for (i=0; inpoints; i++) { POINT2D pt; - getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - if ( i ) ptr += sprintf(ptr, ","); - ptr += sprintf(ptr, "[%s,%s]", x, y); + getPoint2d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + 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); } } else { for (i=0; inpoints; i++) { - POINT4D pt; - getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); - trim_trailing_zeros(z); - if ( i ) ptr += sprintf(ptr, ","); - ptr += sprintf(ptr, "[%s,%s,%s]", x, y, z); + POINT4D pt; + getPoint4d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); + trim_trailing_zeros(y); + + 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 97538e52c..aae854f88 100644 --- a/postgis/lwgeom_gml.c +++ b/postgis/lwgeom_gml.c @@ -52,7 +52,8 @@ static size_t pointArray_GMLsize(POINTARRAY *pa, int precision); static char *getSRSbySRID(int SRID, bool short_crs); -#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 */ @@ -467,13 +468,22 @@ pointArray_toGML2(POINTARRAY *pa, char *output, int precision) for (i=0; inpoints; i++) { POINT2D pt; - getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - if ( i ) ptr += sprintf(ptr, " "); - ptr += sprintf(ptr, "%s,%s", x, y); + getPoint2d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + 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); } } else @@ -481,15 +491,28 @@ pointArray_toGML2(POINTARRAY *pa, char *output, int precision) for (i=0; inpoints; i++) { POINT4D pt; - getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); - trim_trailing_zeros(z); - if ( i ) ptr += sprintf(ptr, " "); - ptr += sprintf(ptr, "%s,%s,%s", x, y, z); + getPoint4d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); + trim_trailing_zeros(y); + + 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); } } @@ -846,36 +869,58 @@ pointArray_toGML3(POINTARRAY *pa, char *output, int precision, bool is_deegree) { for (i=0; inpoints; i++) { - POINT2D pt; - getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - if ( i ) ptr += sprintf(ptr, " "); - if (is_deegree) - ptr += sprintf(ptr, "%s %s", y, x); - else - ptr += sprintf(ptr, "%s %s", x, y); + POINT2D pt; + getPoint2d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + 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); + else + ptr += sprintf(ptr, "%s %s", x, y); } } else { for (i=0; inpoints; i++) { - POINT4D pt; - getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); - trim_trailing_zeros(z); - if ( i ) ptr += sprintf(ptr, " "); - if (is_deegree) - ptr += sprintf(ptr, "%s %s %s", y, x, z); - else - ptr += sprintf(ptr, "%s %s %s", x, y, z); + POINT4D pt; + getPoint4d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); + trim_trailing_zeros(y); + + 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); + else + ptr += sprintf(ptr, "%s %s %s", x, y, z); } } diff --git a/postgis/lwgeom_kml.c b/postgis/lwgeom_kml.c index df826f29d..ea07b2efe 100644 --- a/postgis/lwgeom_kml.c +++ b/postgis/lwgeom_kml.c @@ -41,7 +41,8 @@ static size_t pointArray_toKML2(POINTARRAY *pa, char *buf, int precision); static size_t pointArray_KMLsize(POINTARRAY *pa, int precision); -#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 */ @@ -392,30 +393,52 @@ pointArray_toKML2(POINTARRAY *pa, char *output, int precision) { for (i=0; inpoints; i++) { - POINT2D pt; - getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - if ( i ) ptr += sprintf(ptr, " "); - ptr += sprintf(ptr, "%s,%s", x, y); + POINT2D pt; + getPoint2d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + 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); } } else { for (i=0; inpoints; i++) { - POINT4D pt; - getPoint4d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, pt.y); - trim_trailing_zeros(y); - sprintf(z, "%.*f", precision, pt.z); - trim_trailing_zeros(z); - if ( i ) ptr += sprintf(ptr, " "); - ptr += sprintf(ptr, "%s,%s,%s", x, y, z); + POINT4D pt; + getPoint4d_p(pa, i, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + if (fabs(pt.y) < MAX_DOUBLE) + sprintf(y, "%.*f", precision, pt.y); + else + sprintf(y, "%g", pt.y); + trim_trailing_zeros(y); + + 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 e2db0fbbc..e0de9d59a 100644 --- a/postgis/lwgeom_svg.c +++ b/postgis/lwgeom_svg.c @@ -40,7 +40,8 @@ static size_t pointArray_svg_size(POINTARRAY *pa, int precision); static size_t pointArray_svg_rel(POINTARRAY *pa, char * output, bool close_ring, int precision); static size_t pointArray_svg_abs(POINTARRAY *pa, char * output, bool close_ring, int precision); -#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 */ @@ -144,27 +145,37 @@ assvg_point_size(LWPOINT *point, bool circle, int precision) return size; } + static size_t assvg_point_buf(LWPOINT *point, char * output, bool circle, int precision) { - char *ptr=output; - char x[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; - char y[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; - POINT2D pt; - - getPoint2d_p(point->point, 0, &pt); - sprintf(x, "%.*f", precision, 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); - trim_trailing_zeros(y); - - if (circle) ptr += sprintf(ptr, "x=\"%s\" y=\"%s\"", x, y); - else ptr += sprintf(ptr, "cx=\"%s\" cy=\"%s\"", x, y); - - return (ptr-output); + char *ptr=output; + char x[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; + char y[MAX_DIGS_DOUBLE+MAX_DOUBLE_PRECISION+1]; + POINT2D pt; + + getPoint2d_p(point->point, 0, &pt); + + 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 */ + 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); + else ptr += sprintf(ptr, "cx=\"%s\" cy=\"%s\"", x, y); + + return (ptr-output); } + static char * assvg_point(LWPOINT *point, bool circle, int precision) { @@ -615,26 +626,45 @@ pointArray_svg_rel(POINTARRAY *pa, char *output, bool close_ring, int precision) else end = pa->npoints - 1; /* Starting point */ - getPoint2d_p(pa, 0, &pt); - sprintf(x, "%.*f", precision, pt.x); - trim_trailing_zeros(x); - sprintf(y, "%.*f", precision, fabs(pt.y) ? pt.y * -1 : pt.y); - trim_trailing_zeros(y); - ptr += sprintf(ptr,"%s %s l", x, y); + getPoint2d_p(pa, 0, &pt); + + if (fabs(pt.x) < MAX_DOUBLE) + sprintf(x, "%.*f", precision, pt.x); + else + sprintf(x, "%g", pt.x); + trim_trailing_zeros(x); + + 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); - 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)); - trim_trailing_zeros(y); - ptr += sprintf(ptr," %s %s", x, y); - } + for (i=1 ; i < end ; i++) + { + lpt = pt; + + getPoint2d_p(pa, i, &pt); + 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 */ + 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); + } return (ptr-output); } @@ -658,17 +688,26 @@ pointArray_svg_abs(POINTARRAY *pa, char *output, bool close_ring, int precision) else end = pa->npoints - 1; for (i=0 ; i < end ; i++) - { - getPoint2d_p(pa, i, &pt); - sprintf(x, "%.*f", precision, 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); - trim_trailing_zeros(y); - if (i == 1) ptr += sprintf(ptr, " L "); - else if (i) ptr += sprintf(ptr, " "); - ptr += sprintf(ptr,"%s %s", x, y); - } + { + getPoint2d_p(pa, i, &pt); + + 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 */ + 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); + } return (ptr-output); }