From d9250da032e723d80bb0150b9276cc544df6a087 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Mon, 9 Dec 2013 11:12:33 -0500
Subject: [PATCH] Fixups for dsm.c's file descriptor handling.

Per complaint from Tom Lane.
---
 src/backend/storage/ipc/dsm.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c
index 6df402f2486..a33700e7918 100644
--- a/src/backend/storage/ipc/dsm.c
+++ b/src/backend/storage/ipc/dsm.c
@@ -301,14 +301,14 @@ dsm_cleanup_for_mmap(void)
 	struct dirent *dent;
 
 	/* Open the directory; can't use AllocateDir in postmaster. */
-	if ((dir = opendir(PG_DYNSHMEM_DIR)) == NULL)
+	if ((dir = AllocateDir(PG_DYNSHMEM_DIR)) == NULL)
 		ereport(ERROR,
 				(errcode_for_file_access(),
 				 errmsg("could not open directory \"%s\": %m",
 					PG_DYNSHMEM_DIR)));
 
 	/* Scan for something with a name of the correct format. */
-	while ((dent = readdir(dir)) != NULL)
+	while ((dent = ReadDir(dir, PG_DYNSHMEM_DIR)) != NULL)
 	{
 		if (strncmp(dent->d_name, PG_DYNSHMEM_MMAP_FILE_PREFIX,
 				strlen(PG_DYNSHMEM_MMAP_FILE_PREFIX)) == 0)
@@ -335,7 +335,7 @@ dsm_cleanup_for_mmap(void)
 	}
 
 	/* Cleanup complete. */
-	closedir(dir);
+	FreeDir(dir);
 }
 
 /*
@@ -357,7 +357,7 @@ dsm_read_state_file(dsm_handle *h)
 	dsm_handle	handle;
 
 	/* Read the state file to get the ID of the old control segment. */
-	statefd = open(PG_DYNSHMEM_STATE_FILE, O_RDONLY | PG_BINARY, 0);
+	statefd = BasicOpenFile(PG_DYNSHMEM_STATE_FILE, O_RDONLY | PG_BINARY, 0);
 	if (statefd < 0)
 	{
 		if (errno == ENOENT)
@@ -369,10 +369,13 @@ dsm_read_state_file(dsm_handle *h)
 	}
 	nbytes = read(statefd, statebuf, PG_DYNSHMEM_STATE_BUFSIZ - 1);
 	if (nbytes < 0)
+	{
+		close(statefd);
 		ereport(ERROR,
 				(errcode_for_file_access(),
 				 errmsg("could not read file \"%s\": %m",
 					PG_DYNSHMEM_STATE_FILE)));
+	}
 	/* make sure buffer is NUL terminated */
 	statebuf[nbytes] = '\0';
 	close(statefd);
-- 
GitLab