summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2026-08-17 22:09:07 +0000
committerTom Lane2026-08-17 22:09:07 +0000
commit05556bdf938db0f4b87f3852cd5802fb71a13263 (patch)
tree80db0d7395d3d39ea50eea9739aaf46877f1f5e5
parent9d2d3bd079f90aaf05988ef61de6a7b8d0118c70 (diff)
Tighten up tsqueryrecv().
tsqueryrecv() accepted zero-length lexemes, which tsqueryin() doesn't. It also accepted phrase distance values larger than MAXENTRYPOS, which tsqueryin() doesn't. While neither of these omissions are very harmful in themselves, they do allow accepting tsquery values that will fail in a subsequent textual dump/reload. Commit 23d9ad771 performed similar tightening of tsvectorrecv(), but I left off these changes at the time because they didn't seem to have security implications. Reported-by: Claude Code (via Noah Misch) Author: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Chao Li <li.evan.chao@gmail.com> Discussion: https://postgr.es/m/455079.1786897319@sss.pgh.pa.us Backpatch-through: 14
-rw-r--r--src/backend/utils/adt/tsquery.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c
index 89d95086e82..fd7a35cf54a 100644
--- a/src/backend/utils/adt/tsquery.c
+++ b/src/backend/utils/adt/tsquery.c
@@ -1220,6 +1220,9 @@ tsqueryrecv(PG_FUNCTION_ARGS)
if (weight > 0xF)
elog(ERROR, "invalid tsquery: invalid weight bitmap");
+ if (val_len == 0)
+ elog(ERROR, "invalid tsquery: empty operand");
+
if (val_len > MAXSTRLEN)
elog(ERROR, "invalid tsquery: operand too long");
@@ -1259,7 +1262,14 @@ tsqueryrecv(PG_FUNCTION_ARGS)
item->qoperator.oper = oper;
if (oper == OP_PHRASE)
- item->qoperator.distance = (int16) pq_getmsgint(buf, sizeof(int16));
+ {
+ unsigned int dist = pq_getmsgint(buf, sizeof(int16));
+
+ if (dist > MAXENTRYPOS)
+ elog(ERROR, "invalid tsquery: invalid phrase distance %u",
+ dist);
+ item->qoperator.distance = (int16) dist;
+ }
}
else
elog(ERROR, "unrecognized tsquery node type: %d", item->type);