mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
Clean up some mess in row-security patches.
Fix unsafe coding around PG_TRY in RelationBuildRowSecurity: can't change a variable inside PG_TRY and then use it in PG_CATCH without marking it "volatile". In this case though it seems saner to avoid that by doing a single assignment before entering the TRY block. I started out just intending to fix that, but the more I looked at the row-security code the more distressed I got. This patch also fixes incorrect construction of the RowSecurityPolicy cache entries (there was not sufficient care taken to copy pass-by-ref data into the cache memory context) and a whole bunch of sloppiness around the definition and use of pg_policy.polcmd. You can't use nulls in that column because initdb will mark it NOT NULL --- and I see no particular reason why a null entry would be a good idea anyway, so changing initdb's behavior is not the right answer. The internal value of '\0' wouldn't be suitable in a "char" column either, so after a bit of thought I settled on using '*' to represent ALL. Chasing those changes down also revealed that somebody wasn't paying attention to what the underlying values of ACL_UPDATE_CHR etc really were, and there was a great deal of lackadaiscalness in the catalogs.sgml documentation for pg_policy and pg_policies too. This doesn't pretend to be a complete code review for the row-security stuff, it just fixes the things that were in my face while dealing with the bugs in RelationBuildRowSecurity.
This commit is contained in:
@@ -21,11 +21,11 @@ typedef struct RowSecurityPolicy
|
||||
{
|
||||
Oid policy_id; /* OID of the policy */
|
||||
char *policy_name; /* Name of the policy */
|
||||
char cmd; /* Type of command policy is for */
|
||||
char polcmd; /* Type of command policy is for */
|
||||
ArrayType *roles; /* Array of roles policy is for */
|
||||
Expr *qual; /* Expression to filter rows */
|
||||
Expr *with_check_qual; /* Expression to limit rows allowed */
|
||||
bool hassublinks; /* If expression has sublinks */
|
||||
bool hassublinks; /* If either expression has sublinks */
|
||||
} RowSecurityPolicy;
|
||||
|
||||
typedef struct RowSecurityDesc
|
||||
|
Reference in New Issue
Block a user