BUG #11770: Segfault on spell.c when there are more than one characters as suffix flag - Mailing list pgsql-bugs

From emre@hasegeli.com
Subject BUG #11770: Segfault on spell.c when there are more than one characters as suffix flag
Date
Msg-id 20141023092838.2674.7830@wrigleys.postgresql.org
Whole thread Raw
Responses Re: BUG #11770: Segfault on spell.c when there are more than one characters as suffix flag  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-bugs
The following bug has been logged on the website:

Bug reference:      11770
Logged by:          Emre Hasegeli
Email address:      emre@hasegeli.com
PostgreSQL version: 9.0.18
Operating system:   Mac OS X Version 10.9.5
Description:

How to reproduce:

create text search dictionary hunspell_tr (template = ispell, dictfile = tr,
afffile = tr);
select ts_lexize('hunspell_tr', 'veriye');


$SHAREDIR/tsearch_data/tr.dict:

ONLYINCOMPOUND L

SFX 100 N 1
SFX 100 0 ye .


$SHAREDIR/tsearch_data/tr.dict:

veri/100


Note that the affix file is not correct without "FLAG num" which is not
supported by PostgreSQL.  Also, the code fails to report the proper error
on spell.c:673 when "FLAG num" is used.

Tested on master and REL9_0_STABLE.

Backtrace:

* thread #1: tid = 0x62bf2, 0x0000000101a7413a postgres`SplitToVariants
[inlined] CheckCompoundAffixes(ptr=<unavailable>, word=0x00007f99e200a8f1,
len=8) at spell.c:1522, queue = 'com.apple.main-thread', stop reason =
EXC_BAD_ACCESS (code=1, address=0x0)
  * frame #0: 0x0000000101a7413a postgres`SplitToVariants [inlined]
CheckCompoundAffixes(ptr=<unavailable>, word=0x00007f99e200a8f1, len=8) at
spell.c:1522
    frame #1: 0x0000000101a7413a
postgres`SplitToVariants(Conf=0x00007f99e2012448, snode=<unavailable>,
orig=<unavailable>, word=0x00007f99e200a8f0, wordlen=9,
startpos=<unavailable>, minpos=<unavailable>) + 442 at spell.c:1598
    frame #2: 0x0000000101a73402
postgres`NINormalizeWord(Conf=0x00007f99e2012448, word=0x00007f99e200a8f0) +
290 at spell.c:1764
    frame #3: 0x0000000101a700b1
postgres`dispell_lexize(fcinfo=<unavailable>) + 49 at dict_ispell.c:124
    frame #4: 0x0000000101b621ec
postgres`FunctionCall4Coll(flinfo=<unavailable>, collation=<unavailable>,
arg1=<unavailable>, arg2=<unavailable>, arg3=<unavailable>,
arg4=<unavailable>) + 124 at fmgr.c:1376
    frame #5: 0x0000000101a69922 postgres`LexizeExec(ld=<unavailable>,
correspondLexem=<unavailable>) + 642 at ts_parse.c:207
    frame #6: 0x0000000101a69542 postgres`parsetext(cfgId=<unavailable>,
prs=<unavailable>, buf=<unavailable>, buflen=<unavailable>) + 466 at
ts_parse.c:405
    frame #7: 0x0000000101a7510c
postgres`to_tsvector_byid(fcinfo=0x00007f99e20085c0) + 124 at
to_tsany.c:224
    frame #8: 0x000000010195b811
postgres`ExecMakeFunctionResultNoSets(fcache=0x00007f99e2008550,
econtext=<unavailable>, isNull=0x00007fff5e425387, isDone=<unavailable>) +
209 at execQual.c:1992
    frame #9: 0x0000000101955b9b
postgres`ExecEvalExprSwitchContext(expression=<unavailable>,
econtext=<unavailable>, isNull=<unavailable>, isDone=<unavailable>) + 27 at
execQual.c:4320
    frame #10: 0x00000001019dfac9 postgres`evaluate_expr(expr=<unavailable>,
result_type=3614, result_typmod=-1, result_collation=0) + 121 at
clauses.c:4568
    frame #11: 0x00000001019df22e postgres`simplify_function [inlined]
