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;