mirror of
https://github.com/postgres/postgres.git
synced 2025-07-12 21:01:52 +03:00
Fix choice of comparison operators for cross-type hashed subplans.
Commit bf6c614a2
rearranged the lookup of the comparison operators
needed in a hashed subplan, and in so doing, broke the cross-type
case: it caused the original LHS-vs-RHS operator to be used to compare
hash table entries too (which of course are all of the RHS type).
This leads to C functions being passed a Datum that is not of the
type they expect, with the usual hazards of crashes and unauthorized
server memory disclosure.
For the set of hashable cross-type operators present in v11 core
Postgres, this bug is nearly harmless on 64-bit machines, which
may explain why it escaped earlier detection. But it is a live
security hazard on 32-bit machines; and of course there may be
extensions that add more hashable cross-type operators, which
would increase the risk.
Reported by Andreas Seltenreich. Back-patch to v11 where the
problem came in.
Security: CVE-2019-10209
This commit is contained in:
@ -764,6 +764,30 @@ select * from outer_text where (f1, f2) not in (select * from inner_text);
|
||||
b |
|
||||
(2 rows)
|
||||
|
||||
--
|
||||
-- Another test case for cross-type hashed subplans: comparison of
|
||||
-- inner-side values must be done with appropriate operator
|
||||
--
|
||||
explain (verbose, costs off)
|
||||
select 'foo'::text in (select 'bar'::name union all select 'bar'::name);
|
||||
QUERY PLAN
|
||||
-------------------------------------
|
||||
Result
|
||||
Output: (hashed SubPlan 1)
|
||||
SubPlan 1
|
||||
-> Append
|
||||
-> Result
|
||||
Output: 'bar'::name
|
||||
-> Result
|
||||
Output: 'bar'::name
|
||||
(8 rows)
|
||||
|
||||
select 'foo'::text in (select 'bar'::name union all select 'bar'::name);
|
||||
?column?
|
||||
----------
|
||||
f
|
||||
(1 row)
|
||||
|
||||
--
|
||||
-- Test case for premature memory release during hashing of subplan output
|
||||
--
|
||||
|
@ -452,6 +452,16 @@ insert into inner_text values ('a', null);
|
||||
|
||||
select * from outer_text where (f1, f2) not in (select * from inner_text);
|
||||
|
||||
--
|
||||
-- Another test case for cross-type hashed subplans: comparison of
|
||||
-- inner-side values must be done with appropriate operator
|
||||
--
|
||||
|
||||
explain (verbose, costs off)
|
||||
select 'foo'::text in (select 'bar'::name union all select 'bar'::name);
|
||||
|
||||
select 'foo'::text in (select 'bar'::name union all select 'bar'::name);
|
||||
|
||||
--
|
||||
-- Test case for premature memory release during hashing of subplan output
|
||||
--
|
||||
|
Reference in New Issue
Block a user