!45 Fix CVE-2021-20229
From: @wang_yue111 Reviewed-by: @wangxiao65,@miao_kaibo Signed-off-by: @miao_kaibo
This commit is contained in:
commit
1b9765d8a5
@ -1,4 +1,4 @@
|
|||||||
From 0c3185e963d9f9dd0608214f7d732b84aa0888fe Mon Sep 17 00:00:00 2001
|
From f97ecea1ed7b09c6f1398540a1d72a57eee70c9f Mon Sep 17 00:00:00 2001
|
||||||
From: Noah Misch <noah@leadboat.com>
|
From: Noah Misch <noah@leadboat.com>
|
||||||
Date: Mon, 9 Nov 2020 07:32:09 -0800
|
Date: Mon, 9 Nov 2020 07:32:09 -0800
|
||||||
Subject: [PATCH] In security-restricted operations, block enqueue of at-commit
|
Subject: [PATCH] In security-restricted operations, block enqueue of at-commit
|
||||||
@ -29,7 +29,7 @@ Security: CVE-2020-25695
|
|||||||
6 files changed, 104 insertions(+), 6 deletions(-)
|
6 files changed, 104 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c
|
diff --git a/contrib/postgres_fdw/connection.c b/contrib/postgres_fdw/connection.c
|
||||||
index be4ec07cf9..09ffb21d48 100644
|
index 885bd075798c..5dcff3d07624 100644
|
||||||
--- a/contrib/postgres_fdw/connection.c
|
--- a/contrib/postgres_fdw/connection.c
|
||||||
+++ b/contrib/postgres_fdw/connection.c
|
+++ b/contrib/postgres_fdw/connection.c
|
||||||
@@ -645,6 +645,10 @@ pgfdw_report_error(int elevel, PGresult *res, PGconn *conn,
|
@@ -645,6 +645,10 @@ pgfdw_report_error(int elevel, PGresult *res, PGconn *conn,
|
||||||
@ -44,10 +44,10 @@ index be4ec07cf9..09ffb21d48 100644
|
|||||||
static void
|
static void
|
||||||
pgfdw_xact_callback(XactEvent event, void *arg)
|
pgfdw_xact_callback(XactEvent event, void *arg)
|
||||||
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
|
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
|
||||||
index 9004e38e6d..e2ca8a5d2e 100644
|
index 37f31a2c31ea..00cec50e8402 100644
|
||||||
--- a/src/backend/access/transam/xact.c
|
--- a/src/backend/access/transam/xact.c
|
||||||
+++ b/src/backend/access/transam/xact.c
|
+++ b/src/backend/access/transam/xact.c
|
||||||
@@ -1961,9 +1961,10 @@ CommitTransaction(void)
|
@@ -1994,9 +1994,10 @@ CommitTransaction(void)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do pre-commit processing that involves calling user-defined code, such
|
* Do pre-commit processing that involves calling user-defined code, such
|
||||||
@ -61,7 +61,7 @@ index 9004e38e6d..e2ca8a5d2e 100644
|
|||||||
*/
|
*/
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
@@ -1981,9 +1982,6 @@ CommitTransaction(void)
|
@@ -2014,9 +2015,6 @@ CommitTransaction(void)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,7 +71,7 @@ index 9004e38e6d..e2ca8a5d2e 100644
|
|||||||
/*
|
/*
|
||||||
* The remaining actions cannot call any user-defined code, so it's safe
|
* The remaining actions cannot call any user-defined code, so it's safe
|
||||||
* to start shutting down within-transaction services. But note that most
|
* to start shutting down within-transaction services. But note that most
|
||||||
@@ -1991,6 +1989,9 @@ CommitTransaction(void)
|
@@ -2024,6 +2022,9 @@ CommitTransaction(void)
|
||||||
* the transaction-abort path.
|
* the transaction-abort path.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ index 9004e38e6d..e2ca8a5d2e 100644
|
|||||||
if (IsInParallelMode())
|
if (IsInParallelMode())
|
||||||
AtEOXact_Parallel(true);
|
AtEOXact_Parallel(true);
|
||||||
diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c
|
diff --git a/src/backend/commands/portalcmds.c b/src/backend/commands/portalcmds.c
|
||||||
index 46369cf3db..3d01a782da 100644
|
index 46369cf3dbee..3d01a782da06 100644
|
||||||
--- a/src/backend/commands/portalcmds.c
|
--- a/src/backend/commands/portalcmds.c
|
||||||
+++ b/src/backend/commands/portalcmds.c
|
+++ b/src/backend/commands/portalcmds.c
|
||||||
@@ -27,6 +27,7 @@
|
@@ -27,6 +27,7 @@
|
||||||
@ -105,10 +105,10 @@ index 46369cf3db..3d01a782da 100644
|
|||||||
/*
|
/*
|
||||||
* Parse analysis was done already, but we still have to run the rule
|
* Parse analysis was done already, but we still have to run the rule
|
||||||
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
|
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
|
||||||
index 2886aebef4..896cb20051 100644
|
index f83840625348..9c04eee48422 100644
|
||||||
--- a/src/backend/commands/trigger.c
|
--- a/src/backend/commands/trigger.c
|
||||||
+++ b/src/backend/commands/trigger.c
|
+++ b/src/backend/commands/trigger.c
|
||||||
@@ -4142,6 +4142,7 @@ afterTriggerMarkEvents(AfterTriggerEventList *events,
|
@@ -4144,6 +4144,7 @@ afterTriggerMarkEvents(AfterTriggerEventList *events,
|
||||||
bool immediate_only)
|
bool immediate_only)
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
@ -116,7 +116,7 @@ index 2886aebef4..896cb20051 100644
|
|||||||
AfterTriggerEvent event;
|
AfterTriggerEvent event;
|
||||||
AfterTriggerEventChunk *chunk;
|
AfterTriggerEventChunk *chunk;
|
||||||
|
|
||||||
@@ -4177,6 +4178,7 @@ afterTriggerMarkEvents(AfterTriggerEventList *events,
|
@@ -4179,6 +4180,7 @@ afterTriggerMarkEvents(AfterTriggerEventList *events,
|
||||||
*/
|
*/
|
||||||
if (defer_it && move_list != NULL)
|
if (defer_it && move_list != NULL)
|
||||||
{
|
{
|
||||||
@ -124,7 +124,7 @@ index 2886aebef4..896cb20051 100644
|
|||||||
/* add it to move_list */
|
/* add it to move_list */
|
||||||
afterTriggerAddEvent(move_list, event, evtshared);
|
afterTriggerAddEvent(move_list, event, evtshared);
|
||||||
/* mark original copy "done" so we don't do it again */
|
/* mark original copy "done" so we don't do it again */
|
||||||
@@ -4184,6 +4186,16 @@ afterTriggerMarkEvents(AfterTriggerEventList *events,
|
@@ -4186,6 +4188,16 @@ afterTriggerMarkEvents(AfterTriggerEventList *events,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,10 +142,10 @@ index 2886aebef4..896cb20051 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
|
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
|
||||||
index 65d950f15b..f7f9252a05 100644
|
index dacc98450514..26ee16a0c370 100644
|
||||||
--- a/src/test/regress/expected/privileges.out
|
--- a/src/test/regress/expected/privileges.out
|
||||||
+++ b/src/test/regress/expected/privileges.out
|
+++ b/src/test/regress/expected/privileges.out
|
||||||
@@ -1138,6 +1138,48 @@ SELECT has_table_privilege('regress_user1', 'atest4', 'SELECT WITH GRANT OPTION'
|
@@ -1253,6 +1253,48 @@ SELECT has_table_privilege('regress_user1', 'atest4', 'SELECT WITH GRANT OPTION'
|
||||||
t
|
t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
@ -154,7 +154,7 @@ index 65d950f15b..f7f9252a05 100644
|
|||||||
+CREATE ROLE regress_sro_user;
|
+CREATE ROLE regress_sro_user;
|
||||||
+SET SESSION AUTHORIZATION regress_sro_user;
|
+SET SESSION AUTHORIZATION regress_sro_user;
|
||||||
+CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS
|
+CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS
|
||||||
+ 'GRANT regress_priv_group2 TO regress_sro_user';
|
+ 'GRANT regress_group2 TO regress_sro_user';
|
||||||
+CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS
|
+CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS
|
||||||
+ 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true';
|
+ 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true';
|
||||||
+-- REFRESH of this MV will queue a GRANT at end of transaction
|
+-- REFRESH of this MV will queue a GRANT at end of transaction
|
||||||
@ -184,7 +184,7 @@ index 65d950f15b..f7f9252a05 100644
|
|||||||
+ERROR: cannot fire deferred trigger within security-restricted operation
|
+ERROR: cannot fire deferred trigger within security-restricted operation
|
||||||
+CONTEXT: SQL function "mv_action" statement 1
|
+CONTEXT: SQL function "mv_action" statement 1
|
||||||
+BEGIN; SET CONSTRAINTS ALL IMMEDIATE; REFRESH MATERIALIZED VIEW sro_mv; COMMIT;
|
+BEGIN; SET CONSTRAINTS ALL IMMEDIATE; REFRESH MATERIALIZED VIEW sro_mv; COMMIT;
|
||||||
+ERROR: must have admin option on role "regress_priv_group2"
|
+ERROR: must have admin option on role "regress_group2"
|
||||||
+CONTEXT: SQL function "unwanted_grant" statement 1
|
+CONTEXT: SQL function "unwanted_grant" statement 1
|
||||||
+SQL statement "SELECT unwanted_grant()"
|
+SQL statement "SELECT unwanted_grant()"
|
||||||
+PL/pgSQL function sro_trojan() line 1 at PERFORM
|
+PL/pgSQL function sro_trojan() line 1 at PERFORM
|
||||||
@ -195,10 +195,10 @@ index 65d950f15b..f7f9252a05 100644
|
|||||||
SET SESSION AUTHORIZATION regress_user4;
|
SET SESSION AUTHORIZATION regress_user4;
|
||||||
CREATE FUNCTION dogrant_ok() RETURNS void LANGUAGE sql SECURITY DEFINER AS
|
CREATE FUNCTION dogrant_ok() RETURNS void LANGUAGE sql SECURITY DEFINER AS
|
||||||
diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql
|
diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql
|
||||||
index 902f64c747..baa521bcaf 100644
|
index 4263315a2d87..f979cccea03f 100644
|
||||||
--- a/src/test/regress/sql/privileges.sql
|
--- a/src/test/regress/sql/privileges.sql
|
||||||
+++ b/src/test/regress/sql/privileges.sql
|
+++ b/src/test/regress/sql/privileges.sql
|
||||||
@@ -726,6 +726,40 @@ SELECT has_table_privilege('regress_user3', 'atest4', 'SELECT'); -- false
|
@@ -761,6 +761,40 @@ SELECT has_table_privilege('regress_user3', 'atest4', 'SELECT'); -- false
|
||||||
SELECT has_table_privilege('regress_user1', 'atest4', 'SELECT WITH GRANT OPTION'); -- true
|
SELECT has_table_privilege('regress_user1', 'atest4', 'SELECT WITH GRANT OPTION'); -- true
|
||||||
|
|
||||||
|
|
||||||
@ -208,7 +208,7 @@ index 902f64c747..baa521bcaf 100644
|
|||||||
+
|
+
|
||||||
+SET SESSION AUTHORIZATION regress_sro_user;
|
+SET SESSION AUTHORIZATION regress_sro_user;
|
||||||
+CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS
|
+CREATE FUNCTION unwanted_grant() RETURNS void LANGUAGE sql AS
|
||||||
+ 'GRANT regress_priv_group2 TO regress_sro_user';
|
+ 'GRANT regress_group2 TO regress_sro_user';
|
||||||
+CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS
|
+CREATE FUNCTION mv_action() RETURNS bool LANGUAGE sql AS
|
||||||
+ 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true';
|
+ 'DECLARE c CURSOR WITH HOLD FOR SELECT unwanted_grant(); SELECT true';
|
||||||
+-- REFRESH of this MV will queue a GRANT at end of transaction
|
+-- REFRESH of this MV will queue a GRANT at end of transaction
|
||||||
@ -239,6 +239,3 @@ index 902f64c747..baa521bcaf 100644
|
|||||||
-- Admin options
|
-- Admin options
|
||||||
|
|
||||||
SET SESSION AUTHORIZATION regress_user4;
|
SET SESSION AUTHORIZATION regress_user4;
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
From 098fb00799ffb026ff12c64bd21635f963cfc609 Mon Sep 17 00:00:00 2001
|
From a498db87be103f93856dd515a574b2d67d3c1237 Mon Sep 17 00:00:00 2001
|
||||||
From: Noah Misch <noah@leadboat.com>
|
From: Noah Misch <noah@leadboat.com>
|
||||||
Date: Mon, 9 Nov 2020 07:32:09 -0800
|
Date: Mon, 9 Nov 2020 07:32:09 -0800
|
||||||
Subject: [PATCH] Ignore attempts to \gset into specially treated variables.
|
Subject: [PATCH] Ignore attempts to \gset into specially treated variables.
|
||||||
@ -24,17 +24,17 @@ Security: CVE-2020-25696
|
|||||||
5 files changed, 41 insertions(+)
|
5 files changed, 41 insertions(+)
|
||||||
|
|
||||||
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
|
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
|
||||||
index a41932ff27..f3d966d7cf 100644
|
index d04a7943d6a9..4e342c180a6c 100644
|
||||||
--- a/src/bin/psql/common.c
|
--- a/src/bin/psql/common.c
|
||||||
+++ b/src/bin/psql/common.c
|
+++ b/src/bin/psql/common.c
|
||||||
@@ -878,6 +878,13 @@ StoreQueryTuple(const PGresult *result)
|
@@ -894,6 +894,13 @@ StoreQueryTuple(const PGresult *result)
|
||||||
/* concatenate prefix and column name */
|
/* concatenate prefix and column name */
|
||||||
varname = psprintf("%s%s", pset.gset_prefix, colname);
|
varname = psprintf("%s%s", pset.gset_prefix, colname);
|
||||||
|
|
||||||
+ if (VariableHasHook(pset.vars, varname))
|
+ if (VariableHasHook(pset.vars, varname))
|
||||||
+ {
|
+ {
|
||||||
+ pg_log_warning("attempt to \\gset into specially treated variable \"%s\" ignored",
|
+ psql_error("attempt to \\gset into specially treated variable \"%s\" ignored\n",
|
||||||
+ varname);
|
+ varname);
|
||||||
+ continue;
|
+ continue;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
@ -42,7 +42,7 @@ index a41932ff27..f3d966d7cf 100644
|
|||||||
value = PQgetvalue(result, 0, i);
|
value = PQgetvalue(result, 0, i);
|
||||||
else
|
else
|
||||||
diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c
|
diff --git a/src/bin/psql/variables.c b/src/bin/psql/variables.c
|
||||||
index 120b25c696..0d28ba9c92 100644
|
index 120b25c69661..0d28ba9c92bb 100644
|
||||||
--- a/src/bin/psql/variables.c
|
--- a/src/bin/psql/variables.c
|
||||||
+++ b/src/bin/psql/variables.c
|
+++ b/src/bin/psql/variables.c
|
||||||
@@ -360,6 +360,32 @@ SetVariableHooks(VariableSpace space, const char *name,
|
@@ -360,6 +360,32 @@ SetVariableHooks(VariableSpace space, const char *name,
|
||||||
@ -79,7 +79,7 @@ index 120b25c696..0d28ba9c92 100644
|
|||||||
* Convenience function to set a variable's value to "on".
|
* Convenience function to set a variable's value to "on".
|
||||||
*/
|
*/
|
||||||
diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h
|
diff --git a/src/bin/psql/variables.h b/src/bin/psql/variables.h
|
||||||
index 02d85b1bc2..8dc5c20ee8 100644
|
index 02d85b1bc2e4..8dc5c20ee8fc 100644
|
||||||
--- a/src/bin/psql/variables.h
|
--- a/src/bin/psql/variables.h
|
||||||
+++ b/src/bin/psql/variables.h
|
+++ b/src/bin/psql/variables.h
|
||||||
@@ -90,6 +90,7 @@ bool DeleteVariable(VariableSpace space, const char *name);
|
@@ -90,6 +90,7 @@ bool DeleteVariable(VariableSpace space, const char *name);
|
||||||
@ -91,7 +91,7 @@ index 02d85b1bc2..8dc5c20ee8 100644
|
|||||||
void PsqlVarEnumError(const char *name, const char *value, const char *suggestions);
|
void PsqlVarEnumError(const char *name, const char *value, const char *suggestions);
|
||||||
|
|
||||||
diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out
|
diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out
|
||||||
index 0c94144575..1ae81912c7 100644
|
index 0c94144575af..1ae81912c734 100644
|
||||||
--- a/src/test/regress/expected/psql.out
|
--- a/src/test/regress/expected/psql.out
|
||||||
+++ b/src/test/regress/expected/psql.out
|
+++ b/src/test/regress/expected/psql.out
|
||||||
@@ -84,6 +84,10 @@ select 10 as test01, 20 as test02, 'Hello' as test03 \gset pref01_
|
@@ -84,6 +84,10 @@ select 10 as test01, 20 as test02, 'Hello' as test03 \gset pref01_
|
||||||
@ -106,7 +106,7 @@ index 0c94144575..1ae81912c7 100644
|
|||||||
select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x
|
select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x
|
||||||
1
|
1
|
||||||
diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql
|
diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql
|
||||||
index 4a676c3119..7f8ab2e5c2 100644
|
index 4a676c311955..7f8ab2e5c218 100644
|
||||||
--- a/src/test/regress/sql/psql.sql
|
--- a/src/test/regress/sql/psql.sql
|
||||||
+++ b/src/test/regress/sql/psql.sql
|
+++ b/src/test/regress/sql/psql.sql
|
||||||
@@ -48,6 +48,9 @@ select 10 as test01, 20 as test02, 'Hello' as test03 \gset pref01_
|
@@ -48,6 +48,9 @@ select 10 as test01, 20 as test02, 'Hello' as test03 \gset pref01_
|
||||||
@ -119,6 +119,3 @@ index 4a676c3119..7f8ab2e5c2 100644
|
|||||||
-- multiple backslash commands in one line
|
-- multiple backslash commands in one line
|
||||||
select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x
|
select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x
|
||||||
select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y
|
select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
|
|||||||
163
CVE-2021-20229.patch
Normal file
163
CVE-2021-20229.patch
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
From eeede2470a8ec902c80de449d2c4822330c689ca Mon Sep 17 00:00:00 2001
|
||||||
|
From: wang_yue111 <648774160@qq.com>
|
||||||
|
Date: Fri, 26 Feb 2021 12:57:48 +0800
|
||||||
|
Subject: [PATCH] Fix mishandling of column-level SELECT privileges for join
|
||||||
|
aliases.
|
||||||
|
|
||||||
|
scanNSItemForColumn, expandNSItemAttrs, and ExpandSingleTable would
|
||||||
|
pass the wrong RTE to markVarForSelectPriv when dealing with a join
|
||||||
|
ParseNamespaceItem: they'd pass the join RTE, when what we need to
|
||||||
|
mark is the base table that the join column came from. The end
|
||||||
|
result was to not fill the base table's selectedCols bitmap correctly,
|
||||||
|
resulting in an understatement of the set of columns that are read
|
||||||
|
by the query. The executor would still insist on there being at
|
||||||
|
least one selectable column; but with a correctly crafted query,
|
||||||
|
a user having SELECT privilege on just one column of a table would
|
||||||
|
nonetheless be allowed to read all its columns.
|
||||||
|
|
||||||
|
To fix, make markRTEForSelectPriv fetch the correct RTE for itself,
|
||||||
|
ignoring the possibly-mismatched RTE passed by the caller. Later,
|
||||||
|
we'll get rid of some now-unused RTE arguments, but that risks
|
||||||
|
API breaks so we won't do it in released branches.
|
||||||
|
|
||||||
|
This problem was introduced by commit 9ce77d75c, so back-patch
|
||||||
|
to v13 where that came in. Thanks to Sven Klemm for reporting
|
||||||
|
the problem.
|
||||||
|
|
||||||
|
Security: CVE-2021-20229
|
||||||
|
|
||||||
|
---
|
||||||
|
src/backend/parser/parse_relation.c | 40 ++++++++++-----------
|
||||||
|
src/backend/parser/parse_target.c | 8 +++--
|
||||||
|
4 files changed, 91 insertions(+), 22 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
|
||||||
|
index bbbb0b6..7ab4ba7 100644
|
||||||
|
--- a/src/backend/parser/parse_relation.c
|
||||||
|
+++ b/src/backend/parser/parse_relation.c
|
||||||
|
@@ -43,7 +43,8 @@ static RangeTblEntry *scanNameSpaceForRelid(ParseState *pstate, Oid relid,
|
||||||
|
int location);
|
||||||
|
static void check_lateral_ref_ok(ParseState *pstate, ParseNamespaceItem *nsitem,
|
||||||
|
int location);
|
||||||
|
-static void markRTEForSelectPriv(ParseState *pstate, RangeTblEntry *rte,
|
||||||
|
+static void markRTEForSelectPriv(ParseState *pstate,
|
||||||
|
+
|
||||||
|
int rtindex, AttrNumber col);
|
||||||
|
static void expandRelation(Oid relid, Alias *eref,
|
||||||
|
int rtindex, int sublevels_up,
|
||||||
|
@@ -897,20 +898,15 @@ searchRangeTableForCol(ParseState *pstate, const char *alias, char *colname,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* markRTEForSelectPriv
|
||||||
|
- * Mark the specified column of an RTE as requiring SELECT privilege
|
||||||
|
+ * Mark the specified column of the RTE with index rtindex
|
||||||
|
+ * as requiring SELECT privilege
|
||||||
|
*
|
||||||
|
* col == InvalidAttrNumber means a "whole row" reference
|
||||||
|
- *
|
||||||
|
- * The caller should pass the actual RTE if it has it handy; otherwise pass
|
||||||
|
- * NULL, and we'll look it up here. (This uglification of the API is
|
||||||
|
- * worthwhile because nearly all external callers have the RTE at hand.)
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
-markRTEForSelectPriv(ParseState *pstate, RangeTblEntry *rte,
|
||||||
|
- int rtindex, AttrNumber col)
|
||||||
|
+markRTEForSelectPriv(ParseState *pstate, int rtindex, AttrNumber col)
|
||||||
|
{
|
||||||
|
- if (rte == NULL)
|
||||||
|
- rte = rt_fetch(rtindex, pstate->p_rtable);
|
||||||
|
+ RangeTblEntry *rte = rt_fetch(rtindex, pstate->p_rtable);
|
||||||
|
|
||||||
|
if (rte->rtekind == RTE_RELATION)
|
||||||
|
{
|
||||||
|
@@ -942,13 +938,13 @@ markRTEForSelectPriv(ParseState *pstate, RangeTblEntry *rte,
|
||||||
|
{
|
||||||
|
int varno = ((RangeTblRef *) j->larg)->rtindex;
|
||||||
|
|
||||||
|
- markRTEForSelectPriv(pstate, NULL, varno, InvalidAttrNumber);
|
||||||
|
+ markRTEForSelectPriv(pstate, varno, InvalidAttrNumber);
|
||||||
|
}
|
||||||
|
else if (IsA(j->larg, JoinExpr))
|
||||||
|
{
|
||||||
|
int varno = ((JoinExpr *) j->larg)->rtindex;
|
||||||
|
|
||||||
|
- markRTEForSelectPriv(pstate, NULL, varno, InvalidAttrNumber);
|
||||||
|
+ markRTEForSelectPriv(pstate, varno, InvalidAttrNumber);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
elog(ERROR, "unrecognized node type: %d",
|
||||||
|
@@ -957,13 +953,13 @@ markRTEForSelectPriv(ParseState *pstate, RangeTblEntry *rte,
|
||||||
|
{
|
||||||
|
int varno = ((RangeTblRef *) j->rarg)->rtindex;
|
||||||
|
|
||||||
|
- markRTEForSelectPriv(pstate, NULL, varno, InvalidAttrNumber);
|
||||||
|
+ markRTEForSelectPriv(pstate, varno, InvalidAttrNumber);
|
||||||
|
}
|
||||||
|
else if (IsA(j->rarg, JoinExpr))
|
||||||
|
{
|
||||||
|
int varno = ((JoinExpr *) j->rarg)->rtindex;
|
||||||
|
|
||||||
|
- markRTEForSelectPriv(pstate, NULL, varno, InvalidAttrNumber);
|
||||||
|
+ markRTEForSelectPriv(pstate, varno, InvalidAttrNumber);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
elog(ERROR, "unrecognized node type: %d",
|
||||||
|
@@ -994,10 +990,10 @@ markRTEForSelectPriv(ParseState *pstate, RangeTblEntry *rte,
|
||||||
|
|
||||||
|
/*
|
||||||
|
* markVarForSelectPriv
|
||||||
|
- * Mark the RTE referenced by a Var as requiring SELECT privilege
|
||||||
|
+ * Mark the RTE referenced by the Var as requiring SELECT privilege
|
||||||
|
+ * for the Var's column (the Var could be a whole-row Var, too)
|
||||||
|
*
|
||||||
|
- * The caller should pass the Var's referenced RTE if it has it handy
|
||||||
|
- * (nearly all do); otherwise pass NULL.
|
||||||
|
+ * The rte argument is unused and will be removed later.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
markVarForSelectPriv(ParseState *pstate, Var *var, RangeTblEntry *rte)
|
||||||
|
@@ -1008,7 +1004,7 @@ markVarForSelectPriv(ParseState *pstate, Var *var, RangeTblEntry *rte)
|
||||||
|
/* Find the appropriate pstate if it's an uplevel Var */
|
||||||
|
for (lv = 0; lv < var->varlevelsup; lv++)
|
||||||
|
pstate = pstate->parentParseState;
|
||||||
|
- markRTEForSelectPriv(pstate, rte, var->varno, var->varattno);
|
||||||
|
+ markRTEForSelectPriv(pstate, var->varno, var->varattno);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -2629,9 +2625,13 @@ expandRelAttrs(ParseState *pstate, RangeTblEntry *rte,
|
||||||
|
/*
|
||||||
|
* Require read access to the table. This is normally redundant with the
|
||||||
|
* markVarForSelectPriv calls below, but not if the table has zero
|
||||||
|
- * columns.
|
||||||
|
+ * columns. We need not do anything if the nsitem is for a join: its
|
||||||
|
+ * component tables will have been marked ACL_SELECT when they were added
|
||||||
|
+ * to the rangetable. (This step changes things only for the target
|
||||||
|
+ * relation of UPDATE/DELETE, which cannot be under a join.)
|
||||||
|
*/
|
||||||
|
- rte->requiredPerms |= ACL_SELECT;
|
||||||
|
+ if (rte->rtekind == RTE_RELATION)
|
||||||
|
+ rte->requiredPerms |= ACL_SELECT;
|
||||||
|
|
||||||
|
forboth(name, names, var, vars)
|
||||||
|
{
|
||||||
|
diff --git a/src/backend/parser/parse_target.c b/src/backend/parser/parse_target.c
|
||||||
|
index 64a1b75..c7165cb 100644
|
||||||
|
--- a/src/backend/parser/parse_target.c
|
||||||
|
+++ b/src/backend/parser/parse_target.c
|
||||||
|
@@ -1328,9 +1328,13 @@ ExpandSingleTable(ParseState *pstate, RangeTblEntry *rte,
|
||||||
|
/*
|
||||||
|
* Require read access to the table. This is normally redundant with
|
||||||
|
* the markVarForSelectPriv calls below, but not if the table has zero
|
||||||
|
- * columns.
|
||||||
|
+ * columns. We need not do anything if the nsitem is for a join: its
|
||||||
|
+ * component tables will have been marked ACL_SELECT when they were
|
||||||
|
+ * added to the rangetable. (This step changes things only for the
|
||||||
|
+ * target relation of UPDATE/DELETE, which cannot be under a join.)
|
||||||
|
*/
|
||||||
|
- rte->requiredPerms |= ACL_SELECT;
|
||||||
|
+ if (rte->rtekind == RTE_RELATION)
|
||||||
|
+ rte->requiredPerms |= ACL_SELECT;
|
||||||
|
|
||||||
|
/* Require read access to each column */
|
||||||
|
foreach(l, vars)
|
||||||
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
Name: postgresql
|
Name: postgresql
|
||||||
Version: 10.5
|
Version: 10.5
|
||||||
Release: 18
|
Release: 19
|
||||||
Summary: PostgreSQL client programs
|
Summary: PostgreSQL client programs
|
||||||
License: PostgreSQL
|
License: PostgreSQL
|
||||||
URL: http://www.postgresql.org/
|
URL: http://www.postgresql.org/
|
||||||
@ -42,6 +42,7 @@ Patch16: CVE-2020-25694-2.patch
|
|||||||
Patch17: CVE-2020-25694-3.patch
|
Patch17: CVE-2020-25694-3.patch
|
||||||
Patch18: CVE-2020-25695.patch
|
Patch18: CVE-2020-25695.patch
|
||||||
Patch19: CVE-2020-25696.patch
|
Patch19: CVE-2020-25696.patch
|
||||||
|
Patch20: CVE-2021-20229.patch
|
||||||
|
|
||||||
BuildRequires: gcc perl(ExtUtils::MakeMaker) glibc-devel bison flex gawk perl(ExtUtils::Embed)
|
BuildRequires: gcc perl(ExtUtils::MakeMaker) glibc-devel bison flex gawk perl(ExtUtils::Embed)
|
||||||
BuildRequires: perl-devel perl-generators readline-devel zlib-devel systemd systemd-devel
|
BuildRequires: perl-devel perl-generators readline-devel zlib-devel systemd systemd-devel
|
||||||
@ -167,18 +168,7 @@ that want to run build-time testsuite against running PostgreSQL server.
|
|||||||
cd "$(dirname "%{SOURCE0}")"
|
cd "$(dirname "%{SOURCE0}")"
|
||||||
sha256sum -c %{SOURCE3}
|
sha256sum -c %{SOURCE3}
|
||||||
)
|
)
|
||||||
%setup -q
|
%autosetup -n %{name}-%{version} -p1
|
||||||
%patch1 -p1
|
|
||||||
%patch2 -p1
|
|
||||||
%patch3 -p1
|
|
||||||
%patch4 -p1
|
|
||||||
%patch5 -p1
|
|
||||||
%patch6 -p1
|
|
||||||
%patch7 -p1
|
|
||||||
%patch8 -p1
|
|
||||||
%patch9 -p1
|
|
||||||
%patch10 -p1
|
|
||||||
%patch11 -p1
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
if [ x"`id -u`" = x0 ]; then
|
if [ x"`id -u`" = x0 ]; then
|
||||||
@ -443,6 +433,9 @@ find_lang_bins pltcl.lst pltcl
|
|||||||
%attr(-,postgres,postgres) %{_libdir}/pgsql/test
|
%attr(-,postgres,postgres) %{_libdir}/pgsql/test
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Feb 26 2021 wangyue <wangyue92@huawei.com> - 10.5-19
|
||||||
|
- Fix CVE-2021-20229
|
||||||
|
|
||||||
* Tue Dec 8 2020 wangxiao <wangxiao65@huawei.com> - 10.5-18
|
* Tue Dec 8 2020 wangxiao <wangxiao65@huawei.com> - 10.5-18
|
||||||
- Fix CVE-2020-25694 CVE-2020-25695 CVE-2020-25696
|
- Fix CVE-2020-25694 CVE-2020-25695 CVE-2020-25696
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user