evaluate_function(funcid=<unavailable>, result_type=<unavailable>,
result_typmod=<unavailable>, result_collid=<unavailable>,
input_collid=<unavailable>, args=<unavailable>, funcvariadic=<unavailable>,
func_tuple=<unavailable>, context=<unavailable>) + 332 at clauses.c:4129
    frame #12: 0x00000001019df0e2
postgres`simplify_function(funcid=<unavailable>, result_type=<unavailable>,
result_typmod=<unavailable>, result_collid=<unavailable>,
input_collid=<unavailable>, args_p=<unavailable>,
funcvariadic=<unavailable>, process_args=<unavailable>,
allow_non_const='\b', context=<unavailable>) + 162 at clauses.c:3768
    frame #13: 0x00000001019dd16c
postgres`eval_const_expressions_mutator(node=0x00007f99e2006660,
context=0x00007fff5e425748) + 620 at clauses.c:2459
    frame #14: 0x000000010198baa5
postgres`expression_tree_mutator(node=<unavailable>, mutator=<unavailable>,
context=<unavailable>) + 581 at nodeFuncs.c:2374
    frame #15: 0x00000001019dd03b
postgres`eval_const_expressions_mutator(node=<unavailable>,
context=<unavailable>) + 315 at clauses.c:3418
    frame #16: 0x000000010198b98b
postgres`expression_tree_mutator(node=<unavailable>,
mutator=0x00000001019dcf00, context=0x00007fff5e425748) + 299 at
nodeFuncs.c:2570
    frame #17: 0x00000001019dd03b
postgres`eval_const_expressions_mutator(node=<unavailable>,
context=<unavailable>) + 315 at clauses.c:3418
    frame #18: 0x00000001019dcefa
postgres`eval_const_expressions(root=<unavailable>, node=<unavailable>) + 74
at clauses.c:2301
    frame #19: 0x00000001019c9eea postgres`subquery_planner [inlined]
preprocess_expression(expr=<unavailable>, kind=<unavailable>) + 34 at
planner.c:678
    frame #20: 0x00000001019c9ec8
postgres`subquery_planner(glob=0x00007f99e183c1e0, parse=0x00007f99e183bf38,
parent_root=<unavailable>, hasRecursion=<unavailable>, tuple_fraction=0,
subroot=0x00007fff5e4259b0) + 1112 at planner.c:426
    frame #21: 0x00000001019c9878
postgres`standard_planner(parse=0x00007f99e183bf38,
cursorOptions=<unavailable>, boundParams=<unavailable>) + 232 at
planner.c:211
    frame #22: 0x0000000101a5f8ba
postgres`pg_plan_query(querytree=0x00007f99e183bf38, cursorOptions=0,
boundParams=0x0000000000000000) + 106 at postgres.c:750
    frame #23: 0x0000000101a62e1f postgres`PostgresMain [inlined]
pg_plan_queries(querytrees=<unavailable>, cursorOptions=<unavailable>,
boundParams=<unavailable>) + 50 at postgres.c:809
    frame #24: 0x0000000101a62ded postgres`PostgresMain [inlined]
exec_simple_query(query_string=<unavailable>) + 13 at postgres.c:974
    frame #25: 0x0000000101a62de0 postgres`PostgresMain(argc=<unavailable>,
argv=<unavailable>, dbname=0x00007f99e1004e10, username=<unavailable>) +
8992 at postgres.c:4010
    frame #26: 0x00000001019fa4d8 postgres`PostmasterMain [inlined]
BackendRun + 7768 at postmaster.c:4118
    frame #27: 0x00000001019fa4b2 postgres`PostmasterMain [inlined]
BackendStartup at postmaster.c:3793
    frame #28: 0x00000001019fa4b2 postgres`PostmasterMain [inlined]
ServerLoop at postmaster.c:1572
    frame #29: 0x00000001019fa4b2
postgres`PostmasterMain(argc=<unavailable>, argv=<unavailable>) + 7730 at
postmaster.c:1219
    frame #30: 0x0000000101989909 postgres`main(argc=<unavailable>,
argv=<unavailable>) + 1081 at main.c:220
    frame #31: 0x00007fff90aaa5fd libdyld.dylib`start + 1

pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: BUG #11712: Empty string as error message from libpq
Next
From: Tom Lane
Date:
Subject: Re: BUG #11770: Segfault on spell.c when there are more than one characters as suffix flag