Hi Steve,

According to the call stack below, yyparse also calling yylex internally,
which is not considered to be reentrant I think.

*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]*


Best regards,

Tamas


Steve Lime <[email protected]> ezt írta (időpont: 2022. febr. 19., Szo,
17:53):

> I thought generating tokens for an expression needed a lock since it uses
> the lexer but that the parser did not. I could be wrong though.
>
> On Sat, Feb 19, 2022 at 10:21 AM Steve Lime <[email protected]> wrote:
>
>> I don’t remember offhand and will have to check. That said if there is a
>> attribute level token in a layer level expression than that would explain
>> your research. Is there really no way to get info on the expression(s) in
>> question?
>>
>> On Sat, Feb 19, 2022 at 9:22 AM Tamas Szekeres <[email protected]>
>> wrote:
>>
>>> I'm not too familiar in the current parser/lexer implementation, but is
>>> msTokenizeExpression and yyparse supposed to be protected by the same
>>> parser lock in msEvalContext? Or if  msTokenizeExpression doesn't leave
>>> any global variables behind, should yyparse be protected by it's own?
>>>
>>> Thanks,
>>>
>>> Tamas
>>>
>>>
>>> Steve Lime <[email protected]> ezt írta (időpont: 2022. febr. 19., Szo,
>>> 16:02):
>>>
>>>> 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