postgres.git / summary / log / commit / refs

commit    61513da08b169fcc58c78bdf8752a81ea1fc92bd
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Sat Mar 08 16:24:22 2025 +0000
First released in: 18.0, 13.21, 14.18, 15.13, 16.9, 17.5

    Clear errno before calling strtol() in spell.c.
    
    Per POSIX, a caller of strtol() that wishes to check for errors must
    set errno to 0 beforehand.  Several places in spell.c neglected that,
    so that they risked delivering a false overflow error in case errno
    had been ERANGE already.  Given the lack of field reports, this case
    may be unreachable at present --- but it's surely trouble waiting to
    happen, so fix it.
    
    Author: Jacob Brazeal <jacob.brazeal@gmail.com>
    Discussion: https://postgr.es/m/CA+COZaBhsq6EromFm+knMJfzK6nTpG23zJ+K2=nfUQQXcj_xcQ@mail.gmail.com
    Backpatch-through: 13


src/backend/tsearch/spell.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c index 8a2cb558769..8d1d81501f2 100644 --- a/src/backend/tsearch/spell.c +++ b/src/backend/tsearch/spell.c @@ -374,6 +374,7 @@ getNextFlagFromString(IspellDict *Conf, char **sflagset, char *sflag) stop = (maxstep == 0); break; case FM_NUM: + errno = 0; s = strtol(*sflagset, &next, 10); if (*sflagset == next || errno == ERANGE) ereport(ERROR, @@ -1036,6 +1037,7 @@ setCompoundAffixFlagValue(IspellDict *Conf, CompoundAffixFlag *entry, char *next; int i; + errno = 0; i = strtol(s, &next, 10); if (s == next || errno == ERANGE) ereport(ERROR, @@ -1163,6 +1165,7 @@ getAffixFlagSet(IspellDict *Conf, char *s) int curaffix; char *end; + errno = 0; curaffix = strtol(s, &end, 10); if (s == end || errno == ERANGE) ereport(ERROR, @@ -1735,6 +1738,7 @@ NISortDictionary(IspellDict *Conf) if (*Conf->Spell[i]->p.flag != '\0') { + errno = 0; curaffix = strtol(Conf->Spell[i]->p.flag, &end, 10); if (Conf->Spell[i]->p.flag == end || errno == ERANGE) ereport(ERROR, [parent: 98aa99b6d682]