From: Arthur Zakirov <a.zakirov@postgrespro.ru>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: exclusion@gmail.com
Cc: pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #15150: Reading uninitialised value in NISortAffixes (tsearch/spell.c)
Date: Fri, 13 Apr 2018 14:34:48 +0300
Message-ID: <20180413113447.GA32474@zakirov.localdomain> (raw)
In-Reply-To: <23884.1523571243@sss.pgh.pa.us>
References: <152353327780.31225.13445405496721177988@wrigleys.postgresql.org>
<20180412115638.GA19444@zakirov.localdomain>
<23884.1523571243@sss.pgh.pa.us>
On Thu, Apr 12, 2018 at 06:14:03PM -0400, Tom Lane wrote:
> Yeah, existing code is clearly wrong, patch looks OK, will push.
Thank you for the commit!
> But I see from the code coverage report that this bit is unexercised
> in the regression tests. Any chance of getting a test that covers
> this? I'm worried that this means we also lack any coverage of
> cases where the CompoundAffix array has more than one entry.
I attached the patch. It fixes the following:
- show an error if actual number of affix aliases is greater than
initial number. I wonder is it necessary. But I think it is better to
raise an error than crash, if you set wrong number for AF flag.
- improve code coverage for NISortAffixes().
- test regex_t expressions.
- test MergeAffix()
- test mkVoidAffix() better
The code coverage still isn't 100% for spell.c. But it is better than
earlier.
--
Arthur Zakirov
Postgres Professional: http://www.postgrespro.com
Russian Postgres Company
Attachments:improve-spell-codecoverage.patch (text/plain, 5.9K) downloaddiff --git a/src/backend/tsearch/dicts/hunspell_sample_long.affix b/src/backend/tsearch/dicts/hunspell_sample_long.affixindex fc0d485a4d..d5df7a31f3 100644--- a/src/backend/tsearch/dicts/hunspell_sample_long.affix+++ b/src/backend/tsearch/dicts/hunspell_sample_long.affix@@ -1,15 +1,23 @@
FLAG long
-AF 7+AF 11
AF cZ #1
AF cL #2
AF sGsJpUsS #3
AF sSpB #4
AF cZsS #5
-AF sScZs\ #6+AF sScZs\sE #6
AF sA #7
+AF CaCp #8+AF CcCp #9+AF sD #10+AF sB #11
COMPOUNDFLAG cZ
+COMPOUNDBEGIN Ca+COMPOUNDMIDDLE Cb+COMPOUNDEND Cc+COMPOUNDPERMITFLAG Cp
ONLYINCOMPOUND cL
PFX pB Y 1
@@ -28,7 +36,18 @@ SFX sS Y 1
SFX sS 0 S [^SXZHY]
SFX sA Y 1
-SFX sA Y IES [^AEIOU]Y+SFX sA Y IES [^AEIOU]Y{1}+SFX sB Y 1+SFX sB 0 ED K{1}++# Affixes with compound flags
SFX s\ N 1
SFX s\ 0 Y/2 [^Y]
++SFX sE N 1+SFX sE 0 S/2 [^S]++# Check duplicate affixes+SFX sD N 1+SFX sD 0 S/2 [^S]diff --git a/src/backend/tsearch/dicts/hunspell_sample_long.dict b/src/backend/tsearch/dicts/hunspell_sample_long.dictindex 96ecbf007a..5f60a07ce2 100644--- a/src/backend/tsearch/dicts/hunspell_sample_long.dict+++ b/src/backend/tsearch/dicts/hunspell_sample_long.dict@@ -1,4 +1,5 @@
book/3
+book/11
booking/4
footballklubber
foot/5
@@ -6,3 +7,5 @@ football/1
ball/6
klubber/1
sky/7
+ex-/8+machina/9
\ No newline at end of file
diff --git a/src/backend/tsearch/dicts/hunspell_sample_num.affix b/src/backend/tsearch/dicts/hunspell_sample_num.affixindex 5f2f8e9bca..0c4766a191 100644--- a/src/backend/tsearch/dicts/hunspell_sample_num.affix+++ b/src/backend/tsearch/dicts/hunspell_sample_num.affix@@ -18,6 +18,14 @@ SFX 302 0 ING [^E]
SFX 303 Y 1
SFX 303 0 S [^SXZHY]
+# Remove ED suffix from lexeme for base words with K ending+SFX 306 Y 1+SFX 306 0 ED K{1}++# Just add Y to lexeme for base words with Y ending+SFX 307 Y 1+SFX 307 Y 0 Y*+
SFX 304 Y 1
SFX 304 Y IES [^AEIOU]Y
diff --git a/src/backend/tsearch/dicts/hunspell_sample_num.dict b/src/backend/tsearch/dicts/hunspell_sample_num.dictindex 9db29dc780..fbc321d5b1 100644--- a/src/backend/tsearch/dicts/hunspell_sample_num.dict+++ b/src/backend/tsearch/dicts/hunspell_sample_num.dict@@ -1,8 +1,9 @@
book/302,301,202,303
+book/306
booking/303,201
footballklubber
foot/101,303
football/101
ball/303,101,305
klubber/101
-sky/304+sky/304,307diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.cindex 65d99da292..68049dda7c 100644--- a/src/backend/tsearch/spell.c+++ b/src/backend/tsearch/spell.c@@ -1326,6 +1326,11 @@ NIImportOOAffixes(IspellDict *Conf, const char *filename)
Conf->AffixData[curaffix] = cpstrdup(Conf, sflag);
curaffix++;
}
+ else+ ereport(ERROR,+ (errcode(ERRCODE_CONFIG_FILE_ERROR),+ errmsg("actual number of aliases exceeds initial "+ "number %d", naffix)));
}
goto nextline;
}
diff --git a/src/test/regress/expected/tsdicts.out b/src/test/regress/expected/tsdicts.outindex 0c1d7c7675..2524ec2768 100644--- a/src/test/regress/expected/tsdicts.out+++ b/src/test/regress/expected/tsdicts.out@@ -263,6 +263,12 @@ SELECT ts_lexize('hunspell_long', 'unbook');
{book}
(1 row)
+SELECT ts_lexize('hunspell_long', 'booked');+ ts_lexize +-----------+ {book}+(1 row)+
SELECT ts_lexize('hunspell_long', 'footklubber');
ts_lexize
----------------
@@ -281,12 +287,24 @@ SELECT ts_lexize('hunspell_long', 'ballyklubber');
{ball,klubber}
(1 row)
+SELECT ts_lexize('hunspell_long', 'ballsklubber');+ ts_lexize +----------------+ {ball,klubber}+(1 row)+
SELECT ts_lexize('hunspell_long', 'footballyklubber');
ts_lexize
---------------------
{foot,ball,klubber}
(1 row)
+SELECT ts_lexize('hunspell_long', 'ex-machina');+ ts_lexize +---------------+ {ex-,machina}+(1 row)+
-- Test ISpell dictionary with hunspell affix file with FLAG num parameter
CREATE TEXT SEARCH DICTIONARY hunspell_num (
Template=ispell,
@@ -299,6 +317,12 @@ SELECT ts_lexize('hunspell_num', 'skies');
{sky}
(1 row)
+SELECT ts_lexize('hunspell_num', 'sk');+ ts_lexize +-----------+ {sky}+(1 row)+
SELECT ts_lexize('hunspell_num', 'bookings');
ts_lexize
----------------
@@ -359,6 +383,12 @@ SELECT ts_lexize('hunspell_num', 'unbook');
{book}
(1 row)
+SELECT ts_lexize('hunspell_num', 'booked');+ ts_lexize +-----------+ {book}+(1 row)+
SELECT ts_lexize('hunspell_num', 'footklubber');
ts_lexize
----------------
diff --git a/src/test/regress/sql/tsdicts.sql b/src/test/regress/sql/tsdicts.sqlindex 1633c0d066..60906f6549 100644--- a/src/test/regress/sql/tsdicts.sql+++ b/src/test/regress/sql/tsdicts.sql@@ -66,11 +66,14 @@ SELECT ts_lexize('hunspell_long', 'rebook');
SELECT ts_lexize('hunspell_long', 'unbookings');
SELECT ts_lexize('hunspell_long', 'unbooking');
SELECT ts_lexize('hunspell_long', 'unbook');
+SELECT ts_lexize('hunspell_long', 'booked');
SELECT ts_lexize('hunspell_long', 'footklubber');
SELECT ts_lexize('hunspell_long', 'footballklubber');
SELECT ts_lexize('hunspell_long', 'ballyklubber');
+SELECT ts_lexize('hunspell_long', 'ballsklubber');
SELECT ts_lexize('hunspell_long', 'footballyklubber');
+SELECT ts_lexize('hunspell_long', 'ex-machina');
-- Test ISpell dictionary with hunspell affix file with FLAG num parameter
CREATE TEXT SEARCH DICTIONARY hunspell_num (
@@ -80,6 +83,7 @@ CREATE TEXT SEARCH DICTIONARY hunspell_num (
);
SELECT ts_lexize('hunspell_num', 'skies');
+SELECT ts_lexize('hunspell_num', 'sk');
SELECT ts_lexize('hunspell_num', 'bookings');
SELECT ts_lexize('hunspell_num', 'booking');
SELECT ts_lexize('hunspell_num', 'foot');
@@ -90,6 +94,7 @@ SELECT ts_lexize('hunspell_num', 'rebook');
SELECT ts_lexize('hunspell_num', 'unbookings');
SELECT ts_lexize('hunspell_num', 'unbooking');
SELECT ts_lexize('hunspell_num', 'unbook');
+SELECT ts_lexize('hunspell_num', 'booked');
SELECT ts_lexize('hunspell_num', 'footklubber');
SELECT ts_lexize('hunspell_num', 'footballklubber');
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-bugs@postgresql.org
Cc: a.zakirov@postgrespro.ru, tgl@sss.pgh.pa.us, exclusion@gmail.com, pgsql-bugs@lists.postgresql.org
Subject: Re: BUG #15150: Reading uninitialised value in NISortAffixes (tsearch/spell.c)
In-Reply-To: <20180413113447.GA32474@zakirov.localdomain>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox