Requires and labelrequires aren’t operating at the feature level, rather
the layer level so they definitely don’t support attribute binding. We’d
need to whip up a test case to figure out a method to trap this. The
workaround is to fix the expression. I mean, obviously we don’t want to
crash but it’s never going to work if written as you suspect.

On Sat, Feb 19, 2022 at 7:55 AM Tamas Szekeres <[email protected]> wrote:

> Hi Devs,
>
> I got a crash log which shows that the access violation is happening in
> the following location:
>
> *mapserver!yylex+0x1b5 
> [e:\builds-t1\src\mapserver-intramaps\vc15x64\mapparser.y @ 858]
>               mapserver!yyparse+0x247 
> [e:\home\even\mapserver\mapserver\mapparser.c @ 1461]
>               mapserver!msEvalContext+0x178 
> [e:\builds-t1\src\mapserver-intramaps\maputil.c @ 442]
>               mapserver!msDrawVectorLayer+0xb0 
> [e:\builds-t1\src\mapserver-intramaps\mapdraw.c @ 918]
>               mapserver!msDrawLayer+0x3a3 
> [e:\builds-t1\src\mapserver-intramaps\mapdraw.c @ 813]
>               mapserver!msDrawMap+0x415 
> [e:\builds-t1\src\mapserver-intramaps\mapdraw.c @ 403]
>               mapscript!CSharp_mapObj_draw+0xd*
>
> By looking into the corresponding code, the problem has happened in the
> following location in yylex():
>
>
>
>
> * case MS_TOKEN_BINDING_INTEGER:    token = NUMBER; ---->   (*lvalp).dblval = 
> atof(p->shape->values[p->expr->curtoken->tokenval.bindval.index]);    break;*
>
> In maputil.c the call stack location is here (msEvalContext):
>
>
>
>
>
>
>
>
>
>
> *msTokenizeExpression(&e, NULL, NULL);  p.shape = NULL;  p.expr = &e;  
> p.expr->curtoken = p.expr->tokens; /* reset */  p.type = 
> MS_PARSE_TYPE_BOOLEAN;----->  status = yyparse(&p);  msFreeExpression(&e);*
>
> And in mapdraw.c
>
>
>
>
>
>
>
> * /* TODO TBT: draw as raster layer in vector renderers */----->  annotate = 
> msEvalContext(map, layer, layer->labelrequires);  if(map->scaledenom > 0) {   
>  if((layer->labelmaxscaledenom != -1) && (map->scaledenom >= 
> layer->labelmaxscaledenom)) annotate = MS_FALSE;    
> if((layer->labelminscaledenom != -1) && (map->scaledenom < 
> layer->labelminscaledenom)) annotate = MS_FALSE;  }*
>
> I'm not sure if the LABELREQUIRES option supports attribute binding
> (probably not) and in that case the
> p->expr->curtoken->tokenval.bindval.index would probably have undefined
> value. I don't have any information about the corresponding LABELREQUIRES
> expression , but if I assume it doesn't contain attribute binding, then
> this crash might probably happen due to a missing parser lock around 
> *yyparse(&p).
> *What do you think about the problem and how could we work around this?
>
> Thanks,
>
> Tamas
>
>
> _______________________________________________
> MapServer-dev mailing list
> [email protected]
> https://lists.osgeo.org/mailman/listinfo/mapserver-dev
>
_______________________________________________
MapServer-dev mailing list
[email protected]
https://lists.osgeo.org/mailman/listinfo/mapserver-dev

Reply via email to