diff options
author | Robert Haas | 2011-10-14 15:35:40 +0000 |
---|---|---|
committer | Robert Haas | 2011-10-14 15:35:40 +0000 |
commit | 393e828e31a27845def4c3ff20cdfbee5cec1da9 (patch) | |
tree | 7445ec246e0a2139186a972fd5da96a23d1694d7 | |
parent | ad30d366424aee9736f7a71be87e6941d7dd12df (diff) |
Avoid potential relcache leak in objectaddress.c.
Nobody using the missing_ok flag yet, but let's speculate that this will
be a better interface for future callers.
KaiGai Kohei, with some adjustments by me.
-rw-r--r-- | src/backend/catalog/objectaddress.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c index 6928835b6a7..395c11605a3 100644 --- a/src/backend/catalog/objectaddress.c +++ b/src/backend/catalog/objectaddress.c @@ -639,7 +639,8 @@ get_object_address_relobject(ObjectType objtype, List *objname, * Caller is expecting to get back the relation, even though we * didn't end up using it to find the rule. */ - relation = heap_open(reloid, AccessShareLock); + if (OidIsValid(address.objectId)) + relation = heap_open(reloid, AccessShareLock); } else { @@ -677,6 +678,14 @@ get_object_address_relobject(ObjectType objtype, List *objname, address.objectId = InvalidOid; address.objectSubId = 0; } + + /* Avoid relcache leak when object not found. */ + if (!OidIsValid(address.objectId)) + { + heap_close(relation, AccessShareLock); + relation = NULL; /* department of accident prevention */ + return address; + } } /* Done. */ |