[Git][debian-gis-team/mapserver][upstream] New upstream version 7.6.1

Bas Couwenberg gitlab at salsa.debian.org
Fri Jul 31 19:14:42 BST 2020



Bas Couwenberg pushed to branch upstream at Debian GIS Project / mapserver


Commits:
53ba6c57 by Bas Couwenberg at 2020-07-31T19:33:00+02:00
New upstream version 7.6.1
- - - - -


27 changed files:

- CMakeLists.txt
- HISTORY.TXT
- mapcopy.c
- mapfile.c
- mapgeos.c
- maplabel.c
- mapmetadata.c
- mapmssql2008.c
- mapogcfilter.c
- mapogcsld.c
- mapogr.cpp
- mapows.c
- mapows.h
- mapscript/java/CMakeLists.txt
- mapscript/phpng/CMakeLists.txt
- mapscript/phpng/php7module.i
- mapscript/python/CMakeLists.txt
- mapscript/python/examples/project_csv.py
- mapscript/python/examples/shpdump.py
- mapscript/python/examples/shpinfo.py
- mapscript/python/examples/wxs.py
- mapscript/python/mapscript/__init__.py
- mapscript/python/pymodule.i
- mapserver.h
- mapsymbol.c
- mapwms.c
- renderers/agg/include/agg_conv_curve.h


Changes:

=====================================
CMakeLists.txt
=====================================
@@ -17,7 +17,7 @@ include(CheckCSourceCompiles)
 
 set (MapServer_VERSION_MAJOR 7)
 set (MapServer_VERSION_MINOR 6)
-set (MapServer_VERSION_REVISION 0)
+set (MapServer_VERSION_REVISION 1)
 set (MapServer_VERSION_SUFFIX "")
 
 # Set C++ version


=====================================
HISTORY.TXT
=====================================
@@ -12,6 +12,11 @@ For a complete change history, please see the Git log comments.  For more
 details about recent point releases, please see the online changelog at:
 http://mapserver.org/development/changelog/
 
+7.6.1 release (2020-07-31)
+-------------------------
+
+- No major changes, see detailed changelog for bug fixes
+
 7.6.0 release (2020-05-08)
 --------------------------
 


=====================================
mapcopy.c
=====================================
@@ -1217,6 +1217,7 @@ int msCopyMap(mapObj *dst, mapObj *src)
   MS_COPYSTELEM(resolution);
   MS_COPYSTRING(dst->shapepath, src->shapepath);
   MS_COPYSTRING(dst->mappath, src->mappath);
+  MS_COPYSTELEM(sldurl);
 
   MS_COPYCOLOR(&(dst->imagecolor), &(src->imagecolor));
 


=====================================
mapfile.c
=====================================
@@ -5890,6 +5890,7 @@ int initMap(mapObj *map)
   map->cellsize = 0;
   map->shapepath = NULL;
   map->mappath = NULL;
+  map->sldurl = NULL;
 
   MS_INIT_COLOR(map->imagecolor, 255,255,255,255); /* white */
 


=====================================
mapgeos.c
=====================================
@@ -804,7 +804,22 @@ shapeObj *msGEOSOffsetCurve(shapeObj *p, double offset) {
   g1 = (GEOSGeom) p->geometry;
   if(!g1) return NULL;
   
-  g2 = GEOSOffsetCurve_r(handle,g1, offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset*1.5));
+  if (GEOSGeomTypeId_r(handle,g1) == GEOS_MULTILINESTRING)
+  {
+    GEOSGeom *lines = malloc(p->numlines*sizeof(GEOSGeom));
+    if (!lines) return NULL;
+    for(int i=0; i<p->numlines; i++)
+    {
+      lines[i] = GEOSOffsetCurve_r(handle, GEOSGetGeometryN_r(handle,g1,i),
+                                   offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset*1.5));
+    }
+    g2 = GEOSGeom_createCollection_r(handle,GEOS_MULTILINESTRING, lines, p->numlines);
+    free(lines);
+  }
+  else
+  {
+    g2 = GEOSOffsetCurve_r(handle,g1, offset, 4, GEOSBUF_JOIN_MITRE, fabs(offset*1.5));
+  }
   return msGEOSGeometry2Shape(g2);
 #else
   msSetError(MS_GEOSERR, "GEOS Offset Curve support is not available.", "msGEOSingleSidedBuffer()");


=====================================
maplabel.c
=====================================
@@ -143,6 +143,16 @@ void msCopyTextSymbol(textSymbolObj *dst, textSymbolObj *src) {
     dst->textpath = msSmallMalloc(sizeof(textPathObj));
     msCopyTextPath(dst->textpath,src->textpath);
   }
+  if(dst->style_bounds) {
+    int i;
+    dst->style_bounds = msSmallCalloc(src->label->numstyles, sizeof(label_bounds*));
+    for(i=0; i<src->label->numstyles; i++) {
+      if(src->style_bounds[i]) {
+        dst->style_bounds[i] = msSmallMalloc(sizeof(label_bounds));
+        copyLabelBounds(dst->style_bounds[i], src->style_bounds[i]);
+      }
+    }
+  }
 }
 
 static int labelNeedsDeepCopy(labelObj *label) {


=====================================
mapmetadata.c
=====================================
@@ -31,6 +31,7 @@
 #include "mapowscommon.h"
 #include "maplibxml2.h"
 
+#ifdef USE_LIBXML2
 
 /************************************************************************/
 /*                   _msMetadataGetCharacterString                      */
@@ -860,6 +861,8 @@ int msMetadataDispatch(mapObj *map, cgiRequestObj *cgi_request, owsRequestObj *o
   return status;
 }
 
+#endif /* USE_LIBXML2 */
+
 /************************************************************************/
 /*                           msMetadataCreateParamsObj                  */
 /*                                                                      */


=====================================
mapmssql2008.c
=====================================
@@ -1122,6 +1122,24 @@ static int getMSSQLMajorVersion(layerObj* layer)
   return layerinfo->mssqlversion_major;
 }
 
