Skip to content

Commit

Permalink
fix memory leaks on wms testcases
Browse files Browse the repository at this point in the history
  • Loading branch information
tbonfort committed Sep 17, 2012
1 parent 52362d0 commit dadbfad
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 37 deletions.
1 change: 1 addition & 0 deletions mapgeos.c
Expand Up @@ -239,6 +239,7 @@ static GEOSGeom msGEOSShape2Geometry_polygon(shapeObj *shape)
}

g = GEOSGeom_createCollection(GEOS_MULTIPOLYGON, polygons, numOuterRings);
free(polygons);
}

free(outerList);
Expand Down
33 changes: 20 additions & 13 deletions mapogcfiltercommon.c
Expand Up @@ -536,21 +536,22 @@ char *FLTGetSpatialComparisonCommonExpression(FilterEncodingNode *psNode, layerO
pszExpression = msStringConcatenate(pszExpression, szBuffer);


if (strncasecmp(psNode->pszValue, "intersect", 9) == 0)
pszTmp = msStrdup("intersects");
if (strncasecmp(psNode->pszValue, "equals", 6) == 0)
pszTmp = msStrdup("eq");
else
pszTmp = msStrdup(psNode->pszValue);
msStringToLower(pszTmp);
if (bBBoxQuery)
if (bBBoxQuery) {
sprintf(szBuffer, " %s ", "intersects");
/* sprintf(szBuffer, " %s ", "disjoint"); */
else
sprintf(szBuffer, " %s ", pszTmp);
} else {
if (strncasecmp(psNode->pszValue, "intersect", 9) == 0)
sprintf(szBuffer, " %s ", "intersects");
else if (strncasecmp(psNode->pszValue, "equals", 6) == 0)
sprintf(szBuffer, " %s ", "eq");
else {
pszTmp = msStrdup(psNode->pszValue);
msStringToLower(pszTmp);
sprintf(szBuffer, " %s ", pszTmp);
msFree(pszTmp);
}
}

pszExpression = msStringConcatenate(pszExpression, szBuffer);
msFree(pszTmp);

pszWktText = msGEOSShapeToWKT(psTmpShape);
sprintf(szBuffer, "%s", " fromText('");
Expand All @@ -560,8 +561,14 @@ char *FLTGetSpatialComparisonCommonExpression(FilterEncodingNode *psNode, layerO
pszExpression = msStringConcatenate(pszExpression, szBuffer);
msGEOSFreeWKT(pszWktText);
}
if (psBufferShape)
if (psBufferShape) {
msFreeShape(psBufferShape);
msFree(psBufferShape);
}
if(bBBoxQuery) {
msFreeShape(psTmpShape);
msFree(psTmpShape);
}


sprintf(szBuffer, "%s", ")");
Expand Down
22 changes: 14 additions & 8 deletions mapogcsld.c
Expand Up @@ -185,6 +185,7 @@ int msSLDApplySLD(mapObj *map, char *psSLDXML, int iLayer,
msFree(pasLayers[l].name);
pasLayers[l].name = strdup(tmpId);
msInsertLayer(map, psTmpLayer, -1);
MS_REFCNT_DECR(psTmpLayer);
}
}
}
Expand Down Expand Up @@ -238,8 +239,7 @@ int msSLDApplySLD(mapObj *map, char *psSLDXML, int iLayer,

/*unset the classgroup on the layer if it was set. This allows the layer to render
with all the classes defined in the SLD*/
if (GET_LAYER(map, i)->classgroup)
msFree(GET_LAYER(map, i)->classgroup);
msFree(GET_LAYER(map, i)->classgroup);
GET_LAYER(map, i)->classgroup = NULL;

iClass = 0;
Expand Down Expand Up @@ -290,8 +290,7 @@ int msSLDApplySLD(mapObj *map, char *psSLDXML, int iLayer,
break;
}
if (k < GET_LAYER(map, i)->numclasses) {
if ( GET_LAYER(map, i)->classgroup)
msFree( GET_LAYER(map, i)->classgroup);
msFree( GET_LAYER(map, i)->classgroup);
GET_LAYER(map, i)->classgroup = msStrdup(pasLayers[j].classgroup);
} else {
/* TODO we throw an exception ?*/
Expand Down Expand Up @@ -774,12 +773,14 @@ int msSLDParseNamedLayer(CPLXMLNode *psRoot, layerObj *psLayer)
psFilter = CPLGetXMLNode(psRule, "Filter");
if (psFilter && psFilter->psChild &&
psFilter->psChild->pszValue) {

CPLXMLNode *psTmpNextNode = NULL;
/* clone the tree and set the next node to null */
/* so we only have the Filter node */
psTmpNode = CPLCloneXMLTree(psFilter);
psTmpNextNode = psTmpNode->psNext;
psTmpNode->psNext = NULL;
pszTmpFilter = CPLSerializeXMLTree(psTmpNode);
psTmpNode->psNext = psTmpNextNode;
CPLDestroyXMLNode(psTmpNode);

if (pszTmpFilter) {
Expand Down Expand Up @@ -888,8 +889,10 @@ int msSLDParseNamedLayer(CPLXMLNode *psRoot, layerObj *psLayer)
psNamedStyle = CPLGetXMLNode(psRoot, "NamedStyle");
if (psNamedStyle) {
psSLDName = CPLGetXMLNode(psNamedStyle, "Name");
if (psSLDName && psSLDName->psChild && psSLDName->psChild->pszValue)
if (psSLDName && psSLDName->psChild && psSLDName->psChild->pszValue) {
msFree(psLayer->classgroup);
psLayer->classgroup = msStrdup(psSLDName->psChild->pszValue);
}
}
}

Expand Down Expand Up @@ -1573,15 +1576,17 @@ int msSLDParseGraphicFillOrStroke(CPLXMLNode *psRoot,

/* default symbol is square */

if (!pszSymbolName ||
if (!pszSymbolName || !*pszSymbolName ||
(strcasecmp(pszSymbolName, "square") != 0 &&
strcasecmp(pszSymbolName, "circle") != 0 &&
strcasecmp(pszSymbolName, "triangle") != 0 &&
strcasecmp(pszSymbolName, "star") != 0 &&
strcasecmp(pszSymbolName, "cross") != 0 &&
strcasecmp(pszSymbolName, "x") != 0)) {
if (msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE) < 0)
if (!pszSymbolName || !*pszSymbolName || msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE) < 0) {
msFree(pszSymbolName);
pszSymbolName = msStrdup("square");
}
}


Expand Down Expand Up @@ -1712,6 +1717,7 @@ int msSLDParseGraphicFillOrStroke(CPLXMLNode *psRoot,
if (psExternalGraphic)
msSLDParseExternalGraphic(psExternalGraphic, psStyle, map);
}
msFree(pszSymbolName);
}

return MS_SUCCESS;
Expand Down
4 changes: 2 additions & 2 deletions mapserver.h
Expand Up @@ -2729,8 +2729,8 @@ extern "C" {
MS_DLL_EXPORT int msPopulateRendererVTableGD( rendererVTableObj *renderer );
MS_DLL_EXPORT int msPopulateRendererVTableKML( rendererVTableObj *renderer );
MS_DLL_EXPORT int msPopulateRendererVTableOGR( rendererVTableObj *renderer );
#ifdef CAIRO
MS_DLL_EXPORT void msCairoCleanup();
#ifdef USE_CAIRO
MS_DLL_EXPORT void msCairoCleanup(void);
#endif

/* allocate 50k for starters */
Expand Down
34 changes: 20 additions & 14 deletions mapwms.c
Expand Up @@ -198,9 +198,8 @@ int msWMSException(mapObj *map, int nVersion, const char *exception_code,
msIO_printf("</ServiceException>\n");
msIO_printf("</ServiceExceptionReport>\n");

free(schemalocation);

}
free(schemalocation);

return MS_FAILURE; /* so that we can call 'return msWMSException();' anywhere */
}
Expand Down Expand Up @@ -637,14 +636,14 @@ int msWMSValidateDimensionValue(char *value, const char *dimensionextent, int fo
}
if (j == nextentranges) {
valueisvalid = MS_FALSE;
msFreeCharArray(onerange, ntmp);
break;
}
}
} else {
valueisvalid = MS_FALSE;
}
if (onerange && ntmp > 0)
msFreeCharArray(onerange, ntmp);
msFreeCharArray(onerange, ntmp);
}
uservaluevalid = valueisvalid;
}
Expand Down Expand Up @@ -858,6 +857,8 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,

