Truncate-Hook.patch
application/octet-stream
Filename: Truncate-Hook.patch
Type: application/octet-stream
Part: 0
Message:
Re: add a MAC check for TRUNCATE
Patch
Format: format-patch
Series: patch 0001
Subject: Add a hook to allow MAC check for TRUNCATE
| File | + | − |
|---|---|---|
| src/backend/catalog/objectaccess.c | 16 | 0 |
| src/backend/commands/tablecmds.c | 2 | 0 |
| src/include/catalog/objectaccess.h | 9 | 1 |
From f6c84a36d1f42fe4ca2478ac4e686b5e345ed0fa Mon Sep 17 00:00:00 2001
From: Yuli Khodorkovskiy <yuli@crunchydata.com>
Date: Mon, 15 Jul 2019 13:58:51 -0400
Subject: [PATCH 1/2] Add a hook to allow MAC check for TRUNCATE
All DAC checks need to have corresponding MAC. The command
`TRUNCATE` is missing this check. This patch adds a new hook to
allow extensions to implement an access check for TRUNCATE.
---
src/backend/catalog/objectaccess.c | 16 ++++++++++++++++
src/backend/commands/tablecmds.c | 2 ++
src/include/catalog/objectaccess.h | 10 +++++++++-
3 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/src/backend/catalog/objectaccess.c b/src/backend/catalog/objectaccess.c
index b1619b859f..8f40f8f33d 100644
--- a/src/backend/catalog/objectaccess.c
+++ b/src/backend/catalog/objectaccess.c
@@ -64,6 +64,22 @@ RunObjectDropHook(Oid classId, Oid objectId, int subId,
(void *) &drop_arg);
}
+/*
+ * RunObjectTruncateHook
+ *
+ * It is the entrypoint of a TRUNCATE event
+ */
+void
+RunObjectTruncateHook(Oid classId, Oid objectId, int subId)
+{
+ /* caller should check, but just in case... */
+ Assert(object_access_hook != NULL);
+
+ (*object_access_hook) (OAT_TRUNCATE,
+ classId, objectId, 0,
+ NULL);
+}
+
/*
* RunObjectPostAlterHook
*
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 05593f3316..7a9ec09b8c 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -1931,6 +1931,8 @@ truncate_check_rel(Oid relid, Form_pg_class reltuple)
(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
errmsg("permission denied: \"%s\" is a system catalog",
relname)));
+
+ InvokeObjectTruncateHook(RelationRelationId, relid, 0);
}
/*
diff --git a/src/include/catalog/objectaccess.h b/src/include/catalog/objectaccess.h
index 0170f1f1e4..079bcec98a 100644
--- a/src/include/catalog/objectaccess.h
+++ b/src/include/catalog/objectaccess.h
@@ -45,7 +45,8 @@ typedef enum ObjectAccessType
OAT_DROP,
OAT_POST_ALTER,
OAT_NAMESPACE_SEARCH,
- OAT_FUNCTION_EXECUTE
+ OAT_FUNCTION_EXECUTE,
+ OAT_TRUNCATE
} ObjectAccessType;
/*
@@ -131,6 +132,7 @@ extern void RunObjectPostCreateHook(Oid classId, Oid objectId, int subId,
bool is_internal);
extern void RunObjectDropHook(Oid classId, Oid objectId, int subId,
int dropflags);
+extern void RunObjectTruncateHook(Oid classId, Oid objectId, int subId);
extern void RunObjectPostAlterHook(Oid classId, Oid objectId, int subId,
Oid auxiliaryId, bool is_internal);
extern bool RunNamespaceSearchHook(Oid objectId, bool ereport_on_violation);
@@ -160,6 +162,12 @@ extern void RunFunctionExecuteHook(Oid objectId);
(dropflags)); \
} while(0)
+#define InvokeObjectTruncateHook(classId,objectId,subId) \
+ do { \
+ if (object_access_hook) \
+ RunObjectTruncateHook((classId),(objectId),(subId)); \
+ } while(0)
+
#define InvokeObjectPostAlterHook(classId,objectId,subId) \
InvokeObjectPostAlterHookArg((classId),(objectId),(subId), \
InvalidOid,false)
--
2.21.0