From: Regina Obe Date: Sun, 19 May 2013 13:01:36 +0000 (+0000) Subject: #2332 windows 64 EDB crasher on invalid wkb using ST_GeomFromWKB - fix by using simil... X-Git-Tag: 2.1.0beta3~54 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5dac72b1885667956b13bf874c7a536e5313d78c;p=postgis #2332 windows 64 EDB crasher on invalid wkb using ST_GeomFromWKB - fix by using similar logic to go ST_GeomFromEWKB and skipping intermediary call. git-svn-id: http://svn.osgeo.org/postgis/trunk@11473 b70326c6-7e19-0410-871a-916f4a2858ee --- diff --git a/postgis/lwgeom_ogc.c b/postgis/lwgeom_ogc.c index 6ab5925f3..ffb7f5b4e 100644 --- a/postgis/lwgeom_ogc.c +++ b/postgis/lwgeom_ogc.c @@ -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) */