]> granicus.if.org Git - postgresql/commitdiff
Improve pg_check_dir's handling of closedir() failures.
authorRobert Haas <rhaas@postgresql.org>
Tue, 17 Feb 2015 15:19:30 +0000 (10:19 -0500)
committerRobert Haas <rhaas@postgresql.org>
Tue, 17 Feb 2015 16:08:40 +0000 (11:08 -0500)
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.

src/port/pgcheckdir.c

index 3a2a34cbc61da65361f22613cb12bb9baa1e177a..f2fffe56243ed9d3427ee65909145c5d24c98ff8 100644 (file)
@@ -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;
 }