diff options
Diffstat (limited to 'contrib/sepgsql/dml.c')
| -rw-r--r-- | contrib/sepgsql/dml.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/contrib/sepgsql/dml.c b/contrib/sepgsql/dml.c index 36c6a37ac1..4a71753d3f 100644 --- a/contrib/sepgsql/dml.c +++ b/contrib/sepgsql/dml.c @@ -145,7 +145,8 @@ fixup_inherited_columns(Oid parentId, Oid childId, Bitmapset *columns) static bool check_relation_privileges(Oid relOid, Bitmapset *selected, - Bitmapset *modified, + Bitmapset *inserted, + Bitmapset *updated, uint32 required, bool abort_on_violation) { @@ -231,8 +232,9 @@ check_relation_privileges(Oid relOid, * Check permissions on the columns */ selected = fixup_whole_row_references(relOid, selected); - modified = fixup_whole_row_references(relOid, modified); - columns = bms_union(selected, modified); + inserted = fixup_whole_row_references(relOid, inserted); + updated = fixup_whole_row_references(relOid, updated); + columns = bms_union(selected, bms_union(inserted, updated)); while ((index = bms_first_member(columns)) >= 0) { @@ -241,13 +243,16 @@ check_relation_privileges(Oid relOid, if (bms_is_member(index, selected)) column_perms |= SEPG_DB_COLUMN__SELECT; - if (bms_is_member(index, modified)) + if (bms_is_member(index, inserted)) { - if (required & SEPG_DB_TABLE__UPDATE) - column_perms |= SEPG_DB_COLUMN__UPDATE; if (required & SEPG_DB_TABLE__INSERT) column_perms |= SEPG_DB_COLUMN__INSERT; } + if (bms_is_member(index, updated)) + { + if (required & SEPG_DB_TABLE__UPDATE) + column_perms |= SEPG_DB_COLUMN__UPDATE; + } if (column_perms == 0) continue; @@ -304,7 +309,7 @@ sepgsql_dml_privileges(List *rangeTabls, bool abort_on_violation) required |= SEPG_DB_TABLE__INSERT; if (rte->requiredPerms & ACL_UPDATE) { - if (!bms_is_empty(rte->modifiedCols)) + if (!bms_is_empty(rte->updatedCols)) required |= SEPG_DB_TABLE__UPDATE; else required |= SEPG_DB_TABLE__LOCK; @@ -333,7 +338,8 @@ sepgsql_dml_privileges(List *rangeTabls, bool abort_on_violation) { Oid tableOid = lfirst_oid(li); Bitmapset *selectedCols; - Bitmapset *modifiedCols; + Bitmapset *insertedCols; + Bitmapset *updatedCols; /* * child table has different attribute numbers, so we need to fix @@ -341,15 +347,18 @@ sepgsql_dml_privileges(List *rangeTabls, bool abort_on_violation) */ selectedCols = fixup_inherited_columns(rte->relid, tableOid, rte->selectedCols); - modifiedCols = fixup_inherited_columns(rte->relid, tableOid, - rte->modifiedCols); + insertedCols = fixup_inherited_columns(rte->relid, tableOid, + rte->insertedCols); + updatedCols = fixup_inherited_columns(rte->relid, tableOid, + rte->updatedCols); /* * check permissions on individual tables */ if (!check_relation_privileges(tableOid, selectedCols, - modifiedCols, + insertedCols, + updatedCols, required, abort_on_violation)) return false; } |
