]> granicus.if.org Git - postgis/commitdiff
#2332 windows 64 EDB crasher on invalid wkb using ST_GeomFromWKB - fix by using simil...
authorRegina Obe <lr@pcorp.us>
Sun, 19 May 2013 13:01:36 +0000 (13:01 +0000)
committerRegina Obe <lr@pcorp.us>
Sun, 19 May 2013 13:01:36 +0000 (13:01 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@11473 b70326c6-7e19-0410-871a-916f4a2858ee

postgis/lwgeom_ogc.c

index 6ab5925f38c62899a11c842eb3bb6412b272feca..ffb7f5b4eab8b09d68b7e55b49ac2834ab9cdcc3 100644 (file)
@@ -789,20 +789,26 @@ Datum LWGEOM_from_text(PG_FUNCTION_ARGS)
 PG_FUNCTION_INFO_V1(LWGEOM_from_WKB);
 Datum LWGEOM_from_WKB(PG_FUNCTION_ARGS)
 {
+       bytea *bytea_wkb = (bytea*)PG_GETARG_BYTEA_P(0);
+       int32 srid = 0;
        GSERIALIZED *geom;
-       int32 srid;
-       GSERIALIZED *result = NULL;
-
-       geom = (GSERIALIZED *)DatumGetPointer(DirectFunctionCall1(
-                                               LWGEOMFromWKB, PG_GETARG_DATUM(0)));
-
+       LWGEOM *lwgeom;
+       uint8_t *wkb = (uint8_t*)VARDATA(bytea_wkb);
+       
+       lwgeom = lwgeom_from_wkb(wkb, VARSIZE(bytea_wkb)-VARHDRSZ, LW_PARSER_CHECK_ALL);
+       
+       if ( lwgeom_needs_bbox(lwgeom) )
+               lwgeom_add_bbox(lwgeom);
+       
+       geom = geometry_serialize(lwgeom);
+       lwgeom_free(lwgeom);
+       PG_FREE_IF_COPY(bytea_wkb, 0);
+       
        if ( gserialized_get_srid(geom) != SRID_UNKNOWN )
        {
                elog(WARNING, "OGC WKB expected, EWKB provided - use GeometryFromEWKB() for this");
        }
-
-
-       /* read user-requested SRID if any */
+       
        if ( PG_NARGS() > 1 )
        {
                srid = PG_GETARG_INT32(1);
@@ -810,9 +816,7 @@ Datum LWGEOM_from_WKB(PG_FUNCTION_ARGS)
                        gserialized_set_srid(geom, srid);
        }
 
-       if ( ! result ) result = geom;
-
-       PG_RETURN_POINTER(result);
+       PG_RETURN_POINTER(geom);
 }
 
 /** convert LWGEOM to wkt (in TEXT format) */