1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-24 01:29:19 +03:00

Refactor permissions checks for large objects.

Up to now, ACL checks for large objects happened at the level of
the SQL-callable functions, which led to CVE-2017-7548 because of a
missing check.  Push them down to be enforced in inv_api.c as much
as possible, in hopes of preventing future bugs.  This does have the
effect of moving read and write permission errors to happen at lo_open
time not loread or lowrite time, but that seems acceptable.

Michael Paquier and Tom Lane

Discussion: https://postgr.es/m/CAB7nPqRHmNOYbETnc_2EjsuzSM00Z+BWKv9sy6tnvSd5gWT_JA@mail.gmail.com
This commit is contained in:
Tom Lane
2017-11-09 12:56:07 -05:00
parent 5ecc0d738e
commit ae20b23a9e
6 changed files with 118 additions and 112 deletions

View File

@@ -27,9 +27,9 @@
* offset is the current seek offset within the LO
* flags contains some flag bits
*
* NOTE: in current usage, flag bit IFS_RDLOCK is *always* set, and we don't
* bother to test for it. Permission checks are made at first read or write
* attempt, not during inv_open(), so we have other bits to remember that.
* NOTE: as of v11, permission checks are made when the large object is
* opened; therefore IFS_RDLOCK/IFS_WRLOCK indicate that read or write mode
* has been requested *and* the corresponding permission has been checked.
*
* NOTE: before 7.1, we also had to store references to the separate table
* and index of a specific large object. Now they all live in pg_largeobject
@@ -47,8 +47,6 @@ typedef struct LargeObjectDesc
/* bits in flags: */
#define IFS_RDLOCK (1 << 0) /* LO was opened for reading */
#define IFS_WRLOCK (1 << 1) /* LO was opened for writing */
#define IFS_RD_PERM_OK (1 << 2) /* read permission has been verified */
#define IFS_WR_PERM_OK (1 << 3) /* write permission has been verified */
} LargeObjectDesc;
@@ -78,6 +76,11 @@ typedef struct LargeObjectDesc
#define MAX_LARGE_OBJECT_SIZE ((int64) INT_MAX * LOBLKSIZE)
/*
* GUC: backwards-compatibility flag to suppress LO permission checks
*/
extern bool lo_compat_privileges;
/*
* Function definitions...
*/