Skip to content

Commit dadbfad

Browse files
committed
fix memory leaks on wms testcases
1 parent 52362d0 commit dadbfad

File tree

5 files changed

+57
-37
lines changed

5 files changed

+57
-37
lines changed

mapgeos.c

+1
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ static GEOSGeom msGEOSShape2Geometry_polygon(shapeObj *shape)
239239
}
240240

241241
g = GEOSGeom_createCollection(GEOS_MULTIPOLYGON, polygons, numOuterRings);
242+
free(polygons);
242243
}
243244

244245
free(outerList);

mapogcfiltercommon.c

+20-13
Original file line numberDiff line numberDiff line change
@@ -536,21 +536,22 @@ char *FLTGetSpatialComparisonCommonExpression(FilterEncodingNode *psNode, layerO
536536
pszExpression = msStringConcatenate(pszExpression, szBuffer);
537537

538538

539-
if (strncasecmp(psNode->pszValue, "intersect", 9) == 0)
540-
pszTmp = msStrdup("intersects");
541-
if (strncasecmp(psNode->pszValue, "equals", 6) == 0)
542-
pszTmp = msStrdup("eq");
543-
else
544-
pszTmp = msStrdup(psNode->pszValue);
545-
msStringToLower(pszTmp);
546-
if (bBBoxQuery)
539+
if (bBBoxQuery) {
547540
sprintf(szBuffer, " %s ", "intersects");
548-
/* sprintf(szBuffer, " %s ", "disjoint"); */
549-
else
550-
sprintf(szBuffer, " %s ", pszTmp);
541+
} else {
542+
if (strncasecmp(psNode->pszValue, "intersect", 9) == 0)
543+
sprintf(szBuffer, " %s ", "intersects");
544+
else if (strncasecmp(psNode->pszValue, "equals", 6) == 0)
545+
sprintf(szBuffer, " %s ", "eq");
546+
else {
547+
pszTmp = msStrdup(psNode->pszValue);
548+
msStringToLower(pszTmp);
549+
sprintf(szBuffer, " %s ", pszTmp);
550+
msFree(pszTmp);
551+
}
552+
}
551553

552554
pszExpression = msStringConcatenate(pszExpression, szBuffer);
553-
msFree(pszTmp);
554555

555556
pszWktText = msGEOSShapeToWKT(psTmpShape);
556557
sprintf(szBuffer, "%s", " fromText('");
@@ -560,8 +561,14 @@ char *FLTGetSpatialComparisonCommonExpression(FilterEncodingNode *psNode, layerO
560561
pszExpression = msStringConcatenate(pszExpression, szBuffer);
561562
msGEOSFreeWKT(pszWktText);
562563
}
563-
if (psBufferShape)
564+
if (psBufferShape) {
564565
msFreeShape(psBufferShape);
566+
msFree(psBufferShape);
567+
}
568+
if(bBBoxQuery) {
569+
msFreeShape(psTmpShape);
570+
msFree(psTmpShape);
571+
}
565572

566573

567574
sprintf(szBuffer, "%s", ")");

mapogcsld.c

+14-8
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,7 @@ int msSLDApplySLD(mapObj *map, char *psSLDXML, int iLayer,
185185
msFree(pasLayers[l].name);
186186
pasLayers[l].name = strdup(tmpId);
187187
msInsertLayer(map, psTmpLayer, -1);
188+
MS_REFCNT_DECR(psTmpLayer);
188189
}
189190
}
190191
}
@@ -238,8 +239,7 @@ int msSLDApplySLD(mapObj *map, char *psSLDXML, int iLayer,
238239

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

245245
iClass = 0;
@@ -290,8 +290,7 @@ int msSLDApplySLD(mapObj *map, char *psSLDXML, int iLayer,
290290
break;
291291
}
292292
if (k < GET_LAYER(map, i)->numclasses) {
293-
if ( GET_LAYER(map, i)->classgroup)
294-
msFree( GET_LAYER(map, i)->classgroup);
293+
msFree( GET_LAYER(map, i)->classgroup);
295294
GET_LAYER(map, i)->classgroup = msStrdup(pasLayers[j].classgroup);
296295
} else {
297296
/* TODO we throw an exception ?*/
@@ -774,12 +773,14 @@ int msSLDParseNamedLayer(CPLXMLNode *psRoot, layerObj *psLayer)
774773
psFilter = CPLGetXMLNode(psRule, "Filter");
775774
if (psFilter && psFilter->psChild &&
776775
psFilter->psChild->pszValue) {
777-
776+
CPLXMLNode *psTmpNextNode = NULL;
778777
/* clone the tree and set the next node to null */
779778
/* so we only have the Filter node */
780779
psTmpNode = CPLCloneXMLTree(psFilter);
780+
psTmpNextNode = psTmpNode->psNext;
781781
psTmpNode->psNext = NULL;
782782
pszTmpFilter = CPLSerializeXMLTree(psTmpNode);
783+
psTmpNode->psNext = psTmpNextNode;
783784
CPLDestroyXMLNode(psTmpNode);
784785

785786
if (pszTmpFilter) {
@@ -888,8 +889,10 @@ int msSLDParseNamedLayer(CPLXMLNode *psRoot, layerObj *psLayer)
888889
psNamedStyle = CPLGetXMLNode(psRoot, "NamedStyle");
889890
if (psNamedStyle) {
890891
psSLDName = CPLGetXMLNode(psNamedStyle, "Name");
891-
if (psSLDName && psSLDName->psChild && psSLDName->psChild->pszValue)
892+
if (psSLDName && psSLDName->psChild && psSLDName->psChild->pszValue) {
893+
msFree(psLayer->classgroup);
892894
psLayer->classgroup = msStrdup(psSLDName->psChild->pszValue);
895+
}
893896
}
894897
}
895898

@@ -1573,15 +1576,17 @@ int msSLDParseGraphicFillOrStroke(CPLXMLNode *psRoot,
15731576

15741577
/* default symbol is square */
15751578

1576-
if (!pszSymbolName ||
1579+
if (!pszSymbolName || !*pszSymbolName ||
15771580
(strcasecmp(pszSymbolName, "square") != 0 &&
15781581
strcasecmp(pszSymbolName, "circle") != 0 &&
15791582
strcasecmp(pszSymbolName, "triangle") != 0 &&
15801583
strcasecmp(pszSymbolName, "star") != 0 &&
15811584
strcasecmp(pszSymbolName, "cross") != 0 &&
15821585
strcasecmp(pszSymbolName, "x") != 0)) {
1583-
if (msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE) < 0)
1586+
if (!pszSymbolName || !*pszSymbolName || msGetSymbolIndex(&map->symbolset, pszSymbolName, MS_FALSE) < 0) {
1587+
msFree(pszSymbolName);
15841588
pszSymbolName = msStrdup("square");
1589+
}
15851590
}
15861591

15871592

@@ -1712,6 +1717,7 @@ int msSLDParseGraphicFillOrStroke(CPLXMLNode *psRoot,
17121717
if (psExternalGraphic)
17131718
msSLDParseExternalGraphic(psExternalGraphic, psStyle, map);
17141719
}
1720+
msFree(pszSymbolName);
17151721
}
17161722

17171723
return MS_SUCCESS;

mapserver.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -2729,8 +2729,8 @@ extern "C" {
27292729
MS_DLL_EXPORT int msPopulateRendererVTableGD( rendererVTableObj *renderer );
27302730
MS_DLL_EXPORT int msPopulateRendererVTableKML( rendererVTableObj *renderer );
27312731
MS_DLL_EXPORT int msPopulateRendererVTableOGR( rendererVTableObj *renderer );
2732-
#ifdef CAIRO
2733-
MS_DLL_EXPORT void msCairoCleanup();
2732+
#ifdef USE_CAIRO
2733+
MS_DLL_EXPORT void msCairoCleanup(void);
27342734
#endif
27352735

27362736
/* allocate 50k for starters */

mapwms.c

+20-14
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,8 @@ int msWMSException(mapObj *map, int nVersion, const char *exception_code,
198198
msIO_printf("</ServiceException>\n");
199199
msIO_printf("</ServiceExceptionReport>\n");
200200

201-
free(schemalocation);
202-
203201
}
202+
free(schemalocation);
204203

205204
return MS_FAILURE; /* so that we can call 'return msWMSException();' anywhere */
206205
}
@@ -637,14 +636,14 @@ int msWMSValidateDimensionValue(char *value, const char *dimensionextent, int fo
637636
}
638637
if (j == nextentranges) {
639638
valueisvalid = MS_FALSE;
639+
msFreeCharArray(onerange, ntmp);
640640
break;
641641
}
642642
}
643643
} else {
644644
valueisvalid = MS_FALSE;
645645
}
646-
if (onerange && ntmp > 0)
647-
msFreeCharArray(onerange, ntmp);
646+
msFreeCharArray(onerange, ntmp);
648647
}
649648
uservaluevalid = valueisvalid;
650649
}
@@ -858,6 +857,8 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
858857

