Re: Potential buffer overrun in spell.c's CheckAffix()
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: Andrey Borodin <x4mmm@yandex-team.ru>
Cc: PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2026-04-22T13:44:40Z
Lists: pgsql-bugs
Andrey Borodin <x4mmm@yandex-team.ru> writes: >> On 21 Apr 2026, at 22:32, Tom Lane <tgl@sss.pgh.pa.us> wrote: >> + /* protect against buffer overrun */ >> + if (len < Affix->replen || len >= 2 * MAXNORMLEN || >> + len - Affix->replen + findlen >= 2 * MAXNORMLEN) >> + return NULL; >> + >> strcpy(newword, word); >> strcpy(newword + len - Affix->replen, Affix->find); > Is there a reason for an asymmetric check "len >= 2 * MAXNORMLEN ||”? Yes. Because of that initial "strcpy(newword, word);", we do actually need "word" to fit in the output buffer, even if the final output string is shorter. The other path does not require that. I suppose we could replace the strcpy with memcpy(newword, word, len - Affix->replen); and then we would not need the "len >= 2 * MAXNORMLEN" test and both paths could share the same check. There's something to be said for that, though it would be changing the logic to a greater extent than just "add some safety checks". >> I chose to do this by silently truncating the input before it can >> overrun the buffer, using logic comparable to the existing logic in >> get_nextfield(). Certainly there's at least as good an argument for >> raising an error, but for now let's follow the existing precedent. > Is there a reason not to emit WARNING? The data is obviously suspicious… > Perhaps, there’s a reason, so maybe just document it then. I could agree with changing all of these cases (including the existing get_nextfield checks) to throw ERROR; but I don't think that's something to do in a back-patched bug fix. Another thing I don't love, but wouldn't change in back branches, is the use of BUFSIZ for the string lengths. That's far more than necessary (why not just MAXNORMLEN?), causing these functions to eat much more stack space than they need. Also it seems like an unnecessary platform dependency. Maybe BUFSIZ is 8K everywhere, but I'm not sure of that. regards, tom lane
Commits
-
Prevent some buffer overruns in spell.c's parsing of affix files.
- ea5f0d176a9d 17.10 landed
- d7970e7e951b 19 (unreleased) landed
- 42383d32d78a 16.14 landed
- 21a24d709500 14.23 landed
- 0b196d3db713 15.18 landed
- 00c6e08195d5 18.4 landed
-
Prevent buffer overrun in spell.c's CheckAffix().
- 6cae0c2bd211 14.23 landed
- f852c9093fb0 15.18 landed
- 17f72e037f20 16.14 landed
- a5426dbf8415 17.10 landed
- c2bfeb3bbaa7 18.4 landed
- 844bb90d49f7 19 (unreleased) landed