summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas2011-10-14 15:35:40 +0000
committerRobert Haas2011-10-14 15:35:40 +0000
commit393e828e31a27845def4c3ff20cdfbee5cec1da9 (patch)
tree7445ec246e0a2139186a972fd5da96a23d1694d7
parentad30d366424aee9736f7a71be87e6941d7dd12df (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.c11
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. */