From 532a4c3531d65fef101d2564234f064883ea92ef Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 3 Aug 2010 01:50:27 +0000 Subject: [PATCH] Be a little more careful with the shift computations in QT2QTN and makeTSQuerySign. The first of these is a live bug, on some platforms, as per bug #5590 from John Regehr. However the consequences seem limited because of the relatively narrow scope of use of QTNode.sign. The shift in makeTSQuerySign is actually safe because TSQS_SIGLEN is unsigned, but it seems like a good idea to insert an explicit cast rather than depend on that. --- src/backend/utils/adt/tsquery_op.c | 4 ++-- src/backend/utils/adt/tsquery_util.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/utils/adt/tsquery_op.c b/src/backend/utils/adt/tsquery_op.c index 0b81ff5938..03edc7b172 100644 --- a/src/backend/utils/adt/tsquery_op.c +++ b/src/backend/utils/adt/tsquery_op.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_op.c,v 1.9 2010/08/03 00:10:39 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_op.c,v 1.10 2010/08/03 01:50:26 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -209,7 +209,7 @@ makeTSQuerySign(TSQuery a) for (i = 0; i < a->size; i++) { if (ptr->type == QI_VAL) - sign |= ((TSQuerySign) 1) << (ptr->qoperand.valcrc % TSQS_SIGLEN); + sign |= ((TSQuerySign) 1) << (((unsigned int) ptr->qoperand.valcrc) % TSQS_SIGLEN); ptr++; } diff --git a/src/backend/utils/adt/tsquery_util.c b/src/backend/utils/adt/tsquery_util.c index 5e309fea7c..80e169e430 100644 --- a/src/backend/utils/adt/tsquery_util.c +++ b/src/backend/utils/adt/tsquery_util.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_util.c,v 1.14 2010/08/03 00:10:39 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/tsquery_util.c,v 1.15 2010/08/03 01:50:27 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -45,7 +45,7 @@ QT2QTN(QueryItem *in, char *operand) else if (operand) { node->word = operand + in->qoperand.distance; - node->sign = 1 << (in->qoperand.valcrc % 32); + node->sign = ((uint32) 1) << (((unsigned int) in->qoperand.valcrc) % 32); } return node;