From 393e828e31a27845def4c3ff20cdfbee5cec1da9 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Fri, 14 Oct 2011 11:35:40 -0400
Subject: [PATCH] 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.
---
 src/backend/catalog/objectaddress.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

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. */
-- 
GitLab