pgsql: Fix 32-bit build dangling pointer issue in WindowAgg - Mailing list pgsql-committers

From David Rowley
Subject pgsql: Fix 32-bit build dangling pointer issue in WindowAgg
Date
Msg-id E1p2Vpw-002E6J-Pm@gemulon.postgresql.org
Whole thread Raw
List pgsql-committers
Fix 32-bit build dangling pointer issue in WindowAgg

9d9c02ccd added window "run conditions", which allows the evaluation of
monotonic window functions to be skipped when the run condition is no
longer true.  Prior to this commit, once the run condition was no longer
true and we stopped evaluating the window functions, we simply just left
the ecxt_aggvalues[] and ecxt_aggnulls[] arrays alone to store whatever
value was stored there the last time the window function was evaluated.
Leaving a stale value in there isn't really a problem on 64-bit builds as
all of the window functions which we recognize as monotonic all return
int8, which is passed by value on 64-bit builds.  However, on 32-bit
builds, this was a problem as the value stored in the ecxt_values[]
element would be a by-ref value and it would be pointing to some memory
which would get reset once the tuple context is destroyed.  Since the
WindowAgg node will output these values in the resulting tupleslot, this
could be problematic for the top-level WindowAgg node which must look at
these values to filter out the rows that don't meet its filter condition.

Here we fix this by just zeroing the ecxt_aggvalues[] and setting the
ecxt_aggnulls[] array to true when the run condition first becomes false.
This results in the WindowAgg's output having NULLs for the WindowFunc's
columns rather than the stale or pointer pointing to possibly freed
memory.  These tuples with the NULLs can only make it as far as the
top-level WindowAgg node before they're filtered out.  To ensure that
these tuples *are* always filtered out, we now insist that OpExprs making
up the run condition are strict OpExprs.  Currently, all the window
functions which the planner recognizes as monotonic return INT8 and the
operator which is used for the run condition must be a member of a btree
opclass.  In reality, these restrictions exclude nothing that's built-in
to Postgres and are unlikely to exclude anyone's custom operators due to
the requirement that the operator is part of a btree opclass.  It would be
unusual if those were not strict.

Reported-by: Sergey Shinderuk, using valgrind
Reviewed-by: Richard Guo, Sergey Shinderuk
Discussion: https://postgr.es/m/29184c50-429a-ebd7-f1fb-0589c6723a35@postgrespro.ru
Backpatch-through: 15, where 9d9c02ccd was added

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/a8583272218ab6e97c7bdeb8a960d8d4de329b7e

Modified Files
--------------
src/backend/executor/nodeWindowAgg.c  | 20 ++++++++++++++++++++
src/backend/optimizer/path/allpaths.c | 12 ++++++++++++
2 files changed, 32 insertions(+)


pgsql-committers by date:

Previous
From: Michael Paquier
Date:
Subject: pgsql: Generate pg_stat_get*() functions for tables using macros
Next
From: David Rowley
Date:
Subject: pgsql: Fix 32-bit build dangling pointer issue in WindowAgg