+static int addFilter(layerObj *layer, char **query)
+{
+  if (layer->filter.native_string) {
+    (*query) = msStringConcatenate(*query, " WHERE (");
+    (*query) = msStringConcatenate(*query, layer->filter.native_string);
+    (*query) = msStringConcatenate(*query, ")");
+    return MS_TRUE;
+  }
+  else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
+    (*query) = msStringConcatenate(*query, " WHERE (");
+    (*query) = msStringConcatenate(*query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
+    (*query) = msStringConcatenate(*query, ")");
+    return MS_TRUE;
+  }
+
+  return MS_FALSE;
+}
+
 /* Get the layer extent as specified in the mapfile or a largest area */
 /* covering all features */
 int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
@@ -1167,6 +1185,10 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
       }
       query = msStringConcatenate(query, ") AS extentcol FROM ");
       query = msStringConcatenate(query, layerinfo->geom_table);
+
+      /* adding attribute filter */
+      addFilter(layer, &query);
+
       query = msStringConcatenate(query, ") SELECT extentcol.STPointN(1).STX, extentcol.STPointN(1).STY, extentcol.STPointN(3).STX, extentcol.STPointN(3).STY FROM extent");
     }
     else {
@@ -1183,6 +1205,10 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
       }
       query = msStringConcatenate(query, ".STEnvelope() as envelope from ");
       query = msStringConcatenate(query, layerinfo->geom_table);
+
+      /* adding attribute filter */
+      addFilter(layer, &query);
+
       query = msStringConcatenate(query, "), CORNERS as (SELECT envelope.STPointN(1) as point from ENVELOPE UNION ALL select envelope.STPointN(3) from ENVELOPE) SELECT MIN(point.STX), MIN(point.STY), MAX(point.STX), MAX(point.STY) FROM CORNERS");
     }
 
