Commit 0ca91482 authored by Tom Lane's avatar Tom Lane

Add missing error checking in readdir() loops.

parent c58071a5
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
* as a service. * as a service.
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/port/copydir.c,v 1.10 2004/12/31 22:03:53 pgsql Exp $ * $PostgreSQL: pgsql/src/port/copydir.c,v 1.11 2005/03/24 02:11:20 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -56,6 +56,7 @@ copydir(char *fromdir, char *todir) ...@@ -56,6 +56,7 @@ copydir(char *fromdir, char *todir)
return -1; return -1;
} }
errno = 0;
while ((xlde = readdir(xldir)) != NULL) while ((xlde = readdir(xldir)) != NULL)
{ {
snprintf(fromfl, MAXPGPATH, "%s/%s", fromdir, xlde->d_name); snprintf(fromfl, MAXPGPATH, "%s/%s", fromdir, xlde->d_name);
...@@ -68,6 +69,24 @@ copydir(char *fromdir, char *todir) ...@@ -68,6 +69,24 @@ copydir(char *fromdir, char *todir)
FreeDir(xldir); FreeDir(xldir);
return -1; return -1;
} }
errno = 0;
}
#ifdef WIN32
/*
* This fix is in mingw cvs (runtime/mingwex/dirent.c rev 1.4), but
* not in released version
*/
if (GetLastError() == ERROR_NO_MORE_FILES)
errno = 0;
#endif
if (errno)
{
ereport(WARNING,
(errcode_for_file_access(),
errmsg("could not read directory \"%s\": %m", fromdir)));
FreeDir(xldir);
return -1;
} }
FreeDir(xldir); FreeDir(xldir);
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
* Win32 (NT, Win2k, XP). replace() doesn't work on Win95/98/Me. * Win32 (NT, Win2k, XP). replace() doesn't work on Win95/98/Me.
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/port/dirmod.c,v 1.36 2005/02/22 04:43:16 momjian Exp $ * $PostgreSQL: pgsql/src/port/dirmod.c,v 1.37 2005/03/24 02:11:20 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -326,10 +326,19 @@ fnames(char *path) ...@@ -326,10 +326,19 @@ fnames(char *path)
dir = opendir(path); dir = opendir(path);
if (dir == NULL) if (dir == NULL)
{
#ifndef FRONTEND
elog(WARNING, "could not open directory \"%s\": %m", path);
#else
fprintf(stderr, _("could not open directory \"%s\": %s\n"),
path, strerror(errno));
#endif
return NULL; return NULL;
}
filenames = (char **) palloc(fnsize * sizeof(char *)); filenames = (char **) palloc(fnsize * sizeof(char *));
errno = 0;
while ((file = readdir(dir)) != NULL) while ((file = readdir(dir)) != NULL)
{ {
if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0) if (strcmp(file->d_name, ".") != 0 && strcmp(file->d_name, "..") != 0)
...@@ -342,6 +351,25 @@ fnames(char *path) ...@@ -342,6 +351,25 @@ fnames(char *path)
} }
filenames[numnames++] = pstrdup(file->d_name); filenames[numnames++] = pstrdup(file->d_name);
} }
errno = 0;
}
#ifdef WIN32
/*
* This fix is in mingw cvs (runtime/mingwex/dirent.c rev 1.4), but
* not in released version
*/
if (GetLastError() == ERROR_NO_MORE_FILES)
errno = 0;
#endif
if (errno)
{
#ifndef FRONTEND
elog(WARNING, "could not read directory \"%s\": %m", path);
#else
fprintf(stderr, _("could not read directory \"%s\": %s\n"),
path, strerror(errno));
#endif
} }
filenames[numnames] = NULL; filenames[numnames] = NULL;
...@@ -434,7 +462,8 @@ report_and_fail: ...@@ -434,7 +462,8 @@ report_and_fail:
#ifndef FRONTEND #ifndef FRONTEND
elog(WARNING, "could not remove file or directory \"%s\": %m", filepath); elog(WARNING, "could not remove file or directory \"%s\": %m", filepath);
#else #else
fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"), filepath, strerror(errno)); fprintf(stderr, _("could not remove file or directory \"%s\": %s\n"),
filepath, strerror(errno));
#endif #endif
fnames_cleanup(filenames); fnames_cleanup(filenames);
return false; return false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment