Skip to content

Commit

Permalink
fix leaks in wcs code
Browse files Browse the repository at this point in the history
  • Loading branch information
tbonfort committed Sep 17, 2012
1 parent dadbfad commit 617aec8
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 11 deletions.
7 changes: 7 additions & 0 deletions maputil.c
Expand Up @@ -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();
Expand Down
25 changes: 21 additions & 4 deletions mapwcs.c
Expand Up @@ -1285,6 +1285,7 @@ static int msWCSDescribeCoverage_CoverageOffering(layerObj *layer, wcsParamsObj
msIO_printf(" <formats>%s</formats>\n", tokens[i]);
msFreeCharArray(tokens, numtokens);
}
msFree((char*)value);
}
msIO_printf(" </supportedFormats>\n");

Expand Down Expand Up @@ -1335,8 +1336,11 @@ static int msWCSDescribeCoverage(mapObj *map, wcsParamsObj *params, owsRequestOb
for(i=0; i<map->numlayers; 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]); */
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -1378,10 +1383,15 @@ this request. Check wcs/ows_enable_request settings.", "msWCSDescribeCoverage()"
for(k=0; k<numcoverages; k++) {
for(i=0; i<map->numlayers; 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; i<map->numlayers; i++) {
Expand Down Expand Up @@ -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);
}

Expand All @@ -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 );
}
Expand Down
21 changes: 16 additions & 5 deletions mapwcs11.c
Expand Up @@ -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");
Expand All @@ -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);
Expand All @@ -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();
Expand All @@ -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);

Expand All @@ -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);
}

/* -------------------------------------------------------------------- */
Expand All @@ -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);
}

/* -------------------------------------------------------------------- */
Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -775,7 +778,7 @@ msWCSDescribeCoverage_CoverageDescription11(
/* -------------------------------------------------------------------- */
{
xmlNodePtr psField, psInterpMethods, psAxis;
const char *value;
char *value;

psField =
xmlNewChild(
Expand All @@ -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 ),
Expand All @@ -803,6 +808,7 @@ msWCSDescribeCoverage_CoverageDescription11(
if( value )
xmlNewChild( psField, NULL, BAD_CAST "NullValue",
BAD_CAST value );
msFree(value);

/* InterpolationMethods */
psInterpMethods =
Expand All @@ -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 );
Expand Down Expand Up @@ -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. */
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -1360,6 +1370,7 @@ int msWCSReturnCoverage11( wcsParamsObj *params, mapObj *map,
}

msFree(base_dir);
msFree(filename);
CSLDestroy( all_files );
msReleaseLock( TLOCK_GDAL );

Expand Down

0 comments on commit 617aec8

Please sign in to comment.