*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.145 2002/02/12 21:25:41 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/copy.c,v 1.146 2002/02/23 21:46:02 momjian Exp $
*
*-------------------------------------------------------------------------
*/
}
else
{
+ struct stat st;
fp = AllocateFile(filename, PG_BINARY_R);
- if (fp == NULL)
+
+ if (fp == NULL)
elog(ERROR, "COPY command, running in backend with "
"effective uid %d, could not open file '%s' for "
"reading. Errno = %s (%d).",
(int) geteuid(), filename, strerror(errno), errno);
+
+ fstat(fileno(fp),&st);
+ if( S_ISDIR(st.st_mode) ){
+ fclose(fp);
+ elog(ERROR,"COPY: %s is a directory.",filename);
+ }
}
CopyFrom(rel, binary, oids, fp, delim, null_print);
}
else
{
mode_t oumask; /* Pre-existing umask value */
+ struct stat st;
/*
* Prevent write to relative path ... too easy to shoot
"effective uid %d, could not open file '%s' for "
"writing. Errno = %s (%d).",
(int) geteuid(), filename, strerror(errno), errno);
+ fstat(fileno(fp),&st);
+ if( S_ISDIR(st.st_mode) ){
+ fclose(fp);
+ elog(ERROR,"COPY: %s is a directory.",filename);
+ }
}
CopyTo(rel, binary, oids, fp, delim, null_print);
}
*
* Copyright 2000 by PostgreSQL Global Development Group
*
- * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.19 2001/06/02 18:25:18 petere Exp $
+ * $Header: /cvsroot/pgsql/src/bin/psql/copy.c,v 1.20 2002/02/23 21:46:03 momjian Exp $
*/
#include "postgres_fe.h"
#include "copy.h"
#include <errno.h>
#include <assert.h>
#include <signal.h>
+#include <sys/stat.h>
#ifndef WIN32
#include <unistd.h> /* for isatty */
#else
struct copy_options *options;
PGresult *result;
bool success;
+ struct stat st;
/* parse options */
options = parse_slash_copy(args);
free_copy_options(options);
return false;
}
-
+ /* make sure the specified file is not a directory */
+ fstat(fileno(copystream),&st);
+ if( S_ISDIR(st.st_mode) ){
+ fclose(copystream);
+ psql_error("%s: cannot COPY TO/FROM a directory\n",
+ options->file);
+ free_copy_options(options);
+ return false;
+ }
+
result = PSQLexec(query);
switch (PQresultStatus(result))