diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-06-13 13:53:10 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-06-13 13:53:10 -0400 |
commit | e5bdaa127be617c7c4d49e1bb8960d002918f96d (patch) | |
tree | 986a872b9f09c12b50e1151923d5e12f53988777 | |
parent | 1ad83738d0cd9b9af9a8f695eb9acc327a02c18b (diff) | |
download | postgresql-e5bdaa127be617c7c4d49e1bb8960d002918f96d.tar.gz postgresql-e5bdaa127be617c7c4d49e1bb8960d002918f96d.zip |
Fix multiple minor infelicities in aclchk.c error reports.
pg_type_aclmask reported the wrong type's OID when complaining that
it could not find a type's typelem. It also failed to provide a
suitable errcode when the initially given OID doesn't exist (which
is a user-facing error, since that OID can be user-specified).
pg_foreign_data_wrapper_aclmask and pg_foreign_server_aclmask likewise
lacked errcode specifications. Trivial cosmetic adjustments too.
The wrong-type-OID problem was reported by Petru-Florin Mihancea in
bug #14186; the other issues noted by me while reading the code.
These errors all seem to be aboriginal in the respective routines, so
back-patch as necessary.
Report: <20160613163159.5798.52928@wrigleys.postgresql.org>
-rw-r--r-- | src/backend/catalog/aclchk.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index 50a00cf8c8a..fa49ac44f6c 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -4068,7 +4068,8 @@ pg_foreign_data_wrapper_aclmask(Oid fdw_oid, Oid roleid, tuple = SearchSysCache1(FOREIGNDATAWRAPPEROID, ObjectIdGetDatum(fdw_oid)); if (!HeapTupleIsValid(tuple)) ereport(ERROR, - (errmsg("foreign-data wrapper with OID %u does not exist", + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("foreign-data wrapper with OID %u does not exist", fdw_oid))); fdwForm = (Form_pg_foreign_data_wrapper) GETSTRUCT(tuple); @@ -4129,7 +4130,8 @@ pg_foreign_server_aclmask(Oid srv_oid, Oid roleid, tuple = SearchSysCache1(FOREIGNSERVEROID, ObjectIdGetDatum(srv_oid)); if (!HeapTupleIsValid(tuple)) ereport(ERROR, - (errmsg("foreign server with OID %u does not exist", + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("foreign server with OID %u does not exist", srv_oid))); srvForm = (Form_pg_foreign_server) GETSTRUCT(tuple); @@ -4188,27 +4190,30 @@ pg_type_aclmask(Oid type_oid, Oid roleid, AclMode mask, AclMaskHow how) tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(type_oid)); if (!HeapTupleIsValid(tuple)) ereport(ERROR, - (errmsg("type with OID %u does not exist", + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("type with OID %u does not exist", type_oid))); typeForm = (Form_pg_type) GETSTRUCT(tuple); - /* "True" array types don't manage permissions of their own */ - if (typeForm->typelem != 0 && typeForm->typlen == -1) + /* + * "True" array types don't manage permissions of their own; consult the + * element type instead. + */ + if (OidIsValid(typeForm->typelem) && typeForm->typlen == -1) { Oid elttype_oid = typeForm->typelem; ReleaseSysCache(tuple); tuple = SearchSysCache1(TYPEOID, ObjectIdGetDatum(elttype_oid)); + /* this case is not a user-facing error, so elog not ereport */ if (!HeapTupleIsValid(tuple)) - ereport(ERROR, - (errmsg("type with OID %u does not exist", - type_oid))); + elog(ERROR, "cache lookup failed for type %u", elttype_oid); typeForm = (Form_pg_type) GETSTRUCT(tuple); } /* - * Normal case: get the type's ACL from pg_type + * Now get the type's owner and ACL from the tuple */ ownerId = typeForm->typowner; |