From fc802115deb83f8acd0f0660100a0da7c543feb4 Mon Sep 17 00:00:00 2001 From: Bborie Park Date: Thu, 10 Apr 2014 21:53:49 +0000 Subject: [PATCH] by default, prevent PostGIS raster from using GDAL drivers that can easily be abused (VRT, MEM, WCS, WMS) git-svn-id: http://svn.osgeo.org/postgis/trunk@12457 b70326c6-7e19-0410-871a-916f4a2858ee --- NEWS | 2 + raster/rt_core/librtcore.h | 3 +- raster/rt_core/rt_geometry.c | 11 +++- raster/rt_core/rt_raster.c | 62 +++++++++++++++---- raster/rt_core/rt_util.c | 5 +- raster/rt_core/rt_warp.c | 22 ++++++- raster/rt_pg/rtpostgis.c | 8 ++- raster/test/cunit/cu_gdal.c | 9 ++- raster/test/regress/Makefile.in | 1 + .../test/regress/permitted_gdal_drivers.sql | 53 ++++++++++++++++ .../regress/permitted_gdal_drivers_expected | 9 +++ 11 files changed, 163 insertions(+), 22 deletions(-) create mode 100644 raster/test/regress/permitted_gdal_drivers.sql create mode 100644 raster/test/regress/permitted_gdal_drivers_expected diff --git a/NEWS b/NEWS index 908449fa6..42a7cf4b8 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ PostGIS 2.2.0 - #2565, ST_SummaryStats(tablename, rastercolumn, ...) uses ST_SummaryStatsAgg() - #2567, ST_Count(tablename, rastercolumn, ...) uses ST_CountAgg() + - By default, PostGIS raster prevents usage of GDAL VRT, WCS, WMS + and MEM drivers * Deprecated signatures * diff --git a/raster/rt_core/librtcore.h b/raster/rt_core/librtcore.h index 5a36f1583..2cf4054fb 100644 --- a/raster/rt_core/librtcore.h +++ b/raster/rt_core/librtcore.h @@ -1578,6 +1578,7 @@ rt_gdaldriver rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc); * to check for pixels with value * @param count : number of elements in bandNums and exclude_nodata_values * @param rtn_drv : is set to the GDAL driver object + * @param destroy_rtn_drv : if non-zero, caller must destroy the MEM driver * * @return GDAL dataset using GDAL MEM driver */ @@ -1587,7 +1588,7 @@ GDALDatasetH rt_raster_to_gdal_mem( uint32_t *bandNums, int *excludeNodataValues, int count, - GDALDriverH *rtn_drv + GDALDriverH *rtn_drv, int *destroy_rtn_drv ); /** diff --git a/raster/rt_core/rt_geometry.c b/raster/rt_core/rt_geometry.c index 6f571b107..6e18be821 100644 --- a/raster/rt_core/rt_geometry.c +++ b/raster/rt_core/rt_geometry.c @@ -838,6 +838,7 @@ rt_raster_gdal_polygonize( long j; OGRSFDriverH ogr_drv = NULL; GDALDriverH gdal_drv = NULL; + int destroy_gdal_drv = 0; GDALDatasetH memdataset = NULL; GDALRasterBandH gdal_band = NULL; OGRDataSourceH memdatasource = NULL; @@ -900,7 +901,7 @@ rt_raster_gdal_polygonize( /***************************************************** * Convert raster to GDAL MEM dataset *****************************************************/ - memdataset = rt_raster_to_gdal_mem(raster, NULL, bandNums, excludeNodataValues, 1, &gdal_drv); + memdataset = rt_raster_to_gdal_mem(raster, NULL, bandNums, excludeNodataValues, 1, &gdal_drv, &destroy_gdal_drv); if (NULL == memdataset) { rterror("rt_raster_gdal_polygonize: Couldn't convert raster to GDAL MEM dataset"); return NULL; @@ -921,6 +922,7 @@ rt_raster_gdal_polygonize( if (NULL == memdatasource) { rterror("rt_raster_gdal_polygonize: Couldn't create a OGR Datasource to store pols"); GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); return NULL; } @@ -930,6 +932,7 @@ rt_raster_gdal_polygonize( /* xxx jorgearevalo: what should we do now? */ GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); OGRReleaseDataSource(memdatasource); return NULL; @@ -952,6 +955,7 @@ rt_raster_gdal_polygonize( rterror("rt_raster_gdal_polygonize: Couldn't create layer to store polygons"); GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); OGRReleaseDataSource(memdatasource); return NULL; @@ -980,6 +984,7 @@ rt_raster_gdal_polygonize( rterror("rt_raster_gdal_polygonize: Couldn't get GDAL band to polygonize"); GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); OGR_Fld_Destroy(hFldDfn); OGR_DS_DeleteLayer(memdatasource, 0); OGRReleaseDataSource(memdatasource); @@ -1000,6 +1005,7 @@ rt_raster_gdal_polygonize( rterror("rt_raster_gdal_polygonize: Could not polygonize GDAL band"); GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); OGR_Fld_Destroy(hFldDfn); OGR_DS_DeleteLayer(memdatasource, 0); OGRReleaseDataSource(memdatasource); @@ -1040,6 +1046,7 @@ rt_raster_gdal_polygonize( rterror("rt_raster_gdal_polygonize: Could not allocate memory for geomval set"); GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); OGR_Fld_Destroy(hFldDfn); OGR_DS_DeleteLayer(memdatasource, 0); if (NULL != pszQuery) @@ -1071,6 +1078,7 @@ rt_raster_gdal_polygonize( OGR_F_Destroy(hFeature); GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); OGR_Fld_Destroy(hFldDfn); OGR_DS_DeleteLayer(memdatasource, 0); if (NULL != pszQuery) @@ -1172,6 +1180,7 @@ rt_raster_gdal_polygonize( RASTER_DEBUG(3, "destroying GDAL MEM raster"); GDALClose(memdataset); + if (destroy_gdal_drv) GDALDestroyDriver(gdal_drv); RASTER_DEBUG(3, "destroying OGR MEM vector"); OGR_Fld_Destroy(hFldDfn); diff --git a/raster/rt_core/rt_raster.c b/raster/rt_core/rt_raster.c index 19be44a36..53c8d46f0 100644 --- a/raster/rt_core/rt_raster.c +++ b/raster/rt_core/rt_raster.c @@ -1600,9 +1600,12 @@ rt_raster_clone(rt_raster raster, uint8_t deep) { * for freeing the returned data using CPLFree() */ uint8_t* -rt_raster_to_gdal(rt_raster raster, const char *srs, - char *format, char **options, uint64_t *gdalsize) { +rt_raster_to_gdal( + rt_raster raster, const char *srs, + char *format, char **options, uint64_t *gdalsize +) { GDALDriverH src_drv = NULL; + int destroy_src_drv = 0; GDALDatasetH src_ds = NULL; vsi_l_offset rtn_lenvsi; @@ -1625,7 +1628,7 @@ rt_raster_to_gdal(rt_raster raster, const char *srs, RASTER_DEBUGF(3, "output format is %s", format); /* load raster into a GDAL MEM raster */ - src_ds = rt_raster_to_gdal_mem(raster, srs, NULL, NULL, 0, &src_drv); + src_ds = rt_raster_to_gdal_mem(raster, srs, NULL, NULL, 0, &src_drv, &destroy_src_drv); if (NULL == src_ds) { rterror("rt_raster_to_gdal: Could not convert raster to GDAL MEM format"); return 0; @@ -1636,6 +1639,7 @@ rt_raster_to_gdal(rt_raster raster, const char *srs, if (NULL == rtn_drv) { rterror("rt_raster_to_gdal: Could not load the output GDAL driver"); GDALClose(src_ds); + if (destroy_src_drv) GDALDestroyDriver(src_drv); return 0; } RASTER_DEBUG(3, "Output driver loaded"); @@ -1651,16 +1655,17 @@ rt_raster_to_gdal(rt_raster raster, const char *srs, NULL, /* progress function */ NULL /* progress data */ ); - if (NULL == rtn_ds) { - rterror("rt_raster_to_gdal: Could not create the output GDAL dataset"); - GDALClose(src_ds); - return 0; - } /* close source dataset */ GDALClose(src_ds); + if (destroy_src_drv) GDALDestroyDriver(src_drv); RASTER_DEBUG(3, "Closed GDAL MEM raster"); + if (NULL == rtn_ds) { + rterror("rt_raster_to_gdal: Could not create the output GDAL dataset"); + return 0; + } + RASTER_DEBUGF(4, "dataset SRS: %s", GDALGetProjectionRef(rtn_ds)); /* close dataset, this also flushes any pending writes */ @@ -1712,6 +1717,8 @@ rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc) { rt_util_gdal_register_all(); count = GDALGetDriverCount(); + RASTER_DEBUGF(3, "%d drivers found", count); + rtn = (rt_gdaldriver) rtalloc(count * sizeof(struct rt_gdaldriver_t)); if (NULL == rtn) { rterror("rt_raster_gdal_drivers: Could not allocate memory for gdaldriver structure"); @@ -1739,7 +1746,7 @@ rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc) { txt_len = strlen(txt); if (cancc) { - RASTER_DEBUGF(3, "rt_raster_gdal_driver: driver %s (%d) supports CreateCopy() and VirtualIO()", txt, i); + RASTER_DEBUGF(3, "driver %s (%d) supports CreateCopy() and VirtualIO()", txt, i); } txt_len = (txt_len + 1) * sizeof(char); @@ -1777,7 +1784,7 @@ rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc) { ******************************************************************************/ /** - * Return GDAL dataset using GDAL MEM driver from raster + * Return GDAL dataset using GDAL MEM driver from raster. * * @param raster : raster to convert to GDAL MEM * @param srs : the raster's coordinate system in OGC WKT @@ -1787,6 +1794,7 @@ rt_raster_gdal_drivers(uint32_t *drv_count, uint8_t cancc) { * ignore nodata values for the band * @param count : number of elements in bandNums * @param rtn_drv : is set to the GDAL driver object + * @param destroy_rtn_drv : if non-zero, caller must destroy the MEM driver * * @return GDAL dataset using GDAL MEM driver */ @@ -1797,7 +1805,7 @@ rt_raster_to_gdal_mem( uint32_t *bandNums, int *excludeNodataValues, int count, - GDALDriverH *rtn_drv + GDALDriverH *rtn_drv, int *destroy_rtn_drv ) { GDALDriverH drv = NULL; GDALDatasetH ds = NULL; @@ -1822,10 +1830,16 @@ rt_raster_to_gdal_mem( assert(NULL != raster); assert(NULL != rtn_drv); + assert(NULL != destroy_rtn_drv); + + *destroy_rtn_drv = 0; /* store raster in GDAL MEM raster */ - if (!rt_util_gdal_driver_registered("MEM")) + if (!rt_util_gdal_driver_registered("MEM")) { + RASTER_DEBUG(4, "Registering MEM driver"); GDALRegister_MEM(); + *destroy_rtn_drv = 1; + } drv = GDALGetDriverByName("MEM"); if (NULL == drv) { rterror("rt_raster_to_gdal_mem: Could not load the MEM GDAL driver"); @@ -1833,6 +1847,12 @@ rt_raster_to_gdal_mem( } *rtn_drv = drv; + /* unload driver from GDAL driver manager */ + if (*destroy_rtn_drv) { + RASTER_DEBUG(4, "Deregistering MEM driver"); + GDALDeregisterDriver(drv); + } + width = rt_raster_get_width(raster); height = rt_raster_get_height(raster); ds = GDALCreate( @@ -2496,6 +2516,7 @@ rt_raster_gdal_rasterize( CPLErr cplerr; double _gt[6] = {0}; GDALDriverH _drv = NULL; + int unload_drv = 0; GDALDatasetH _ds = NULL; GDALRasterBandH _band = NULL; @@ -3117,8 +3138,11 @@ rt_raster_gdal_rasterize( _dim[0], _dim[1]); /* load GDAL mem */ - if (!rt_util_gdal_driver_registered("MEM")) + if (!rt_util_gdal_driver_registered("MEM")) { + RASTER_DEBUG(4, "Registering MEM driver"); GDALRegister_MEM(); + unload_drv = 1; + } _drv = GDALGetDriverByName("MEM"); if (NULL == _drv) { rterror("rt_raster_gdal_rasterize: Could not load the MEM GDAL driver"); @@ -3130,6 +3154,12 @@ rt_raster_gdal_rasterize( return NULL; } + /* unload driver from GDAL driver manager */ + if (unload_drv) { + RASTER_DEBUG(4, "Deregistering MEM driver"); + GDALDeregisterDriver(_drv); + } + _ds = GDALCreate(_drv, "", _dim[0], _dim[1], 0, GDT_Byte, NULL); if (NULL == _ds) { rterror("rt_raster_gdal_rasterize: Could not create a GDALDataset to rasterize the geometry into"); @@ -3137,6 +3167,7 @@ rt_raster_gdal_rasterize( OGR_G_DestroyGeometry(src_geom); _rti_rasterize_arg_destroy(arg); /* OGRCleanupAll(); */ + if (unload_drv) GDALDestroyDriver(_drv); return NULL; } @@ -3151,6 +3182,7 @@ rt_raster_gdal_rasterize( /* OGRCleanupAll(); */ GDALClose(_ds); + if (unload_drv) GDALDestroyDriver(_drv); return NULL; } @@ -3170,6 +3202,7 @@ rt_raster_gdal_rasterize( /* OGRCleanupAll(); */ GDALClose(_ds); + if (unload_drv) GDALDestroyDriver(_drv); return NULL; } @@ -3225,6 +3258,7 @@ rt_raster_gdal_rasterize( /* OGRCleanupAll(); */ GDALClose(_ds); + if (unload_drv) GDALDestroyDriver(_drv); return NULL; } @@ -3251,6 +3285,7 @@ rt_raster_gdal_rasterize( /* OGRCleanupAll(); */ GDALClose(_ds); + if (unload_drv) GDALDestroyDriver(_drv); return NULL; } @@ -3264,6 +3299,7 @@ rt_raster_gdal_rasterize( /* OGRCleanupAll(); */ GDALClose(_ds); + if (unload_drv) GDALDestroyDriver(_drv); if (NULL == rast) { rterror("rt_raster_gdal_rasterize: Could not rasterize geometry"); diff --git a/raster/rt_core/rt_util.c b/raster/rt_core/rt_util.c index b0adbb077..5fe875781 100644 --- a/raster/rt_core/rt_util.c +++ b/raster/rt_core/rt_util.c @@ -335,9 +335,12 @@ void rt_util_gdal_register_all(void) { static int registered = 0; - if (registered) + if (registered) { + RASTER_DEBUG(3, "Already called once... not calling GDALAllRegister"); return; + } + RASTER_DEBUG(3, "Calling GDALAllRegister"); GDALAllRegister(); registered = 1; } diff --git a/raster/rt_core/rt_warp.c b/raster/rt_core/rt_warp.c index 8e97fe679..f09894ed1 100644 --- a/raster/rt_core/rt_warp.c +++ b/raster/rt_core/rt_warp.c @@ -43,6 +43,7 @@ struct _rti_warp_arg_t { GDALDriverH drv; GDALDatasetH ds; char *srs; + int destroy_drv; } src, dst; GDALWarpOptions *wopts; @@ -75,10 +76,12 @@ _rti_warp_arg_init() { } arg->src.drv = NULL; + arg->src.destroy_drv = 0; arg->src.ds = NULL; arg->src.srs = NULL; arg->dst.drv = NULL; + arg->dst.destroy_drv = 0; arg->dst.ds = NULL; arg->dst.srs = NULL; @@ -105,11 +108,21 @@ _rti_warp_arg_destroy(_rti_warp_arg arg) { if (arg->dst.srs != NULL) CPLFree(arg->dst.srs); + if (arg->dst.drv != NULL && arg->dst.destroy_drv) { + GDALDeregisterDriver(arg->dst.drv); + GDALDestroyDriver(arg->dst.drv); + } + if (arg->src.ds != NULL) GDALClose(arg->src.ds); if (arg->src.srs != NULL) CPLFree(arg->src.srs); + if (arg->src.drv != NULL && arg->src.destroy_drv) { + GDALDeregisterDriver(arg->src.drv); + GDALDestroyDriver(arg->src.drv); + } + if (arg->transform.func == GDALApproxTransform) { if (arg->transform.arg.imgproj != NULL) GDALDestroyGenImgProjTransformer(arg->transform.arg.imgproj); @@ -244,7 +257,7 @@ rt_raster rt_raster_gdal_warp( } /* load raster into a GDAL MEM dataset */ - arg->src.ds = rt_raster_to_gdal_mem(raster, arg->src.srs, NULL, NULL, 0, &(arg->src.drv)); + arg->src.ds = rt_raster_to_gdal_mem(raster, arg->src.srs, NULL, NULL, 0, &(arg->src.drv), &(arg->src.destroy_drv)); if (NULL == arg->src.ds) { rterror("rt_raster_gdal_warp: Could not convert raster to GDAL MEM format"); _rti_warp_arg_destroy(arg); @@ -770,8 +783,13 @@ rt_raster rt_raster_gdal_warp( } /* load VRT driver */ - if (!rt_util_gdal_driver_registered("VRT")) + if (!rt_util_gdal_driver_registered("VRT")) { + RASTER_DEBUG(3, "Registering VRT driver"); + RASTER_DEBUGF(4, "VRT registered: %d", rt_util_gdal_driver_registered("VRT")); GDALRegister_VRT(); + RASTER_DEBUGF(4, "VRT registered: %d", rt_util_gdal_driver_registered("VRT")); + arg->dst.destroy_drv = 1; + } arg->dst.drv = GDALGetDriverByName("VRT"); if (NULL == arg->dst.drv) { rterror("rt_raster_gdal_warp: Could not load the output GDAL VRT driver"); diff --git a/raster/rt_pg/rtpostgis.c b/raster/rt_pg/rtpostgis.c index 418d34a90..e6213fc5f 100644 --- a/raster/rt_pg/rtpostgis.c +++ b/raster/rt_pg/rtpostgis.c @@ -173,6 +173,7 @@ rtpg_assignHookGDALEnabledDrivers(const char *newdrivers, void *extra) { POSTGIS_RT_DEBUGF(4, "newdrivers = %s", newdrivers); /* validate new drivers */ + /* TODO: flesh this out */ /* CPLSetConfigOption("GDAL_SKIP", newdrivers); @@ -183,10 +184,13 @@ static char *gdalenableddrivers; /* Module load callback */ void _PG_init(void) { + const char *gdal_skip; /* restrict GDAL drivers */ - /* unless over-ridden by GUCs, default to VRT, WMS, WCS and MEM */ - CPLSetConfigOption("GDAL_SKIP", "VRT WMS WCS MEM"); + /* unless already set, default to VRT, WMS, WCS and MEM */ + gdal_skip = CPLGetConfigOption("GDAL_SKIP", NULL); + if (gdal_skip == NULL) + CPLSetConfigOption("GDAL_SKIP", "VRT WMS WCS MEM"); /* Install liblwgeom handlers */ pg_install_lwgeom_handlers(); diff --git a/raster/test/cunit/cu_gdal.c b/raster/test/cunit/cu_gdal.c index f6c5beda9..3c5144634 100644 --- a/raster/test/cunit/cu_gdal.c +++ b/raster/test/cunit/cu_gdal.c @@ -490,6 +490,7 @@ static void test_gdal_to_raster() { double value; GDALDriverH gddrv = NULL; + int destroy = 0; GDALDatasetH gdds = NULL; raster = rt_raster_new(width, height); @@ -505,8 +506,9 @@ static void test_gdal_to_raster() { } } - gdds = rt_raster_to_gdal_mem(raster, NULL, NULL, NULL, 0, &gddrv); + gdds = rt_raster_to_gdal_mem(raster, NULL, NULL, NULL, 0, &gddrv, &destroy); CU_ASSERT(gddrv != NULL); + CU_ASSERT_EQUAL(destroy, 0); CU_ASSERT(gdds != NULL); CU_ASSERT_EQUAL(GDALGetRasterXSize(gdds), width); CU_ASSERT_EQUAL(GDALGetRasterYSize(gdds), height); @@ -550,8 +552,9 @@ static void test_gdal_to_raster() { } } - gdds = rt_raster_to_gdal_mem(raster, NULL, NULL, NULL, 0, &gddrv); + gdds = rt_raster_to_gdal_mem(raster, NULL, NULL, NULL, 0, &gddrv, &destroy); CU_ASSERT(gddrv != NULL); + CU_ASSERT_EQUAL(destroy, 0); CU_ASSERT(gdds != NULL); CU_ASSERT_EQUAL(GDALGetRasterXSize(gdds), width); CU_ASSERT_EQUAL(GDALGetRasterYSize(gdds), height); @@ -573,6 +576,8 @@ static void test_gdal_to_raster() { } GDALClose(gdds); + gdds = NULL; + gddrv = NULL; cu_free_raster(rast); cu_free_raster(raster); diff --git a/raster/test/regress/Makefile.in b/raster/test/regress/Makefile.in index c89991b95..457f1f7bc 100644 --- a/raster/test/regress/Makefile.in +++ b/raster/test/regress/Makefile.in @@ -138,6 +138,7 @@ TEST_SREL = \ TEST_BUGS = \ bug_test_car5 \ + permitted_gdal_drivers \ tickets TEST_LOADER = \ diff --git a/raster/test/regress/permitted_gdal_drivers.sql b/raster/test/regress/permitted_gdal_drivers.sql new file mode 100644 index 000000000..ddd3d6f71 --- /dev/null +++ b/raster/test/regress/permitted_gdal_drivers.sql @@ -0,0 +1,53 @@ +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (4326,'EPSG',4326,'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]','+proj=longlat +datum=WGS84 +no_defs '); +INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (3857,'EPSG',3857,'PROJCS["WGS 84 / Pseudo-Mercator",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],UNIT["metre",1,AUTHORITY["EPSG","9001"]],PROJECTION["Mercator_1SP"],PARAMETER["central_meridian",0],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],EXTENSION["PROJ4","+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs"],AUTHORITY["EPSG","3857"],AXIS["X",EAST],AXIS["Y",NORTH]]','+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs'); + +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +-- make sure raster transforms still work +-- warp API requires VRT support +WITH foo AS ( + SELECT st_asraster(st_buffer('SRID=3857;POINT(0 0)'::geometry, 8), 0.5, 0.5) AS rast +), +transformed AS ( + SELECT st_transform(rast, 4326) AS rast FROM foo +) +SELECT ST_SRID(rast) FROM transformed; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +-- no VRT permitted by default +SELECT convert_from(ST_AsGDALRaster(ST_FromGDALRaster('/etc/passwd'::bytea), +'EHDR')::bytea, 'LATIN1'); +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +CREATE TEMP TABLE raster_test AS + SELECT + 'passwd' AS lbl, + '0100000100000000000000F03F000000000000F0BF0000000000000000000000000000000000000000000000000000000000000000110F0000E80301008400003C56525444617461736574207261737465725853697A653D223130303022207261737465725953697A653D2231223E3C56525452617374657242616E642062616E643D22312220737562436C6173733D2256525452617752617374657242616E64223E3C536F7572636546696C656E616D653E2F6574632F7061737377643C2F536F7572636546696C656E616D653E3C2F56525452617374657242616E643E3C2F565254446174617365743E00'::raster AS r + UNION ALL + SELECT + 'inline' AS lbl, + '0100000100000000000000F03F000000000000F03F00000000000020C000000000000020C000000000000000000000000000000000110F000010001000440000000000000101010101010000000000000000010101010101010101010000000000010101010101010101010101000000010101010101010101010101010100000101010101010101010101010101000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010001010101010101010101010101010000010101010101010101010101010100000001010101010101010101010100000000000101010101010101010100000000000000000101010101010000000000'::raster AS r +; + +SELECT count(convert_from(ST_AsGDALRaster(r, 'EHDR')::bytea, 'LATIN1')) as passwd from raster_test where lbl = 'passwd'; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +SELECT count(convert_from(ST_AsGDALRaster(r, 'EHDR')::bytea, 'LATIN1')) as passwd from raster_test where lbl = 'passwd'; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +SELECT st_srid(st_transform(r, 4326)) from raster_test where lbl = 'inline'; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +SELECT st_srid(st_transform(r, 4326)) from raster_test where lbl = 'inline'; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +SELECT count(convert_from(ST_AsGDALRaster(r, 'EHDR')::bytea, 'LATIN1')) as passwd from raster_test where lbl = 'passwd'; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +SELECT count(convert_from(ST_AsGDALRaster(r, 'EHDR')::bytea, 'LATIN1')) as passwd from raster_test where lbl = 'passwd'; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; + +SELECT st_srid(st_transform(r, 4326)) from raster_test where lbl = 'inline'; +SELECT short_name FROM st_gdaldrivers() WHERE upper(short_name) = 'VRT'; diff --git a/raster/test/regress/permitted_gdal_drivers_expected b/raster/test/regress/permitted_gdal_drivers_expected new file mode 100644 index 000000000..5497a5df0 --- /dev/null +++ b/raster/test/regress/permitted_gdal_drivers_expected @@ -0,0 +1,9 @@ +4326 +ERROR: RASTER_fromGDALRaster: Could not open bytea with GDAL. Check that the bytea is of a GDAL supported format +ERROR: rt_band_load_offline_data: Cannot open offline raster: /etc/passwd +ERROR: rt_band_load_offline_data: Cannot open offline raster: /etc/passwd +4326 +4326 +ERROR: rt_band_load_offline_data: Cannot open offline raster: /etc/passwd +ERROR: rt_band_load_offline_data: Cannot open offline raster: /etc/passwd +4326 -- 2.50.1