Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix segfault with expression bindings on database backends #5161

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 22 additions & 7 deletions maplayer.c
Expand Up @@ -65,6 +65,13 @@ void msLayerFreeItemInfo(layerObj *layer)
return;
}
layer->vtable->LayerFreeItemInfo(layer);

/*
* Layer expressions with attribute binding hold a numeric index pointing
* to an iteminfo (node->tokenval.bindval.index). If iteminfo changes,
* an expression may be no longer valid. (#5161)
*/
msLayerFreeExpressions(layer);
}

int msLayerRestoreFromScaletokens(layerObj *layer)
Expand Down Expand Up @@ -412,8 +419,6 @@ int msLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record)
*/
void msLayerClose(layerObj *layer)
{
int i,j,k;

/* no need for items once the layer is closed */
msLayerFreeItemInfo(layer);
if(layer->items) {
Expand All @@ -423,6 +428,21 @@ void msLayerClose(layerObj *layer)
}

/* clear out items used as part of expressions (bug #2702) -- what about the layer filter? */
msLayerFreeExpressions(layer);

if (layer->vtable) {
layer->vtable->LayerClose(layer);
}
msLayerRestoreFromScaletokens(layer);
}

/*
** Clear out items used as part of expressions.
*/
void msLayerFreeExpressions(layerObj *layer)
{
int i,j,k;

msFreeExpressionTokens(&(layer->filter));
msFreeExpressionTokens(&(layer->cluster.group));
msFreeExpressionTokens(&(layer->cluster.filter));
Expand All @@ -436,11 +456,6 @@ void msLayerClose(layerObj *layer)
msFreeExpressionTokens(&(layer->class[i]->labels[k]->text));
}
}

if (layer->vtable) {
layer->vtable->LayerClose(layer);
}
msLayerRestoreFromScaletokens(layer);
}

/*
Expand Down
1 change: 1 addition & 0 deletions mapserver.h
Expand Up @@ -2410,6 +2410,7 @@ void msPopulateTextSymbolForLabelAndString(textSymbolObj *ts, labelObj *l, char
MS_DLL_EXPORT int msClusterLayerOpen(layerObj *layer); /* in mapcluster.c */
MS_DLL_EXPORT int msLayerIsOpen(layerObj *layer);
MS_DLL_EXPORT void msLayerClose(layerObj *layer);
MS_DLL_EXPORT void msLayerFreeExpressions(layerObj *layer);
MS_DLL_EXPORT int msLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery);
MS_DLL_EXPORT int msLayerGetItemIndex(layerObj *layer, char *item);
MS_DLL_EXPORT int msLayerWhichItems(layerObj *layer, int get_all, const char *metadata);
Expand Down