| From: | Andrey Rachitskiy <pl0h0yp1(at)gmail(dot)com> |
|---|---|
| To: | ♂π≌26218 <1991230470(at)qq(dot)com> |
| Cc: | pgsql-bugs <pgsql-bugs(at)lists(dot)postgresql(dot)org> |
| Subject: | Re: Hunspell AF alias count silently wraps to a smaller value |
| Date: | 2026-09-10 13:28:22 |
| Message-ID: | CAB8bMiuLDx1HLmLnES3kh80P5cmYWMQjTq18-mru6w9o6jCtEQ@mail.gmail.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-bugs |
чт, 10 сент. 2026 г. в 17:08, ♂π≌26218 <1991230470(at)qq(dot)com>:
> Hi,
>
> I found a potential bug in PostgreSQL's Hunspell dictionary parser where an over-wide `AF` alias count in an affix file is accepted after being silently converted to a smaller positive integer, without any error or warning.
>
> Description:
>
> An affix file declaring `AF 4294967297` (which exceeds the maximum value representable in a 32-bit unsigned integer by 1) but containing only one alias definition loads successfully and behaves as if it declared one alias. The parsing path appears to use a narrow integer conversion and validates only the converted value, not whether the original number can be represented without loss.
>
> PostgreSQL version:
> - PostgreSQL 19beta3 (Docker-based runtime)
> - Source commit: not recorded in the original report
> - Build relationship: the tested image was not an exact-HEAD build
>
> Environment:
> - Docker-based PostgreSQL 19beta3 runtime
> - Hunspell dictionary support enabled by default
> - No special server configuration required beyond superuser access to create dictionaries
>
> Steps to Reproduce:
>
> Create `af_overflow.affix` in PostgreSQL's `tsearch_data` directory:
>
> ```text
> SET UTF-8
> AF 4294967297
> AF A
> PFX A Y 1
> PFX A 0 re .
>
> Create af_overflow.dict:
> text
>
> book/1
>
> Then, as a superuser, execute the following SQL:
> sql
>
> \set VERBOSITY verboseCREATE TEXT SEARCH DICTIONARY af_overflow (
> TEMPLATE = ispell,
> DictFile = af_overflow,
> AffFile = af_overflow);SELECT ts_lexize('af_overflow', 'rebook');
>
> Actual Result:
>
> The dictionary is created successfully without any error. ts_lexize
> returns:
> text
>
> {book}
>
> The declared value 4294967297 effectively behaves as if the alias count
> was 1, which matches the number of defined aliases.
>
> Expected Result:
>
> The loader should reject an AF count that is out of range, cannot be
> converted losslessly, or does not match the number of alias definitions. An
> explicit error message such as "AF alias count out of range" or "number of
> AF aliases does not match declaration" would be appropriate.
>
> Reproduction Frequency:
>
> -
>
> Positive reproduction: 2/2 on PostgreSQL 19beta3
> -
>
> Negative control: replacing the count with AF 1 loads and lexizes
> normally
>
> Additional Observations:
>
> This appears to be a low-impact issue because it requires elevated
> privileges to install dictionary files and create text-search dictionaries.
> However, it could lead to subtle misbehavior if a dictionary file with an
> overflowed count is accidentally used. The issue is likely located in the
> affix-file parsing code where the AF count is converted without checking
> for overflow or loss of precision.
>
> I searched the public PostgreSQL bug archives and did not find any report
> specifically addressing overflow handling of AF alias counts. Please
> confirm whether this is considered a bug or an intentional limitation of
> the parsing logic.
>
> ♂π≌26218
> 1991230470(at)qq(dot)com
>
> <https://wx.mail.qq.com/home/index?t=readmail_businesscard_midpage&nocheck=true&name=%E2%99%82%CF%80%E2%89%8C26218&icon=https%3A%2F%2Fp.qlogo.cn%2Fqqmail_head%2F7zCZdnCEqwFr60hzEibU1KOjLPppnhmolM05y60o9OJhh4GoeKYHtrSgNUk8KpD2I%2F160&mail=1991230470%40qq.com&code=g5VzPQl67UBOaO3N0VLdCtumeljBoBFYOGmy5Le_CPM8hp3rB1CbWb9Mf7UfBsq8Ecxg9ZBK8rZhZfvlSXXlwg>
>
Hi!
Thnx for the report.
Proposal Fix
-----------------
Parse the count with strtol(), same pattern as parseNumericAffixFlag().
Reject ERANGE, non-numeric input, n <= 0, and n >= INT_MAX (room is
needed for the empty flag-set slot).
--
Regards,
Rachitskiy Andrey
| Attachment | Content-Type | Size |
|---|---|---|
| 0001-Reject-out-of-range-Hunspell-AF-alias-counts.patch | text/x-patch | 4.5 KB |
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Ayush Tiwari | 2026-09-10 13:41:34 | Re: START_REPLICATION silently truncates an overlong LSN component |
| Previous Message | Andrey Rachitskiy | 2026-09-10 12:42:08 | Re: BUG #19671: IPv4 CIDR Prefix Integer Overflow Bypasses Validation in inet/cidr Casts |