859858
layers = msStringSplit(values[i], ',', &numlayers);
860859
if (layers==NULL || strlen(values[i]) <=0 || numlayers < 1) {
860+
msFreeCharArray(layers,numlayers);
861+
msFree(layerOrder);
861862
numlayers = 0;
862863
if (sld_url == NULL && sld_body == NULL) {
863864
msSetError(MS_WMSERR, "At least one layer name required in LAYERS.",
@@ -870,6 +871,8 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
870871
layerlimit = msOWSLookupMetadata(&(map->web.metadata), "MO", "layerlimit");
871872
if(layerlimit) {
872873
if (numlayers > atoi(layerlimit)) {
874+
msFreeCharArray(layers,numlayers);
875+
msFree(layerOrder);
873876
msSetError(MS_WMSERR, "Number of layers requested exceeds LayerLimit.",
874877
"msWMSLoadGetMapParams()");
875878
return msWMSException(map, nVersion, NULL, wms_exception_format);
@@ -1244,12 +1247,16 @@ int msWMSLoadGetMapParams(mapObj *map, int nVersion,
12441247
wms_exception_format)) {
12451248
msFreeCharArray(tokens, ntokens);
12461249
msFree(dimensionname);
1250+
msFree(stmp);
12471251

12481252
return msWMSException(lp->map, nVersion, "InvalidDimensionValue", wms_exception_format);
12491253
}
1254+
msFree(dimensionname);
1255+
msFree(stmp);
12501256
break;
12511257
}
12521258
msFree(dimensionname);
1259+
msFree(stmp);
12531260
}
12541261
}
12551262
msFreeCharArray(tokens, ntokens);
@@ -1583,6 +1590,8 @@ this request. Check wms/ows_enable_request settings.",
15831590
layers[l] = strdup(tmpId);
15841591
msInsertLayer(map, psTmpLayer, -1);
15851592
bLayerInserted =MS_TRUE;
1593+
/* layer was copied, we need to decrement its refcount */
1594+
MS_REFCNT_DECR(psTmpLayer);
15861595
}
15871596
}
15881597
}
@@ -1602,8 +1611,7 @@ this request. Check wms/ows_enable_request settings.",
16021611
lp = GET_LAYER(map, j);
16031612
for (k=0; k<lp->numclasses; k++) {
16041613
if (lp->class[k]->group && strcasecmp(lp->class[k]->group, tokens[i]) == 0) {
1605-
if (lp->classgroup)
1606-
msFree(lp->classgroup);
1614+
msFree(lp->classgroup);
16071615
lp->classgroup = msStrdup( tokens[i]);
16081616
break;
16091617
}
@@ -1640,16 +1648,14 @@ this request. Check wms/ows_enable_request settings.",
16401648
} else {
16411649
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, ...",
16421650
"msWMSLoadGetMapParams()", styles);
1643-
if (tokens && n > 0)
1644-
msFreeCharArray(tokens, n);
1645-
if (layers && numlayers > 0)
1646-
msFreeCharArray(layers, numlayers);
1651+
msFreeCharArray(tokens, n);
1652+
msFreeCharArray(layers, numlayers);
16471653
return msWMSException(map, nVersion, "StyleNotDefined", wms_exception_format);
16481654
}
16491655
}
16501656
}
1651-
if (tokens && n > 0)
1652-
msFreeCharArray(tokens, n);
1657+
msFreeCharArray(tokens, n);
1658+
msFreeCharArray(layers, numlayers);
16531659
}
16541660

16551661
/*
@@ -2227,6 +2233,7 @@ int msDumpLayer(mapObj *map, layerObj *lp, int nVersion, const char *script_url_
22272233
msFree(pszDimension);
22282234
msFree(pszDimensionItemName);
22292235
msFree(pszDimensionUnitName);
2236+
msFree(pszDimensionExtentName);
22302237
msFree(pszDimensionDefaultName);
22312238

22322239
}
@@ -4505,8 +4512,7 @@ this request. Check wms/ows_enable_request settings.",
45054512
"msWMSGetLegendGraphic()");
45064513
return msWMSException(map, nVersion, "StyleNotDefined", wms_exception_format);
45074514
} else {
4508-
if (GET_LAYER(map, iLayerIndex)->classgroup)
4509-
msFree(GET_LAYER(map, iLayerIndex)->classgroup);
4515+
msFree(GET_LAYER(map, iLayerIndex)->classgroup);
45104516
GET_LAYER(map, iLayerIndex)->classgroup = msStrdup(pszStyle);
45114517

45124518
}

0 commit comments

Comments
 (0)