layers = msStringSplit(values[i], ',', &numlayers);
if (layers==NULL || strlen(values[i]) <=0 || numlayers < 1) {
msFreeCharArray(layers,numlayers);
msFree(layerOrder);
numlayers = 0;
if (sld_url == NULL && sld_body == NULL) {
msSetError(MS_WMSERR, "At least one layer name required in LAYERS.",
Expand All @@ -870,6 +871,8 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
layerlimit = msOWSLookupMetadata(&(map->web.metadata), "MO", "layerlimit");
if(layerlimit) {
if (numlayers > atoi(layerlimit)) {
msFreeCharArray(layers,numlayers);
msFree(layerOrder);
msSetError(MS_WMSERR, "Number of layers requested exceeds LayerLimit.",
"msWMSLoadGetMapParams()");
return msWMSException(map, nVersion, NULL, wms_exception_format);
Expand Down Expand Up @@ -1244,12 +1247,16 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
wms_exception_format)) {
msFreeCharArray(tokens, ntokens);
msFree(dimensionname);
msFree(stmp);

return msWMSException(lp->map, nVersion, "InvalidDimensionValue", wms_exception_format);
}
msFree(dimensionname);
msFree(stmp);
break;
}
msFree(dimensionname);
msFree(stmp);
}
}
msFreeCharArray(tokens, ntokens);
Expand Down Expand Up @@ -1583,6 +1590,8 @@ this request. Check wms/ows_enable_request settings.",
layers[l] = strdup(tmpId);
msInsertLayer(map, psTmpLayer, -1);
bLayerInserted =MS_TRUE;
/* layer was copied, we need to decrement its refcount */
MS_REFCNT_DECR(psTmpLayer);
}
}
}
Expand All @@ -1602,8 +1611,7 @@ this request. Check wms/ows_enable_request settings.",
lp = GET_LAYER(map, j);
for (k=0; k<lp->numclasses; k++) {
if (lp->class[k]->group && strcasecmp(lp->class[k]->group, tokens[i]) == 0) {
if (lp->classgroup)
msFree(lp->classgroup);
msFree(lp->classgroup);
lp->classgroup = msStrdup( tokens[i]);
break;
}
Expand Down Expand Up @@ -1640,16 +1648,14 @@ this request. Check wms/ows_enable_request settings.",
} else {
msSetError(MS_WMSERR, "Invalid style (%s). Mapserver is expecting an empty string for the STYLES : STYLES= or STYLES=,,, or using keyword default STYLES=default,default, ...",
"msWMSLoadGetMapParams()", styles);
if (tokens && n > 0)
msFreeCharArray(tokens, n);
if (layers && numlayers > 0)
msFreeCharArray(layers, numlayers);
msFreeCharArray(tokens, n);
msFreeCharArray(layers, numlayers);
return msWMSException(map, nVersion, "StyleNotDefined", wms_exception_format);
}
}
}
if (tokens && n > 0)
msFreeCharArray(tokens, n);
msFreeCharArray(tokens, n);
msFreeCharArray(layers, numlayers);
}

/*
Expand Down Expand Up @@ -2227,6 +2233,7 @@ int msDumpLayer(mapObj *map, layerObj *lp, int nVersion, const char *script_url_
msFree(pszDimension);
msFree(pszDimensionItemName);
msFree(pszDimensionUnitName);
msFree(pszDimensionExtentName);
msFree(pszDimensionDefaultName);

}
Expand Down Expand Up @@ -4505,8 +4512,7 @@ this request. Check wms/ows_enable_request settings.",
"msWMSGetLegendGraphic()");
return msWMSException(map, nVersion, "StyleNotDefined", wms_exception_format);
} else {
if (GET_LAYER(map, iLayerIndex)->classgroup)
msFree(GET_LAYER(map, iLayerIndex)->classgroup);
msFree(GET_LAYER(map, iLayerIndex)->classgroup);
GET_LAYER(map, iLayerIndex)->classgroup = msStrdup(pszStyle);

}
Expand Down

0 comments on commit dadbfad

Please sign in to comment.