]> granicus.if.org Git - postgis/commitdiff
by default, prevent PostGIS raster from using GDAL drivers that can easily be abused...
authorBborie Park <bkpark at ucdavis.edu>
Thu, 10 Apr 2014 21:53:49 +0000 (21:53 +0000)
committerBborie Park <bkpark at ucdavis.edu>
Thu, 10 Apr 2014 21:53:49 +0000 (21:53 +0000)
git-svn-id: http://svn.osgeo.org/postgis/trunk@12457 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
raster/rt_core/librtcore.h
raster/rt_core/rt_geometry.c
raster/rt_core/rt_raster.c
raster/rt_core/rt_util.c
raster/rt_core/rt_warp.c
raster/rt_pg/rtpostgis.c
raster/test/cunit/cu_gdal.c
raster/test/regress/Makefile.in
raster/test/regress/permitted_gdal_drivers.sql [new file with mode: 0644]
raster/test/regress/permitted_gdal_drivers_expected [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 908449fa60163dd32ce164170b5ef4384207eb7e..42a7cf4b85f6a35c7000523bc3dd48273d1db458 100644 (file)
--- 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 *
 
index 5a36f158383950de7da3b608d2daa52b8dd0ee59..2cf4054fb8eaee80152fff6759ad29689e73b94c 100644 (file)
@@ -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
 );
 
 /**
index 6f571b1071fa20d437f3e3f1f106b3b7125c2580..6e18be8217603bbaff0f37dabc95259ea4908bf7 100644 (file)
@@ -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);
index 19be44a3610d50cb53cf936a9565b019a7cc44e8..53c8d46f03762a8edab9b6db710f69b98e27ef3f 100644 (file)
@@ -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");
index b0adbb0779b6f0a4434783e841b31dbcef52d23f..5fe87578113b53ecbd6267cd0aebf4340205a808 100644 (file)
@@ -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;
 }
index 8e97fe67915335723894561b51641e8eb0d83089..f09894ed19ba58c28b33838544503bc1476ca57c 100644 (file)
@@ -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");
index 418d34a90a45317c2503d4db559fabcf763b5d63..e6213fc5f90ad0197ac314ed0bee5f9bcf8635d2 100644 (file)
@@ -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();
index f6c5beda9f985f5d2382d4794c7fdbf8bc0af664..3c51446349e51aed78f793be1f78b89fe42f9a39 100644 (file)
@@ -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);
index c89991b95e095ba1c9ec8280e5c83587bb7c9905..457f1f7bc2cf1185726fd50df4e31d924069d3dc 100644 (file)
@@ -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 (file)
index 0000000..ddd3d6f
--- /dev/null
@@ -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('<VRTDataset rasterXSize="1000"
+rasterYSize="1"><VRTRasterBand band="1"
+subClass="VRTRawRasterBand"><SourceFilename>/etc/passwd</SourceFilename></VRTRasterBand></VRTDataset>'::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 (file)
index 0000000..5497a5d
--- /dev/null
@@ -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: <VRTDataset rasterXSize="1000" rasterYSize="1"><VRTRasterBand band="1" subClass="VRTRawRasterBand"><SourceFilename>/etc/passwd</SourceFilename></VRTRasterBand></VRTDataset>
+ERROR:  rt_band_load_offline_data: Cannot open offline raster: <VRTDataset rasterXSize="1000" rasterYSize="1"><VRTRasterBand band="1" subClass="VRTRawRasterBand"><SourceFilename>/etc/passwd</SourceFilename></VRTRasterBand></VRTDataset>
+4326
+4326
+ERROR:  rt_band_load_offline_data: Cannot open offline raster: <VRTDataset rasterXSize="1000" rasterYSize="1"><VRTRasterBand band="1" subClass="VRTRawRasterBand"><SourceFilename>/etc/passwd</SourceFilename></VRTRasterBand></VRTDataset>
+ERROR:  rt_band_load_offline_data: Cannot open offline raster: <VRTDataset rasterXSize="1000" rasterYSize="1"><VRTRasterBand band="1" subClass="VRTRawRasterBand"><SourceFilename>/etc/passwd</SourceFilename></VRTRasterBand></VRTDataset>
+4326