summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Haas2015-02-17 15:19:30 +0000
committerRobert Haas2015-02-17 16:08:40 +0000
commitd7d294f5935e157f239b32c6d1f3d4e923a4eed5 (patch)
tree3f5bb236805da150e8eaa97253ad19123701910d
parent2df854f842bee71cb59f7307b5bad9c3235be2ec (diff)
Improve pg_check_dir's handling of closedir() failures.
Avoid losing errno if readdir() fails and closedir() works. This also avoids leaking the directory handle when readdir() fails. Commit 6f03927fce038096f53ca67eeab9adb24938f8a6 introduced logic to better handle readdir() and closedir() failures, bu it missed these cases. Extracted from a larger patch by Marco Nenciarini.
-rw-r--r--src/port/pgcheckdir.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/port/pgcheckdir.c b/src/port/pgcheckdir.c
index 3a2a34cbc61..f2fffe56243 100644
--- a/src/port/pgcheckdir.c
+++ b/src/port/pgcheckdir.c
@@ -31,6 +31,7 @@ pg_check_dir(const char *dir)
int result = 1;
DIR *chkdir;
struct dirent *file;
+ int readdir_errno;
chkdir = opendir(dir);
@@ -58,8 +59,15 @@ pg_check_dir(const char *dir)
errno = 0;
#endif
- if (errno || closedir(chkdir))
+ if (errno)
result = -1; /* some kind of I/O error? */
+ /* Close chkdir and avoid overwriting the readdir errno on success */
+ readdir_errno = errno;
+ if (closedir(chkdir))
+ result = -1; /* error executing closedir */
+ else
+ errno = readdir_errno;
+
return result;
}