]> granicus.if.org Git - postgis/commitdiff
Fix huge number overflow in export functions, cf #277
authorOlivier Courtin <olivier.courtin@camptocamp.com>
Tue, 27 Oct 2009 21:39:35 +0000 (21:39 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Tue, 27 Oct 2009 21:39:35 +0000 (21:39 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@4682 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/lwgeom_export.h
postgis/lwgeom_geojson.c
postgis/lwgeom_gml.c
postgis/lwgeom_kml.c
postgis/lwgeom_svg.c

index e63a246a0fcdfbcfc0cc1dc0862575c702895dbd..6b91f35a38065f754c3c2c2fb5c8465975a5602d 100644 (file)
@@ -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 */
 
index e0ce03b120bed746248ca48997db08bf74249334..ea0bd00d0b33f149eda0d4b49ac73aa362edccf4 100644 (file)
@@ -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);
                }
index 68200d1d72e5c49add4ab55a47bba6eb94e78eb8..ffa39b71063c82cf51882c6b9b30c0f956b4744f 100644 (file)
@@ -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);
index 552ad6936e819b5ef83919eb80c5e5205ace6db3..6d813688013a3601d485a31ec6c58f6fcefdc8f4 100644 (file)
@@ -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);
                }
index ee60ab0a1c6aa874d3f3547e426d60761c29e101..93e2834894a1c68c22313f11c9120cd4b674ef09 100644 (file)
@@ -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);