diff --git a/maputil.c b/maputil.c
index 701603b08b..092d78d7f3 100644
--- a/maputil.c
+++ b/maputil.c
@@ -1883,9 +1883,16 @@ void msCleanup(int signal)
msGEOSCleanup();
#endif
+/* make valgrind happy on debug code */
+#ifndef NDEBUG
#ifdef USE_CAIRO
msCairoCleanup();
#endif
+#if defined(USE_LIBXML2)
+ xmlCleanupParser();
+#endif
+#endif
+
msTimeCleanup();
msIO_Cleanup();
diff --git a/mapwcs.c b/mapwcs.c
index fc28ee49e0..3eff18b7c3 100644
--- a/mapwcs.c
+++ b/mapwcs.c
@@ -1285,6 +1285,7 @@ static int msWCSDescribeCoverage_CoverageOffering(layerObj *layer, wcsParamsObj
msIO_printf(" %s\n", tokens[i]);
msFreeCharArray(tokens, numtokens);
}
+ msFree((char*)value);
}
msIO_printf(" \n");
@@ -1335,8 +1336,11 @@ static int msWCSDescribeCoverage(mapObj *map, wcsParamsObj *params, owsRequestOb
for(i=0; inumlayers; i++) {
coverageName = msOWSGetEncodeMetadata(&(GET_LAYER(map, i)->metadata), "CO", "name", GET_LAYER(map, i)->name);
if( EQUAL(coverageName, coverages[k]) &&
- (msIntegerInArray(GET_LAYER(map, i)->index, ows_request->enabled_layers, ows_request->numlayers)) )
- break;
+ (msIntegerInArray(GET_LAYER(map, i)->index, ows_request->enabled_layers, ows_request->numlayers)) ) {
+ msFree(coverageName);
+ break;
+ }
+ msFree(coverageName);
}
/* i = msGetLayerIndex(map, coverages[k]); */
@@ -1346,6 +1350,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSDescribeCoverage()"
return msWCSException(map, "CoverageNotDefined", "coverage", params->version );
}
} /* next coverage */
+ msFreeCharArray(coverages,numcoverages);
}
}
@@ -1378,10 +1383,15 @@ this request. Check wcs/ows_enable_request settings.", "msWCSDescribeCoverage()"
for(k=0; knumlayers; i++) {
coverageName = msOWSGetEncodeMetadata(&(GET_LAYER(map, i)->metadata), "CO", "name", GET_LAYER(map, i)->name);
- if( EQUAL(coverageName, coverages[k]) ) break;
+ if( EQUAL(coverageName, coverages[k]) ) {
+ msFree(coverageName);
+ break;
+ }
+ msFree(coverageName);
}
msWCSDescribeCoverage_CoverageOffering((GET_LAYER(map, i)), params);
}
+ msFreeCharArray(coverages,numcoverages);
}
} else { /* return all layers */
for(i=0; inumlayers; i++) {
@@ -1427,14 +1437,18 @@ static int msWCSGetCoverageBands10( mapObj *map, cgiRequestObj *request,
/* ok, a parameter has been passed which matches a token in wcs_rangeset_axes */
if(msWCSValidateRangeSetParam(lp, tokens[i], value) != MS_SUCCESS) {
+ int ret;
msSetError( MS_WCSERR, "Error specifying \"%s\" parameter value(s).", "msWCSGetCoverage()", tokens[i]);
- return msWCSException(map, "InvalidParameterValue", tokens[i], params->version );
+ ret = msWCSException(map, "InvalidParameterValue", tokens[i], params->version );
+ msFreeCharArray(tokens, numtokens);
+ return ret;
}
/* xxxxx_rangeitem tells us how to subset */
snprintf(tag, sizeof(tag), "%s_rangeitem", tokens[i]);
if((rangeitem = msOWSLookupMetadata(&(lp->metadata), "CO", tag)) == NULL) {
msSetError( MS_WCSERR, "Missing required metadata element \"%s\", unable to process %s=%s.", "msWCSGetCoverage()", tag, tokens[i], value);
+ msFreeCharArray(tokens, numtokens);
return msWCSException(map, NULL, NULL, params->version);
}
@@ -1443,12 +1457,15 @@ static int msWCSGetCoverageBands10( mapObj *map, cgiRequestObj *request,
if(!*p_bandlist) {
msSetError( MS_WCSERR, "Error specifying \"%s\" parameter value(s).", "msWCSGetCoverage()", tokens[i]);
+ msFreeCharArray(tokens, numtokens);
return msWCSException(map, NULL, NULL, params->version );
}
} else if(strcasecmp(rangeitem, "_pixels") == 0) { /* special case, subset pixels */
+ msFreeCharArray(tokens, numtokens);
msSetError( MS_WCSERR, "Arbitrary range sets based on pixel values are not yet supported.", "msWCSGetCoverage()" );
return msWCSException(map, NULL, NULL, params->version);
} else {
+ msFreeCharArray(tokens, numtokens);
msSetError( MS_WCSERR, "Arbitrary range sets based on tile (i.e. image) attributes are not yet supported.", "msWCSGetCoverage()" );
return msWCSException(map, NULL, NULL, params->version );
}
diff --git a/mapwcs11.c b/mapwcs11.c
index 77232c2f07..3ab517cf21 100644
--- a/mapwcs11.c
+++ b/mapwcs11.c
@@ -72,7 +72,6 @@ int msWCSException11(mapObj *map, const char *locator,
xmlChar *buffer = NULL;
psNsOws = xmlNewNs(NULL, BAD_CAST "http://www.opengis.net/ows/1.1", BAD_CAST "ows");
- //TODO leak?
encoding = msOWSLookupMetadata(&(map->web.metadata), "CO", "encoding");
errorString = msGetErrorString("\n");
@@ -85,8 +84,7 @@ int msWCSException11(mapObj *map, const char *locator,
xmlDocSetRootElement(psDoc, psRootNode);
- psNsOws = xmlNewNs(psRootNode, BAD_CAST "http://www.opengis.net/ows/1.1", BAD_CAST "ows");
- //TODO leak?
+ xmlNewNs(psRootNode, BAD_CAST "http://www.opengis.net/ows/1.1", BAD_CAST "ows");
if (encoding)
msIO_setHeader("Content-type","text/xml; charset=%s", encoding);
@@ -104,6 +102,7 @@ int msWCSException11(mapObj *map, const char *locator,
free(schemasLocation);
xmlFree(buffer);
xmlFreeDoc(psDoc);
+ xmlFreeNs(psNsOws);
/* clear error since we have already reported it */
msResetErrorList();
@@ -125,7 +124,7 @@ static char *msWCSGetFormatsList11( mapObj *map, layerObj *layer )
char *format_list = msStrdup("");
char **tokens = NULL, **formats = NULL;
int i, numtokens = 0, numformats;
- const char *value;
+ char *value;
msApplyDefaultOutputFormats(map);
@@ -136,6 +135,7 @@ static char *msWCSGetFormatsList11( mapObj *map, layerObj *layer )
&& (value = msOWSGetEncodeMetadata( &(layer->metadata),"CO","formats",
"GTiff" )) != NULL ) {
tokens = msStringSplit(value, ' ', &numtokens);
+ msFree(value);
}
/* -------------------------------------------------------------------- */
@@ -144,6 +144,7 @@ static char *msWCSGetFormatsList11( mapObj *map, layerObj *layer )
else if((value = msOWSGetEncodeMetadata( &(map->web.metadata), "CO", "formats",
NULL)) != NULL ) {
tokens = msStringSplit(value, ' ', &numtokens);
+ msFree(value);
}
/* -------------------------------------------------------------------- */
@@ -461,6 +462,8 @@ int msWCSGetCapabilities11(mapObj *map, wcsParamsObj *params,
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, schemaLocation);
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, "/ows/1.1.0/owsAll.xsd");
xmlNewNsProp(psRootNode, NULL, BAD_CAST "xsi:schemaLocation", BAD_CAST xsi_schemaLocation);
+ msFree(schemaLocation);
+ msFree(xsi_schemaLocation);
/* -------------------------------------------------------------------- */
/* Service metadata. */
@@ -775,7 +778,7 @@ msWCSDescribeCoverage_CoverageDescription11(
/* -------------------------------------------------------------------- */
{
xmlNodePtr psField, psInterpMethods, psAxis;
- const char *value;
+ char *value;
psField =
xmlNewChild(
@@ -786,12 +789,14 @@ msWCSDescribeCoverage_CoverageDescription11(
"rangeset_label", NULL );
if( value )
xmlNewChild( psField, psOwsNs, BAD_CAST "Title", BAD_CAST value );
+ msFree(value);
/* ows:Abstract? TODO */
value = msOWSGetEncodeMetadata( &(layer->metadata), "CO",
"rangeset_name", "raster" );
xmlNewChild( psField, NULL, BAD_CAST "Identifier", BAD_CAST value );
+ msFree(value);
xmlNewChild(
xmlNewChild( psField, NULL, BAD_CAST "Definition", NULL ),
@@ -803,6 +808,7 @@ msWCSDescribeCoverage_CoverageDescription11(
if( value )
xmlNewChild( psField, NULL, BAD_CAST "NullValue",
BAD_CAST value );
+ msFree(value);
/* InterpolationMethods */
psInterpMethods =
@@ -823,6 +829,7 @@ msWCSDescribeCoverage_CoverageDescription11(
"bands_name", "bands" );
psAxis = xmlNewChild( psField, NULL, BAD_CAST "Axis", NULL );
xmlNewProp( psAxis, BAD_CAST "identifier", BAD_CAST value );
+ msFree(value);
psKeys = xmlNewChild( psAxis, NULL, BAD_CAST
"AvailableKeys", NULL );
@@ -954,6 +961,8 @@ int msWCSDescribeCoverage11(mapObj *map, wcsParamsObj *params, owsRequestObj *ow
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, schemaLocation);
xsi_schemaLocation = msStringConcatenate(xsi_schemaLocation, "/ows/1.1.0/owsAll.xsd");
xmlNewNsProp(psRootNode, NULL, BAD_CAST "xsi:schemaLocation", BAD_CAST xsi_schemaLocation);
+ msFree(schemaLocation);
+ msFree(xsi_schemaLocation);
/* -------------------------------------------------------------------- */
/* Generate a CoverageDescription for each requested coverage. */
@@ -1196,6 +1205,7 @@ int msWCSReturnCoverage11( wcsParamsObj *params, mapObj *map,
msReleaseLock( TLOCK_GDAL );
status = msSaveImage(map, image, filename);
if( status != MS_SUCCESS ) {
+ msFree(filename);
msSetError(MS_MISCERR, "msSaveImage() failed",
"msWCSReturnCoverage11()");
return msWCSException11(map, "mapserv", "NoApplicableCode",
@@ -1360,6 +1370,7 @@ int msWCSReturnCoverage11( wcsParamsObj *params, mapObj *map,
}
msFree(base_dir);
+ msFree(filename);
CSLDestroy( all_files );
msReleaseLock( TLOCK_GDAL );
diff --git a/mapwcs20.c b/mapwcs20.c
index 9b6ce10e1f..3e857c281c 100644
--- a/mapwcs20.c
+++ b/mapwcs20.c
@@ -1202,7 +1202,7 @@ static char *msWCSGetFormatsList20( mapObj *map, layerObj *layer )
char *format_list = msStrdup("");
char **tokens = NULL, **formats = NULL;
int i, numtokens = 0, numformats;
- const char *value;
+ char *value;
/* -------------------------------------------------------------------- */
/* Parse from layer metadata. */
@@ -1211,6 +1211,7 @@ static char *msWCSGetFormatsList20( mapObj *map, layerObj *layer )
&& (value = msOWSGetEncodeMetadata( &(layer->metadata),"CO","formats",
NULL )) != NULL ) {
tokens = msStringSplit(value, ' ', &numtokens);
+ msFree(value);
}
/* -------------------------------------------------------------------- */
@@ -1219,6 +1220,7 @@ static char *msWCSGetFormatsList20( mapObj *map, layerObj *layer )
else if((value = msOWSGetEncodeMetadata( &(map->web.metadata), "CO", "formats",
NULL)) != NULL ) {
tokens = msStringSplit(value, ' ', &numtokens);
+ msFree(value);
}
/* -------------------------------------------------------------------- */
@@ -1556,6 +1558,7 @@ static void msWCSCommon20_CreateRangeType(layerObj* layer, wcs20coverageMetadata
xmlNewChild(psAllowedValues, psSweNs, BAD_CAST "significantFigures", BAD_CAST significant_figures);
}
}
+ msFreeCharArray(arr,num);
}
/************************************************************************/
@@ -2593,12 +2596,14 @@ int msWCSGetCapabilities20(mapObj *map, cgiRequestObj *req,
if (i == 0) { /* current */
msSetError(MS_WCSERR, "UPDATESEQUENCE parameter (%s) is equal to server (%s)",
"msWCSGetCapabilities20()", params->updatesequence, updatesequence);
+ xmlFreeDoc(psDoc);
return msWCSException(map, "updatesequence",
"CurrentUpdateSequence", params->version);
}
if (i > 0) { /* invalid */
msSetError(MS_WCSERR, "UPDATESEQUENCE parameter (%s) is higher than server (%s)",
"msWCSGetCapabilities20()", params->updatesequence, updatesequence);
+ xmlFreeDoc(psDoc);
return msWCSException(map, "updatesequence",
"InvalidUpdateSequence", params->version);
}
@@ -2628,6 +2633,7 @@ int msWCSGetCapabilities20(mapObj *map, cgiRequestObj *req,
if ( MS_WCS_20_CAPABILITIES_INCLUDE_SECTION(params, "OperationsMetadata") ) {
if ((script_url = msOWSGetOnlineResource(map, "CO", "onlineresource", req)) == NULL
|| (script_url_encoded = msEncodeHTMLEntities(script_url)) == NULL) {
+ xmlFreeDoc(psDoc);
msSetError(MS_WCSERR, "Server URL not found", "msWCSGetCapabilities20()");
return msWCSException(map, "mapserv", "NoApplicableCode", params->version);
}
@@ -3165,7 +3171,10 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
}
/* retrieve coverage metadata */
status = msWCSGetCoverageMetadata20(layer, &cm);
- if (status != MS_SUCCESS) return MS_FAILURE;
+ if (status != MS_SUCCESS) {
+ msWCSClearCoverageMetadata20(&cm);
+ return MS_FAILURE;
+ }
/* fill in bands rangeset info, if required. */
/* msWCSSetDefaultBandsRangeSetInfo(NULL, &cm, layer ); */
@@ -3183,6 +3192,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
msInitProjection(&imageProj);
if (msLoadProjectionString(&imageProj, cm.srs) == -1) {
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR,
"Error loading CRS %s.",
"msWCSGetCoverage20()", params->subsetcrs);
@@ -3191,6 +3201,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
}
if(msWCSGetCoverage20_FinalizeParamsObj(params) == MS_FAILURE) {
+ msWCSClearCoverageMetadata20(&cm);
return msWCSException(map, "InvalidParameterValue", "extent", params->version);
}
@@ -3232,6 +3243,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
/* if the subsets have a crs given, project the image extent to it */
msInitProjection(&subsetProj);
if(msLoadProjectionString(&subsetProj, params->subsetcrs) != MS_SUCCESS) {
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR,
"Error loading CRS %s.",
"msWCSGetCoverage20()", params->subsetcrs);
@@ -3255,6 +3267,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
/* create boundings of params subsets and image extent */
if(msRectOverlap(&subsets, &(layer->extent)) == MS_FALSE) {
/* extent and bbox do not overlap -> exit */
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR, "Image extent does not intersect with desired region.",
"msWCSGetCoverage20()");
return msWCSException(map, "ExtentError", "extent", params->version);
@@ -3269,6 +3282,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
/* check if we are overspecified */
if((params->width != 0 && params->resolutionX != MS_WCS20_UNBOUNDED)
|| (params->height != 0 && params->resolutionY != MS_WCS20_UNBOUNDED)) {
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR, "GetCoverage operation supports only one of SIZE or RESOLUTION per axis.",
"msWCSGetCoverage20()");
return msWCSException(map, "TooManyParameterValues", "coverage",
@@ -3353,6 +3367,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
/* Are we exceeding the MAXSIZE limit on result size? */
if(map->width > map->maxsize || map->height > map->maxsize ) {
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR, "Raster size out of range, width and height of "
"resulting coverage must be no more than MAXSIZE=%d.",
"msWCSGetCoverage20()", map->maxsize);
@@ -3387,6 +3402,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
}
if (!params->format) {
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR, "Output format could not be automatically determined. "
"Use the FORMAT parameter to specify a format.",
"msWCSGetCoverage20()");
@@ -3406,6 +3422,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
msApplyDefaultOutputFormats(map);
if (msGetOutputFormatIndex(map, params->format) == -1) {
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR, "Unrecognized value '%s' for the FORMAT parameter.",
"msWCSGetCoverage20()", params->format);
return msWCSException(map, "InvalidParameterValue", "format",
@@ -3418,6 +3435,8 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
MS_NOOVERRIDE, MS_NOOVERRIDE);
if(msWCSGetCoverage20_GetBands(map, layer, params, &cm, &bandlist) != MS_SUCCESS) {
+ msFree(bandlist);
+ msWCSClearCoverageMetadata20(&cm);
return msWCSException(map, "InvalidParameterValue", "rangesubset",
params->version);
}
@@ -3435,6 +3454,8 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
} else if(EQUAL(params->interpolation,"AVERAGE")) {
msLayerSetProcessingKey(layer, "RESAMPLE", "AVERAGE");
} else {
+ msWCSClearCoverageMetadata20(&cm);
+ msFree(bandlist);
msSetError( MS_WCSERR, "'%s' specifies an unsupported interpolation method.",
"msWCSGetCoverage20()", params->interpolation );
return msWCSException(map, "InvalidParameterValue", "interpolation", params->version);
@@ -3453,6 +3474,8 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
/* create the image object */
if (!map->outputformat) {
+ msWCSClearCoverageMetadata20(&cm);
+ msFree(bandlist);
msSetError(MS_WCSERR, "The map outputformat is missing!",
"msWCSGetCoverage20()");
return msWCSException(map, NULL, NULL, params->version);
@@ -3466,6 +3489,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
map->defresolution, &map->imagecolor);
} else {
msFree(bandlist);
+ msWCSClearCoverageMetadata20(&cm);
msSetError(MS_WCSERR, "Map outputformat not supported for WCS!",
"msWCSGetCoverage20()");
return msWCSException(map, NULL, NULL, params->version);
@@ -3473,6 +3497,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
if (image == NULL) {
msFree(bandlist);
+ msWCSClearCoverageMetadata20(&cm);
return msWCSException(map, NULL, NULL, params->version);
}
@@ -3488,6 +3513,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
if( status != MS_SUCCESS ) {
msFree(bandlist);
msFreeImage(image);
+ msWCSClearCoverageMetadata20(&cm);
return msWCSException(map, NULL, NULL, params->version );
}
@@ -3560,6 +3586,7 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
file_ref = msSmallMalloc(length);
strlcpy(file_ref, "cid:coverage/", length);
strlcat(file_ref, filename, length);
+ msFree(default_filename);
if(EQUAL(MS_IMAGE_MIME_TYPE(map->outputformat), "image/tiff")) {
length = strlen(MS_WCS_20_PROFILE_GML_GEOTIFF) + 1;