]> 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:37:37 +0000 (21:37 +0000)
committerOlivier Courtin <olivier.courtin@camptocamp.com>
Tue, 27 Oct 2009 21:37:37 +0000 (21:37 +0000)
git-svn-id: http://svn.osgeo.org/postgis/branches/1.4@4681 b70326c6-7e19-0410-871a-916f4a2858ee

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

index 0d46fb45bf860da8621dca4951edf42e487e7278..3b5d87624bdd612c8a8617ad19732a727c8aacc5 100644 (file)
@@ -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; i<pa->npoints; 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; i<pa->npoints; 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);
                }
        }
 
index 97538e52ca8ac5426855f8c52a9ebb7996d5069c..aae854f88708731b19fd1b32318a343c24899546 100644 (file)
@@ -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; i<pa->npoints; 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; i<pa->npoints; 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; i<pa->npoints; 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; i<pa->npoints; 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);
                }
        }
 
index df826f29de745e46ed08743a22fcff4d8b79a1ee..ea07b2efe53d7d05e667c7ee3fc62802bbacc00e 100644 (file)
@@ -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; i<pa->npoints; 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; i<pa->npoints; 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);
                }
        }
 
index e2db0fbbc5b2d96742223a0080bb42b6b1bc3a02..e0de9d59a7b3a719da1db897b1cbe474b05f2748 100644 (file)
@@ -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);
 }