summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2025-03-08 11:24:22 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2025-03-08 11:24:52 -0500
commite2921c0e9de3c153b9d75d1fcf219afce42f64c7 (patch)
tree2824f0b92dd3038ece69fa7650d3c5616965e258 /src
parentbc6a81ac3a8346c9f3cb5fc6f714977127aa2f31 (diff)
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/tsearch/spell.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c
index edd2fbbd3a5..c20247cf2ae 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,
@@ -1056,6 +1057,7 @@ setCompoundAffixFlagValue(IspellDict *Conf, CompoundAffixFlag *entry,
char *next;
int i;
+ errno = 0;
i = strtol(s, &next, 10);
if (s == next || errno == ERANGE)
ereport(ERROR,
@@ -1183,6 +1185,7 @@ getAffixFlagSet(IspellDict *Conf, char *s)
int curaffix;
char *end;
+ errno = 0;
curaffix = strtol(s, &end, 10);
if (s == end || errno == ERANGE)
ereport(ERROR,
@@ -1755,6 +1758,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,