@@ -1204,7 +1230,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
     }
 
     rc = SQLGetData(layerinfo->conn->hstmt, 1, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
-    if (rc == SQL_ERROR) {
+    if (rc == SQL_ERROR || retLen < 0) {
         msSetError(MS_QUERYERR, "Failed to get MinX value", "msMSSQL2008LayerGetExtent()");
         return MS_FAILURE;
     }
@@ -1214,7 +1240,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
     extent->minx = atof(result_data);
 
     rc = SQLGetData(layerinfo->conn->hstmt, 2, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
-    if (rc == SQL_ERROR) {
+    if (rc == SQL_ERROR || retLen < 0) {
         msSetError(MS_QUERYERR, "Failed to get MinY value", "msMSSQL2008LayerGetExtent()");
         return MS_FAILURE;
     }
@@ -1224,7 +1250,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
     extent->miny = atof(result_data);
 
     rc = SQLGetData(layerinfo->conn->hstmt, 3, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
-    if (rc == SQL_ERROR) {
+    if (rc == SQL_ERROR || retLen < 0) {
         msSetError(MS_QUERYERR, "Failed to get MaxX value", "msMSSQL2008LayerGetExtent()");
         return MS_FAILURE;
     }
@@ -1234,7 +1260,7 @@ int msMSSQL2008LayerGetExtent(layerObj *layer, rectObj *extent)
     extent->maxx = atof(result_data);
 
     rc = SQLGetData(layerinfo->conn->hstmt, 4, SQL_C_CHAR, result_data, sizeof(result_data), &retLen);
-    if (rc == SQL_ERROR) {
+    if (rc == SQL_ERROR || retLen < 0) {
         msSetError(MS_QUERYERR, "Failed to get MaxY value", "msMSSQL2008LayerGetExtent()");
         return MS_FAILURE;
     }
@@ -1271,16 +1297,7 @@ int msMSSQL2008LayerGetNumFeatures(layerObj *layer)
     query = msStringConcatenate(query, layerinfo->geom_table);
 
     /* adding attribute filter */
-    if (layer->filter.native_string) {
-        query = msStringConcatenate(query, " WHERE (");
-        query = msStringConcatenate(query, layer->filter.native_string);
-        query = msStringConcatenate(query, ")");
-    }
-    else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
-        query = msStringConcatenate(query, " WHERE (");
-        query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
-        query = msStringConcatenate(query, ")");
-    }
+    addFilter(layer, &query);
 
     if (!executeSQL(layerinfo->conn, query)) {
         msFree(query);
@@ -1324,9 +1341,15 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
   /*
     "Geometry::STGeomFromText('POLYGON(())',)" + terminator = 40 chars
     Plus 10 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each)
+    Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars
+
+  	or for geography columns
+	
+    "Geography::STGeomFromText('CURVEPOLYGON(())',)" + terminator = 46 chars
+    Plus 18 formatted doubles (15 digits of precision, a decimal point, a space/comma delimiter each = 17 chars each)
     Plus SRID + comma - if SRID is a long...we'll be safe with 10 chars
   */
-  char        box3d[40 + 10 * 22 + 11];
+  char        box3d[46 + 18 * 22 + 11];
   int         t;
 
   char        *pos_from, *pos_ftab, *pos_space, *pos_paren;
@@ -1382,10 +1405,25 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
       /* create point shape for rectangles with zero area */
       sprintf(box3d, "%s::STGeomFromText('POINT(%.15g %.15g)',%s)", /* %s.STSrid)", */
           layerinfo->geom_column_type, rect.minx, rect.miny, layerinfo->user_srid);
-  }
-  else {
-      sprintf(box3d, "%s::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */
-          layerinfo->geom_column_type,
+  } else if (strcasecmp(layerinfo->geom_column_type, "geography") == 0) {
+	  /* SQL Server has a problem when x is -180 or 180 */  
+	  double minx = rect.minx <= -180? -179.999: rect.minx;
+	  double maxx = rect.maxx >= 180? 179.999: rect.maxx;
+	  double miny = rect.miny < -90? -90: rect.miny;
+	  double maxy = rect.maxy > 90? 90: rect.maxy;
+	  sprintf(box3d, "Geography::STGeomFromText('CURVEPOLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */
+          minx, miny,
+          minx + (maxx - minx) / 2, miny,
+          maxx, miny,
+          maxx, miny + (maxy - miny) / 2,
+          maxx, maxy,
+          minx + (maxx - minx) / 2, maxy,
+          minx, maxy,
+          minx, miny + (maxy - miny) / 2,
+          minx, miny,
+          layerinfo->user_srid);  
+  } else {
+      sprintf(box3d, "Geometry::STGeomFromText('POLYGON((%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g,%.15g %.15g))',%s)", /* %s.STSrid)", */
           rect.minx, rect.miny,
           rect.maxx, rect.miny,
           rect.maxx, rect.maxy,
@@ -1508,18 +1546,7 @@ static int prepare_database(layerObj *layer, rectObj rect, char **query_string)
   }
 
   /* adding attribute filter */
-  if (layer->filter.native_string) {
-      query = msStringConcatenate(query, " WHERE (");
-      query = msStringConcatenate(query, layer->filter.native_string);
-      query = msStringConcatenate(query, ")");
-      hasFilter = MS_TRUE;
-  }
-  else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
-      query = msStringConcatenate(query, " WHERE (");
-      query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
-      query = msStringConcatenate(query, ")");
-      hasFilter = MS_TRUE;
-  }
+  hasFilter = addFilter(layer, &query);
 
   if( bIsValidRect ) {
     /* adding spatial filter */
@@ -2583,18 +2610,7 @@ int msMSSQL2008LayerGetShapeCount(layerObj *layer, rectObj rect, projectionObj *
     query = msStringConcatenate(query, layerinfo->geom_table);
 
     /* adding attribute filter */
-    if (layer->filter.native_string) {
-        query = msStringConcatenate(query, " WHERE (");
-        query = msStringConcatenate(query, layer->filter.native_string);
-        query = msStringConcatenate(query, ")");
-        hasFilter = MS_TRUE;
-    }
-    else if (msLayerGetProcessingKey(layer, "NATIVE_FILTER") != NULL) {
-        query = msStringConcatenate(query, " WHERE (");
-        query = msStringConcatenate(query, msLayerGetProcessingKey(layer, "NATIVE_FILTER"));
-        query = msStringConcatenate(query, ")");
-        hasFilter = MS_TRUE;
-    }
+    hasFilter = addFilter(layer, &query);
 
     if( bIsValidRect ) {
         /* adding spatial filter */


=====================================
mapogcfilter.c
=====================================
@@ -1038,6 +1038,8 @@ static CPLXMLNode* FLTFindGeometryNode(CPLXMLNode* psXMLNode,
         *pbPolygon = 1;
       else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "Box")))
         *pbPolygon = 1;
+      else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "Envelope")))
+        *pbPolygon = 1;
       else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "LineString")))
         *pbLine = 1;
       else if ((psGMLElement= CPLGetXMLNode(psXMLNode, "MultiLineString")))
@@ -2267,7 +2269,7 @@ char *FLTGetSQLExpression(FilterEncodingNode *psFilterNode, layerObj *lp)
 #else
     msSetError(MS_MISCERR, "OWS support is not available.",
                "FLTGetSQLExpression()");
-    return(MS_FAILURE);
+    return NULL;
 #endif
 
   }


=====================================
mapogcsld.c
=====================================
@@ -72,6 +72,7 @@ int msSLDApplySLDURL(mapObj *map, const char *szURL, int iLayer,
   int nStatus = MS_FAILURE;
 
   if (map && szURL) {
+    map->sldurl = (char*)szURL;
     pszSLDTmpFile = msTmpFile(map, map->mappath, NULL, "sld.xml");
     if (pszSLDTmpFile == NULL) {
       pszSLDTmpFile = msTmpFile(map, NULL, NULL, "sld.xml" );
@@ -110,6 +111,7 @@ int msSLDApplySLDURL(mapObj *map, const char *szURL, int iLayer,
       if (pszSLDbuf)
         nStatus = msSLDApplySLD(map, pszSLDbuf, iLayer, pszStyleLayerName, ppszLayerNames);
     }
+    map->sldurl = NULL;
   }
 
   msFree(pszSLDbuf);
@@ -2255,10 +2257,54 @@ int msSLDParseExternalGraphic(CPLXMLNode *psExternalGraphic,
       if (psTmp && psTmp->psChild) {
         pszURL = (char*)psTmp->psChild->pszValue;
 
+        char *symbolurl = NULL;
+        // Handle relative URL for ExternalGraphic
+        if (map->sldurl && !strstr(pszURL,"://"))
+        {
+          char *baseurl = NULL;
+          char *relpath = NULL;
+          symbolurl = malloc(sizeof(char)*MS_MAXPATHLEN);
+          if (pszURL[0] != '/') {
+            // Symbol file is relative to SLD file
+            // e.g. SLD   : http://example.com/path/to/sld.xml
+            //  and symbol: assets/symbol.svg
+            //     lead to: http://example.com/path/to/assets/symbol.svg
+            baseurl = msGetPath(map->sldurl);
+            relpath = pszURL;
+          }
+          else
+          {
+            // Symbol file is relative to the root of SLD server
+            // e.g. SLD   : http://example.com/path/to/sld.xml
+            //  and symbol: /path/to/assets/symbol.svg
+            //     lead to: http://example.com/path/to/assets/symbol.svg
+            baseurl = msStrdup(map->sldurl);
+            relpath = pszURL+1;
+            char * sep = strstr(baseurl,"://");
+            if (sep)
+              sep += 3;
+            else
+              sep = baseurl;
+            sep = strchr(sep,'/');
+            if (!sep)
+              sep = baseurl + strlen(baseurl);
+            sep[1] = '\0';
+          }
+          msBuildPath(symbolurl,baseurl,relpath);
+          msFree(baseurl);
+        }
+        else
+        {
+          // Absolute URL
+          // e.g. symbol: http://example.com/path/to/assets/symbol.svg
+          symbolurl = msStrdup(pszURL);
+        }
+
         /* validate the ExternalGraphic parameter */
-        if(msValidateParameter(pszURL, msLookupHashTable(&(map->web.validation), "sld_external_graphic"),
+        if(msValidateParameter(symbolurl, msLookupHashTable(&(map->web.validation), "sld_external_graphic"),
                                NULL, NULL, NULL) != MS_SUCCESS) {
           msSetError(MS_WEBERR, "SLD ExternalGraphic OnlineResource value fails to validate against sld_external_graphic VALIDATION", "mapserv()");
+          msFree(symbolurl);
           return MS_FAILURE;
         }
 
@@ -2266,8 +2312,9 @@ int msSLDParseExternalGraphic(CPLXMLNode *psExternalGraphic,
         /*external symbols using http will be automaticallly downloaded. The file should be
           saved in a temporary directory (msAddImageSymbol) #2305*/
         psStyle->symbol = msGetSymbolIndex(&map->symbolset,
-                                           pszURL,
+                                           symbolurl,
                                            MS_TRUE);
+        msFree(symbolurl);
 
         if (psStyle->symbol > 0 && psStyle->symbol < map->symbolset.numsymbols)
           psStyle->symbolname = msStrdup(map->symbolset.symbol[psStyle->symbol]->name);


=====================================
mapogr.cpp
=====================================
@@ -3447,7 +3447,11 @@ static int  msOGRExtractTopSpatialFilter( msOGRFileInfo *info,
                                           pSpatialFilterNode);
   }
 
-  if( (expr->m_nToken == MS_TOKEN_COMPARISON_INTERSECTS || expr->m_nToken == MS_TOKEN_COMPARISON_CONTAINS ) &&
+  if( (expr->m_nToken == MS_TOKEN_COMPARISON_INTERSECTS ||
+      expr->m_nToken == MS_TOKEN_COMPARISON_OVERLAPS ||
+      expr->m_nToken == MS_TOKEN_COMPARISON_CROSSES ||
+      expr->m_nToken == MS_TOKEN_COMPARISON_WITHIN ||
+      expr->m_nToken == MS_TOKEN_COMPARISON_CONTAINS) &&
       expr->m_aoChildren.size() == 2 &&
       expr->m_aoChildren[1]->m_nToken == MS_TOKEN_LITERAL_SHAPE )
   {


=====================================
mapows.c
=====================================
@@ -261,11 +261,13 @@ int msOWSDispatch(mapObj *map, cgiRequestObj *request, int ows_mode)
   }
 
   if (ows_request.service == NULL) {
+#ifdef USE_LIBXML2
     if (ows_request.request && EQUAL(ows_request.request, "GetMetadata")) {
       status = msMetadataDispatch(map, request, &ows_request);
       msOWSClearRequestObj(&ows_request);
       return status;
     }
+#endif
 #ifdef USE_WFS_SVR
     if( msOWSLookupMetadata(&(map->web.metadata), "FO", "cite_wfs2") != NULL ) {
       status = msWFSException(map, "service", MS_OWS_ERROR_MISSING_PARAMETER_VALUE, NULL );


=====================================
mapows.h
=====================================
@@ -410,12 +410,12 @@ typedef struct {
   int numnamespaces;
 } gmlNamespaceListObj;
 
+MS_DLL_EXPORT gmlItemListObj *msGMLGetItems(layerObj *layer, const char *metadata_namespaces);
+MS_DLL_EXPORT void msGMLFreeItems(gmlItemListObj *itemList);
 
 #if defined(USE_WMS_SVR) || defined (USE_WFS_SVR)
 
 MS_DLL_EXPORT int msItemInGroups(const char *name, gmlGroupListObj *groupList);
-MS_DLL_EXPORT gmlItemListObj *msGMLGetItems(layerObj *layer, const char *metadata_namespaces);
-MS_DLL_EXPORT void msGMLFreeItems(gmlItemListObj *itemList);
 MS_DLL_EXPORT gmlConstantListObj *msGMLGetConstants(layerObj *layer, const char *metadata_namespaces);
 MS_DLL_EXPORT void msGMLFreeConstants(gmlConstantListObj *constantList);
 MS_DLL_EXPORT gmlGeometryListObj *msGMLGetGeometries(layerObj *layer, const char *metadata_namespaces, int bWithDefaultGeom);


=====================================
mapscript/java/CMakeLists.txt
=====================================
@@ -4,7 +4,7 @@ include(${SWIG_USE_FILE})
 find_package(JNI)
 find_package(Java)
 if(NOT JNI_INCLUDE_DIRS OR NOT Java_JAVAC_EXECUTABLE OR NOT Java_JAR_EXECUTABLE)
-   message(SEND_ERROR "Could not find required Java componenents. Try setting the JAVA_HOME environment variable (required on e.g. Ubuntu)")
+   message(SEND_ERROR "Could not find required Java components. Try setting the JAVA_HOME environment variable (required on e.g. Ubuntu)")
 endif(NOT JNI_INCLUDE_DIRS OR NOT Java_JAVAC_EXECUTABLE OR NOT Java_JAR_EXECUTABLE)
 
 include_directories(${JNI_INCLUDE_DIRS})
@@ -14,6 +14,12 @@ include_directories(${PROJECT_SOURCE_DIR}/mapscript/java)
 set (CMAKE_SWIG_OUTDIR "${CMAKE_CURRENT_BINARY_DIR}/edu/umn/gis/mapscript")
 set(CMAKE_SWIG_FLAGS -package edu.umn.gis.mapscript)
 
+# hide warnings
+if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-strict-aliasing")
+endif ()
+
+
 if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} VERSION_GREATER 3.7)
     swig_add_library(javamapscript TYPE MODULE LANGUAGE java SOURCES ../mapscript.i)
 else ()


=====================================
mapscript/phpng/CMakeLists.txt
=====================================
@@ -84,4 +84,6 @@ set_target_properties(${SWIG_MODULE_mapscript_REAL_NAME} PROPERTIES PREFIX "")
 
 if(NOT WIN32)
   install(TARGETS php_mapscriptng DESTINATION ${PHP_EXTENSION_DIR})
+  # install the required file containing MapServer constants and functions
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/mapscript.php DESTINATION ${PHP_EXTENSION_DIR} COMPONENT dev)
 endif()


=====================================
mapscript/phpng/php7module.i
=====================================
@@ -1,3 +1,5 @@
+%module mapscriptng;
+
 %pragma(php) phpinfo="
   php_info_print_table_start();
   php_info_print_table_row(2, \"MapServer Version\", msGetVersion());


=====================================
mapscript/python/CMakeLists.txt
=====================================
@@ -108,7 +108,9 @@ add_custom_command(
     DEPENDS mapscriptwheel.stamp
     OUTPUT mapscripttests.stamp
     COMMAND ${PYTHON_VENV_SCRIPTS}/pip install --no-index --find-links=${OUTPUT_FOLDER}/dist mapscript
-    COMMAND ${PYTHON_VENV_SCRIPTS}/pytest --pyargs mapscript.tests
+    # ERROR: file or package not found: mapscript.tests (missing __init__.py?) is caused by
+    # ImportError: DLL load failed while importing _mapscript: The specified module could not be found.
+    COMMAND ${PYTHON_VENV_SCRIPTS}/python -m pytest --pyargs mapscript.tests
     COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.project_csv ${PROJECT_SOURCE_DIR}/tests/cities.csv 2 1 EPSG:4326 EPSG:3857 > test.csv
     COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.shpdump ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpdump.txt
     COMMAND ${PYTHON_VENV_SCRIPTS}/python -m mapscript.examples.shpinfo ${PROJECT_SOURCE_DIR}/tests/polygon.shp > shpinfo.txt


=====================================
mapscript/python/examples/project_csv.py
=====================================
@@ -1,72 +1,72 @@
-#!/usr/bin/env python
-
-"""
-Simple example to read a csv file and reproject point x/y data
-
-Usage:
-
-project_csv.py cities.csv 2 1 EPSG:4326 EPSG:3857
-
-"""
-
-import sys
-import csv
-from io import open
-import mapscript
-
-
-def main(input_file, x_field_idx, y_field_idx, input_proj, output_proj):
-
-    # set input and output projections
-    proj_in = mapscript.projectionObj(input_proj)
-    proj_out = mapscript.projectionObj(output_proj)
-
-    # open file
-    with open(input_file, encoding='utf-8') as f:
-        # read csv
-        csv_in = csv.reader(f)
-        headers = next(csv_in)
-
-        # setup output
-        csv_out = csv.writer(sys.stdout)
-        csv_out.writerow(headers)
-
-        for row in csv_in:
-            # set pointObj
-            point = mapscript.pointObj(float(row[x_field_idx]), float(row[y_field_idx]))
-            # project
-            point.project(proj_in, proj_out)
-
-            # update with reprojected coordinates
-            row[x_field_idx] = point.x
-            row[y_field_idx] = point.y
-
-            csv_out.writerow(row)
-
-
-def usage():
-    """
-    Display usage if program is used incorrectly
-    """
-    print("Syntax: %s <csvfile> <x_col> <y_col> <epsg_code_in> <epsg_code_out>" % sys.argv[0])
-    sys.exit(2)
-
-
-# check input parameters
-
-if (len(sys.argv) != 6):
-    usage()
-
-
-input_file = sys.argv[1]
-
-# set x and y indices
-
-x_field_idx = int(sys.argv[2])
-y_field_idx = int(sys.argv[3])
-
-# get projection codes
-
-input_proj = "init="+sys.argv[4].lower()
-output_proj = "init="+sys.argv[5].lower()
-main(input_file, x_field_idx, y_field_idx, input_proj, output_proj)
+#!/usr/bin/env python
+
+"""
+Simple example to read a csv file and reproject point x/y data
+
+Usage:
+
+project_csv.py cities.csv 2 1 EPSG:4326 EPSG:3857
+
+"""
+
+import sys
+import csv
+from io import open
+import mapscript
+
+
+def main(input_file, x_field_idx, y_field_idx, input_proj, output_proj):
+
+    # set input and output projections
+    proj_in = mapscript.projectionObj(input_proj)
+    proj_out = mapscript.projectionObj(output_proj)
+
+    # open file
+    with open(input_file, encoding='utf-8') as f:
+        # read csv
+        csv_in = csv.reader(f)
+        headers = next(csv_in)
+
+        # setup output
+        csv_out = csv.writer(sys.stdout)
+        csv_out.writerow(headers)
+
+        for row in csv_in:
+            # set pointObj
+            point = mapscript.pointObj(float(row[x_field_idx]), float(row[y_field_idx]))
+            # project
+            point.project(proj_in, proj_out)
+
+            # update with reprojected coordinates
+            row[x_field_idx] = point.x
+            row[y_field_idx] = point.y
+
+            csv_out.writerow(row)
+
+
+def usage():
+    """
+    Display usage if program is used incorrectly
+    """
+    print("Syntax: %s <csvfile> <x_col> <y_col> <epsg_code_in> <epsg_code_out>" % sys.argv[0])
+    sys.exit(2)
+
+
+# check input parameters
+
+if (len(sys.argv) != 6):
+    usage()
+
+
+input_file = sys.argv[1]
+
+# set x and y indices
+
+x_field_idx = int(sys.argv[2])
+y_field_idx = int(sys.argv[3])
+
+# get projection codes
+
+input_proj = "init="+sys.argv[4].lower()
+output_proj = "init="+sys.argv[5].lower()
+main(input_file, x_field_idx, y_field_idx, input_proj, output_proj)


=====================================
mapscript/python/examples/shpdump.py
=====================================
@@ -1,94 +1,94 @@
-#!/usr/bin/env python
-
-"""
-Dump the contents of the passed in Shapefile
-
-Usage:
-
-python shpdump.py polygon.shp
-
-"""
-
-import mapscript
-import sys
-import os
-
-
-def plural(x):
-    """
-    Returns an 's' if plural
-
-    Useful in print statements to avoid something like 'point(s)'
-    """
-    if x > 1:
-        return 's'
-    return ''
-
-
-def get_shapefile_object(sf_path):
-
-    # make sure can access .shp file, create shapefileObj
-
-    if os.access(sf_path, os.F_OK):
-        sf_obj = mapscript.shapefileObj(sf_path, -1)
-    else:
-        print("Can't access {}".format(sf_path))
-        sys.exit(2)
-
-    return sf_obj
-
-
-def main(sf_path):
-
-    if not sf_path.lower().endswith(".shp"):
-        sf_path += ".shp"
-
-    sf_obj = get_shapefile_object(sf_path)
-
-    # create an empty Shapefile object
-
-    s_obj = mapscript.shapeObj()
-
-    # loop through each shape in the original Shapefile
-
-    for i in range(sf_obj.numshapes):
-
-        # get the object at index i
-        sf_obj.get(i, s_obj)
-        print("Shape %i has %i part%s" % (i, s_obj.numlines, plural(s_obj.numlines)))
-        print("Bounds (%f, %f) (%f, %f)" % (s_obj.bounds.minx, s_obj.bounds.miny, s_obj.bounds.maxx, s_obj.bounds.maxy))
-
-        # loop through parts of each shape
-
-        for j in range(s_obj.numlines):
-
-            # get the jth part of the ith object
-
-            part = s_obj.get(j)
-            print("Part %i has %i point%s" % (j, part.numpoints, plural(part.numpoints)))
-
-            # loop through points in each part
-
-            for k in range(part.numpoints):
-
-                # get the kth point of the jth part of the ith shape
-
-                point = part.get(k)
-                print("%i: %f, %f" % (k, point.x, point.y))
-
-
-def usage():
-    """
-    Display usage if program is used incorrectly
-    """
-    print("Syntax: %s <shapefile_path>" % sys.argv[0])
-    sys.exit(2)
-
-
-# make sure passing in filename argument
-if len(sys.argv) != 2:
-    usage()
-
-
-sf_path = sys.argv[1]
-main(sf_path)
+#!/usr/bin/env python
+
+"""
+Dump the contents of the passed in Shapefile
+
+Usage:
+
+python shpdump.py polygon.shp
+
+"""
+
+import mapscript
+import sys
+import os
+
+
+def plural(x):
+    """
+    Returns an 's' if plural
+
+    Useful in print statements to avoid something like 'point(s)'
+    """
+    if x > 1:
+        return 's'
+    return ''
+
+
+def get_shapefile_object(sf_path):
+
+    # make sure can access .shp file, create shapefileObj
+
+    if os.access(sf_path, os.F_OK):
+        sf_obj = mapscript.shapefileObj(sf_path, -1)
+    else:
+        print("Can't access {}".format(sf_path))
+        sys.exit(2)
+
+    return sf_obj
+
+
+def main(sf_path):
+
+    if not sf_path.lower().endswith(".shp"):
+        sf_path += ".shp"
+
+    sf_obj = get_shapefile_object(sf_path)
+
+    # create an empty Shapefile object
+
+    s_obj = mapscript.shapeObj()
+
+    # loop through each shape in the original Shapefile
+
+    for i in range(sf_obj.numshapes):
+
+        # get the object at index i
+        sf_obj.get(i, s_obj)
+        print("Shape %i has %i part%s" % (i, s_obj.numlines, plural(s_obj.numlines)))
+        print("Bounds (%f, %f) (%f, %f)" % (s_obj.bounds.minx, s_obj.bounds.miny, s_obj.bounds.maxx, s_obj.bounds.maxy))
+
+        # loop through parts of each shape
+
+        for j in range(s_obj.numlines):
+
+            # get the jth part of the ith object
+
+            part = s_obj.get(j)
+            print("Part %i has %i point%s" % (j, part.numpoints, plural(part.numpoints)))
+
+            # loop through points in each part
+
+            for k in range(part.numpoints):
+
+                # get the kth point of the jth part of the ith shape
+
+                point = part.get(k)
+                print("%i: %f, %f" % (k, point.x, point.y))
+
+
+def usage():
+    """
+    Display usage if program is used incorrectly
+    """
+    print("Syntax: %s <shapefile_path>" % sys.argv[0])
+    sys.exit(2)
+
+
+# make sure passing in filename argument
+if len(sys.argv) != 2:
+    usage()
+
+
+sf_path = sys.argv[1]
+main(sf_path)


=====================================
mapscript/python/examples/shpinfo.py
=====================================
@@ -1,109 +1,109 @@
-#!/usr/bin/env python
-
-"""
-Extracts basic descriptive information from a Shapefile
-
-Usage:
-
-python shpinfo.py point.shp
-
-"""
-import mapscript
-import sys
-import os
-
-
-def get_shapefile_object(sf_path):
-
-    # make sure can access .shp file, create shapefileObj
-
-    if os.access(sf_path, os.F_OK):
-        sf_obj = mapscript.shapefileObj(sf_path)
-    else:
-        print("Can't access {}".format(sf_path))
-        sys.exit(2)
-
-    return sf_obj
-
-
-def get_shapefile_details(sf_obj):
-
-    # dictionary of shapefile types
-
-    types = {
-              mapscript.MS_SHAPEFILE_POINT: 'Point',
-              mapscript.MS_SHAPEFILE_ARC: 'Line',
-              mapscript.MS_SHAPEFILE_POLYGON: 'Polygon',
-              mapscript.MS_SHAPEFILE_MULTIPOINT: 'Multipoint',
-
-              mapscript.MS_SHP_POINTZ: 'PointZ',
-              mapscript.MS_SHP_ARCZ: 'LineZ',
-              mapscript.MS_SHP_POLYGONZ: 'PolygonZ',
-              mapscript.MS_SHP_MULTIPOINTZ: 'MultipointZ',
-
-              mapscript.MS_SHP_POINTM: 'Multipoint',
-              mapscript.MS_SHP_ARCM: 'LineM',
-              mapscript.MS_SHP_POLYGONM: 'PolygonM',
-              mapscript.MS_SHP_MULTIPOINTM: 'MultipointM'
-            }
-
-    # print out basic information that is part of the shapefile object
-
-    print("\tType: %s" % types[sf_obj.type])
-
-    print("\tBounds: (%f, %f) (%f, %f)" % (sf_obj.bounds.minx,
-                                           sf_obj.bounds.miny,
-                                           sf_obj.bounds.maxx,
-                                           sf_obj.bounds.maxy))
-
-    print("\tNumber of features: %i" % sf_obj.numshapes)
-
-
-def get_dbf_details(sf_obj):
-
-    # get DBF object
-
-    dbf_obj = sf_obj.getDBF()
-
-    # print out table characteristics
-
-    print("\tNumber of records in DBF: %i" % dbf_obj.nRecords)
-    print("\tNumber of fields: %i" % dbf_obj.nFields)
-    print("")
-    print("\t%-20s %12s %8s %10s" % ("Name", "Type",  "Length", "Decimals"))
-    print("\t-----------------------------------------------------")
-
-    # print out field characteristics
-
-    for idx in range(0, dbf_obj.nFields):
-        print("\t%-20s %12s %8d %10d" % (dbf_obj.getFieldName(idx), dbf_obj.getFieldType(idx),
-                                         dbf_obj.getFieldWidth(idx), dbf_obj.getFieldDecimals(idx)))
-
-
-def main(sf_path):
-
-    if not sf_path.lower().endswith(".shp"):
-        sf_path += ".shp"
-
-    sf_obj = get_shapefile_object(sf_path)
-
-    print("Shapefile %s:" % sf_path)
-    print("")
-
-    get_shapefile_details(sf_obj)
-    get_dbf_details(sf_obj)
-
-
-def usage():
-    """
-    Display usage if program is used incorrectly
-    """
-    print("Syntax: %s <shapefile_path>" % sys.argv[0])
-    sys.exit(2)
-
-
-# make sure a filename argument is provided
-if len(sys.argv) != 2:
-    usage()
-
-main(sys.argv[1])
+#!/usr/bin/env python
+
+"""
+Extracts basic descriptive information from a Shapefile
+
+Usage:
+
+python shpinfo.py point.shp
+
+"""
+import mapscript
+import sys
+import os
+
+
+def get_shapefile_object(sf_path):
+
+    # make sure can access .shp file, create shapefileObj
+
+    if os.access(sf_path, os.F_OK):
+        sf_obj = mapscript.shapefileObj(sf_path)
+    else:
+        print("Can't access {}".format(sf_path))
+        sys.exit(2)
+
+    return sf_obj
+
+
+def get_shapefile_details(sf_obj):
+
+    # dictionary of shapefile types
+
+    types = {
+              mapscript.MS_SHAPEFILE_POINT: 'Point',
+              mapscript.MS_SHAPEFILE_ARC: 'Line',
+              mapscript.MS_SHAPEFILE_POLYGON: 'Polygon',
+              mapscript.MS_SHAPEFILE_MULTIPOINT: 'Multipoint',
+
+              mapscript.MS_SHP_POINTZ: 'PointZ',
+              mapscript.MS_SHP_ARCZ: 'LineZ',
+              mapscript.MS_SHP_POLYGONZ: 'PolygonZ',
+              mapscript.MS_SHP_MULTIPOINTZ: 'MultipointZ',
+
+              mapscript.MS_SHP_POINTM: 'Multipoint',
+              mapscript.MS_SHP_ARCM: 'LineM',
+              mapscript.MS_SHP_POLYGONM: 'PolygonM',
+              mapscript.MS_SHP_MULTIPOINTM: 'MultipointM'
+            }
+
+    # print out basic information that is part of the shapefile object
+
+    print("\tType: %s" % types[sf_obj.type])
+
+    print("\tBounds: (%f, %f) (%f, %f)" % (sf_obj.bounds.minx,
+                                           sf_obj.bounds.miny,
+                                           sf_obj.bounds.maxx,
+                                           sf_obj.bounds.maxy))
+
+    print("\tNumber of features: %i" % sf_obj.numshapes)
+
+
+def get_dbf_details(sf_obj):
+
+    # get DBF object
+
+    dbf_obj = sf_obj.getDBF()
+
+    # print out table characteristics
+
+    print("\tNumber of records in DBF: %i" % dbf_obj.nRecords)
+    print("\tNumber of fields: %i" % dbf_obj.nFields)
+    print("")
+    print("\t%-20s %12s %8s %10s" % ("Name", "Type",  "Length", "Decimals"))
+    print("\t-----------------------------------------------------")
+
+    # print out field characteristics
+
+    for idx in range(0, dbf_obj.nFields):
+        print("\t%-20s %12s %8d %10d" % (dbf_obj.getFieldName(idx), dbf_obj.getFieldType(idx),
+                                         dbf_obj.getFieldWidth(idx), dbf_obj.getFieldDecimals(idx)))
+
+
+def main(sf_path):
+
+    if not sf_path.lower().endswith(".shp"):
+        sf_path += ".shp"
+
+    sf_obj = get_shapefile_object(sf_path)
+
+    print("Shapefile %s:" % sf_path)
+    print("")
+
+    get_shapefile_details(sf_obj)
+    get_dbf_details(sf_obj)
+
+
+def usage():
+    """
+    Display usage if program is used incorrectly
+    """
+    print("Syntax: %s <shapefile_path>" % sys.argv[0])
+    sys.exit(2)
+
+
+# make sure a filename argument is provided
+if len(sys.argv) != 2:
+    usage()
+
+main(sys.argv[1])


=====================================
mapscript/python/examples/wxs.py
=====================================
@@ -1,61 +1,61 @@
-#!/usr/bin/env python
-
-"""
-Output WMS GetCapabilities response for a Mapfile
-
-Usage:
-
-python wxs.py test.map
-
-"""
-import sys
-import xml.dom.minidom
-import mapscript
-
-
-def main(map_file):
-
-    map = mapscript.mapObj(map_file)
-    map.setMetaData("ows_onlineresource", "http://dummy.org/")
-    ows_req = mapscript.OWSRequest()
-
-    ows_req.type = mapscript.MS_GET_REQUEST
-
-    ows_req.setParameter("SERVICE", "WMS")
-    ows_req.setParameter("VERSION", "1.1.0")
-    ows_req.setParameter("REQUEST", "GetCapabilities")
-
-    mapscript.msIO_installStdoutToBuffer()
-    dispatch_status = map.OWSDispatch(ows_req)
-
-    if dispatch_status != mapscript.MS_SUCCESS:
-        print("An error occurred")
-
-    content_type = mapscript.msIO_stripStdoutBufferContentType()
-    mapscript.msIO_stripStdoutBufferContentHeaders()
-    result = mapscript.msIO_getStdoutBufferBytes()
-
-    # [('Content-Type', 'application/vnd.ogc.wms_xml; charset=UTF-8'), ('Content-Length', '11385')]
-    response_headers = [('Content-Type', content_type),
-                        ('Content-Length', str(len(result)))]
-
-    assert int(response_headers[1][1]) > 0
-
-    dom = xml.dom.minidom.parseString(result)
-    print(dom.toprettyxml(indent="", newl=""))
-
-
-def usage():
-    """
-    Display usage if program is used incorrectly
-    """
-    print("Syntax: %s <mapfile_path>" % sys.argv[0])
-    sys.exit(2)
-
-
-# make sure a filename argument is provided
-if len(sys.argv) != 2:
-    usage()
-
-map_file = sys.argv[1]
-main(map_file)
+#!/usr/bin/env python
+
+"""
+Output WMS GetCapabilities response for a Mapfile
+
+Usage:
+
+python wxs.py test.map
+
+"""
+import sys
+import xml.dom.minidom
+import mapscript
+
+
+def main(map_file):
+
+    map = mapscript.mapObj(map_file)
+    map.setMetaData("ows_onlineresource", "http://dummy.org/")
+    ows_req = mapscript.OWSRequest()
+
+    ows_req.type = mapscript.MS_GET_REQUEST
+
+    ows_req.setParameter("SERVICE", "WMS")
+    ows_req.setParameter("VERSION", "1.1.0")
+    ows_req.setParameter("REQUEST", "GetCapabilities")
+
+    mapscript.msIO_installStdoutToBuffer()
+    dispatch_status = map.OWSDispatch(ows_req)
+
+    if dispatch_status != mapscript.MS_SUCCESS:
+        print("An error occurred")
+
+    content_type = mapscript.msIO_stripStdoutBufferContentType()
+    mapscript.msIO_stripStdoutBufferContentHeaders()
+    result = mapscript.msIO_getStdoutBufferBytes()
+
+    # [('Content-Type', 'application/vnd.ogc.wms_xml; charset=UTF-8'), ('Content-Length', '11385')]
+    response_headers = [('Content-Type', content_type),
+                        ('Content-Length', str(len(result)))]
+
+    assert int(response_headers[1][1]) > 0
+
+    dom = xml.dom.minidom.parseString(result)
+    print(dom.toprettyxml(indent="", newl=""))
+
+
+def usage():
+    """
+    Display usage if program is used incorrectly
+    """
+    print("Syntax: %s <mapfile_path>" % sys.argv[0])
+    sys.exit(2)
+
+
+# make sure a filename argument is provided
+if len(sys.argv) != 2:
+    usage()
+
+map_file = sys.argv[1]
+main(map_file)


=====================================
mapscript/python/mapscript/__init__.py
=====================================
@@ -1 +1,12 @@
-from .mapscript import *
\ No newline at end of file
+import inspect
+from .mapscript import *
+
+# change all the class module names from mapscript.mapscript to mapscript
+
+for key, value in globals().copy().items():
+    if inspect.isclass(value) and value.__module__.startswith('mapscript.'):
+        value.__module__= 'mapscript'
+
+# remove the submodule name
+
+del mapscript


=====================================
mapscript/python/pymodule.i
=====================================
@@ -114,8 +114,10 @@ CreateTupleFromDoubleArray( double *first, unsigned int size ) {
         PyObject* val = PyList_GetItem(values, i);
 
         %#if PY_MAJOR_VERSION >= 3
-            $1[i] = PyUnicode_AsUTF8(key);
-            $2[i] = PyUnicode_AsUTF8(val);
+            // Changed in version 3.7: The return type is now const char * rather than char *
+            // avoid warning C4090: '=': different 'const' qualifiers
+            $1[i] = (char *)PyUnicode_AsUTF8(key);
+            $2[i] = (char *)PyUnicode_AsUTF8(val);
         %#else
             $1[i] = PyString_AsString(key);
             $2[i] = PyString_AsString(val);


=====================================
mapserver.h
=====================================
@@ -1843,6 +1843,7 @@ void msCopyTextPath(textPathObj *dst, textPathObj *src);
 void freeTextPath(textPathObj *tp);
 void initTextSymbol(textSymbolObj *ts);
 void freeTextSymbol(textSymbolObj *ts);
+void copyLabelBounds(label_bounds *dst, label_bounds *src);
 void msCopyTextSymbol(textSymbolObj *dst, textSymbolObj *src);
 void msPopulateTextSymbolForLabelAndString(textSymbolObj *ts, labelObj *l, char *string, double scalefactor, double resolutionfactor, label_cache_mode cache);
 #endif /* SWIG */
@@ -1902,6 +1903,10 @@ void msPopulateTextSymbolForLabelAndString(textSymbolObj *ts, labelObj *l, char
 
     char *shapepath; /* where are the shape files located */
     char *mappath; /* path of the mapfile, all path are relative to this path */
+    char *sldurl; // URL of SLD document as specified with "&SLD=..."
+                  // WMS parameter.  Currently this reference is used
+                  // only in mapogcsld.c and has a NULL value
+                  // outside that context.
 
 #ifndef SWIG
     paletteObj palette; /* holds a map palette */


=====================================
mapsymbol.c
=====================================
@@ -399,7 +399,7 @@ int msAddImageSymbol(symbolSetObj *symbolset, char *filename)
           unlink(tmpfullfilename); 
           msFree(tmpfilename);
           msFree(tmppath);
-          return MS_FAILURE;
+          return -1;
         }
       }
       msFree(tmpfilename);


=====================================
mapwms.c
=====================================
@@ -1021,17 +1021,18 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
     if (strcasecmp(names[i], "SLD") == 0 || strcasecmp(names[i], "SLD_BODY") == 0) {
       sldenabled = msOWSLookupMetadata(&(map->web.metadata), "MO", "sld_enabled");
 
-      if (sldenabled == NULL)
+      if (sldenabled == NULL) {
         sldenabled = "true";
+      }
 
-        if (strcasecmp(sldenabled, "true") == 0) {
-          if (strcasecmp(names[i], "SLD") == 0) {
-            sld_url =  values[i];
-          }
-          if (strcasecmp(names[i], "SLD_BODY") == 0) {
-            sld_body =  values[i];
-          }
+      if (strcasecmp(sldenabled, "true") == 0) {
+        if (strcasecmp(names[i], "SLD") == 0) {
+          sld_url =  values[i];
         }
+        if (strcasecmp(names[i], "SLD_BODY") == 0) {
+          sld_body =  values[i];
+        }
+      }
     }
   }
 


=====================================
renderers/agg/include/agg_conv_curve.h
=====================================
@@ -156,8 +156,8 @@ namespace mapserver
 
         double ct2_x = 0;
         double ct2_y = 0;
-        double end_x;
-        double end_y;
+        double end_x = 0;
+        double end_y = 0;
 
         unsigned cmd = m_source->vertex(x, y);
         switch(cmd)



View it on GitLab: https://salsa.debian.org/debian-gis-team/mapserver/-/commit/53ba6c57ae0ad952785fe056122a04c8c4aa3f77

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mapserver/-/commit/53ba6c57ae0ad952785fe056122a04c8c4aa3f77
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20200731/63dd5c56/attachment-0001.html>


More information about the Pkg-grass-devel mailing list