support-function-ownership.patch

text/x-patch

Filename: support-function-ownership.patch
Type: text/x-patch
Part: 0
Message: Not quite a security hole: CREATE LANGUAGE for non-superusers

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/catalog/pg_aggregate.c 0 0
src/backend/catalog/pg_proc.c 0 0
src/backend/commands/functioncmds.c 0 0
src/backend/commands/proclang.c 0 0
src/backend/commands/typecmds.c 0 0
src/include/catalog/pg_proc_fn.h 0 0
diff --git a/src/backend/catalog/pg_aggregate.c b/src/backend/catalog/pg_aggregate.c
index 9ff70a52e6c7f7d6a6d127a050055320c459b453..0b393cf6ceeaa668c65b00bdb50533b973a91b74 100644
*** a/src/backend/catalog/pg_aggregate.c
--- b/src/backend/catalog/pg_aggregate.c
*************** AggregateCreate(const char *aggName,
*** 233,238 ****
--- 233,239 ----
  							  false,	/* no replacement */
  							  false,	/* doesn't return a set */
  							  finaltype,		/* returnType */
+ 							  GetUserId(),		/* proowner */
  							  INTERNALlanguageId,		/* languageObjectId */
  							  InvalidOid,		/* no validator */
  							  "aggregate_dummy",		/* placeholder proc */
diff --git a/src/backend/catalog/pg_proc.c b/src/backend/catalog/pg_proc.c
index 1fffe1c6ac313717191fd9427dbcb2ba8af2da15..ae71b939175cd3682c503f4b44c9eeda580d57c4 100644
*** a/src/backend/catalog/pg_proc.c
--- b/src/backend/catalog/pg_proc.c
*************** ProcedureCreate(const char *procedureNam
*** 69,74 ****
--- 69,75 ----
  				bool replace,
  				bool returnsSet,
  				Oid returnType,
+ 				Oid proowner,
  				Oid languageObjectId,
  				Oid languageValidator,
  				const char *prosrc,
*************** ProcedureCreate(const char *procedureNam
*** 100,106 ****
  	bool		internalInParam = false;
  	bool		internalOutParam = false;
  	Oid			variadicType = InvalidOid;
- 	Oid			proowner = GetUserId();
  	Acl		   *proacl = NULL;
  	Relation	rel;
  	HeapTuple	tup;
--- 101,106 ----
diff --git a/src/backend/commands/functioncmds.c b/src/backend/commands/functioncmds.c
index 5f1c19eb3755c52cebd9082cb3e5b3d1f426544a..ff0836c141e25a91aba9308092cd1f0f15ec8768 100644
*** a/src/backend/commands/functioncmds.c
--- b/src/backend/commands/functioncmds.c
*************** CreateFunction(CreateFunctionStmt *stmt,
*** 978,983 ****
--- 978,984 ----
  					stmt->replace,
  					returnsSet,
  					prorettype,
+ 					GetUserId(),
  					languageOid,
  					languageValidator,
  					prosrc_str, /* converted to text later */
diff --git a/src/backend/commands/proclang.c b/src/backend/commands/proclang.c
index 41775fd86745a4538c2e26689e7cbf5ef56f8c26..5d2e7dc1951ac26f3c7f2c9809e76e7dcc75fc57 100644
*** a/src/backend/commands/proclang.c
--- b/src/backend/commands/proclang.c
***************
*** 18,23 ****
--- 18,24 ----
  #include "catalog/dependency.h"
  #include "catalog/indexing.h"
  #include "catalog/objectaccess.h"
+ #include "catalog/pg_authid.h"
  #include "catalog/pg_language.h"
  #include "catalog/pg_namespace.h"
  #include "catalog/pg_pltemplate.h"
*************** CreateProceduralLanguage(CreatePLangStmt
*** 124,129 ****
--- 125,131 ----
  										 false, /* replace */
  										 false, /* returnsSet */
  										 LANGUAGE_HANDLEROID,
+ 										 BOOTSTRAP_SUPERUSERID,
  										 ClanguageId,
  										 F_FMGR_C_VALIDATOR,
  										 pltemplate->tmplhandler,
*************** CreateProceduralLanguage(CreatePLangStmt
*** 160,165 ****
--- 162,168 ----
  											false,		/* replace */
  											false,		/* returnsSet */
  											VOIDOID,
+ 											BOOTSTRAP_SUPERUSERID,
  											ClanguageId,
  											F_FMGR_C_VALIDATOR,
  											pltemplate->tmplinline,
*************** CreateProceduralLanguage(CreatePLangStmt
*** 199,204 ****
--- 202,208 ----
  										 false, /* replace */
  										 false, /* returnsSet */
  										 VOIDOID,
+ 										 BOOTSTRAP_SUPERUSERID,
  										 ClanguageId,
  										 F_FMGR_C_VALIDATOR,
  										 pltemplate->tmplvalidator,
diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 140b3f851e9ec92181871ce3a32d2b1ba2873302..77559842e5301f2b31596242304ee7f78ee17afd 100644
*** a/src/backend/commands/typecmds.c
--- b/src/backend/commands/typecmds.c
***************
*** 38,43 ****
--- 38,44 ----
  #include "catalog/dependency.h"
  #include "catalog/heap.h"
  #include "catalog/indexing.h"
+ #include "catalog/pg_authid.h"
  #include "catalog/pg_collation.h"
  #include "catalog/pg_constraint.h"
  #include "catalog/pg_depend.h"
*************** makeRangeConstructors(const char *name, 
*** 1513,1518 ****
--- 1514,1520 ----
  								  false,		/* replace */
  								  false,		/* returns set */
  								  rangeOid,		/* return type */
+ 								  BOOTSTRAP_SUPERUSERID,		/* proowner */
  								  INTERNALlanguageId,	/* language */
  								  F_FMGR_INTERNAL_VALIDATOR,	/* language validator */
  								  prosrc[i],	/* prosrc */
diff --git a/src/include/catalog/pg_proc_fn.h b/src/include/catalog/pg_proc_fn.h
index 04fa64519dac698c9515e62ef82383089c8ed56f..fcd09e7059c9db475185f344e9bf3bb9b4b09226 100644
*** a/src/include/catalog/pg_proc_fn.h
--- b/src/include/catalog/pg_proc_fn.h
*************** extern Oid ProcedureCreate(const char *p
*** 21,26 ****
--- 21,27 ----
  				bool replace,
  				bool returnsSet,
  				Oid returnType,
+ 				Oid proowner,
  				Oid languageObjectId,
  				Oid languageValidator,
  				const char *prosrc,