Commit 5f644ea6 authored by Bruce Momjian's avatar Bruce Momjian

Add fstat / S_ISDIR checks to make sure we're not trying to use a

directory for COPY TO/FROM.

Brent Verner
parent ec4027f8
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * 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 $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -326,12 +326,20 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe, ...@@ -326,12 +326,20 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
} }
else else
{ {
struct stat st;
fp = AllocateFile(filename, PG_BINARY_R); fp = AllocateFile(filename, PG_BINARY_R);
if (fp == NULL)
if (fp == NULL)
elog(ERROR, "COPY command, running in backend with " elog(ERROR, "COPY command, running in backend with "
"effective uid %d, could not open file '%s' for " "effective uid %d, could not open file '%s' for "
"reading. Errno = %s (%d).", "reading. Errno = %s (%d).",
(int) geteuid(), filename, strerror(errno), errno); (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); CopyFrom(rel, binary, oids, fp, delim, null_print);
} }
...@@ -360,6 +368,7 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe, ...@@ -360,6 +368,7 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
else else
{ {
mode_t oumask; /* Pre-existing umask value */ mode_t oumask; /* Pre-existing umask value */
struct stat st;
/* /*
* Prevent write to relative path ... too easy to shoot * Prevent write to relative path ... too easy to shoot
...@@ -378,6 +387,11 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe, ...@@ -378,6 +387,11 @@ DoCopy(char *relname, bool binary, bool oids, bool from, bool pipe,
"effective uid %d, could not open file '%s' for " "effective uid %d, could not open file '%s' for "
"writing. Errno = %s (%d).", "writing. Errno = %s (%d).",
(int) geteuid(), filename, strerror(errno), errno); (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); CopyTo(rel, binary, oids, fp, delim, null_print);
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* Copyright 2000 by PostgreSQL Global Development Group * 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 "postgres_fe.h"
#include "copy.h" #include "copy.h"
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <errno.h> #include <errno.h>
#include <assert.h> #include <assert.h>
#include <signal.h> #include <signal.h>
#include <sys/stat.h>
#ifndef WIN32 #ifndef WIN32
#include <unistd.h> /* for isatty */ #include <unistd.h> /* for isatty */
#else #else
...@@ -233,6 +234,7 @@ do_copy(const char *args) ...@@ -233,6 +234,7 @@ do_copy(const char *args)
struct copy_options *options; struct copy_options *options;
PGresult *result; PGresult *result;
bool success; bool success;
struct stat st;
/* parse options */ /* parse options */
options = parse_slash_copy(args); options = parse_slash_copy(args);
...@@ -292,7 +294,16 @@ do_copy(const char *args) ...@@ -292,7 +294,16 @@ do_copy(const char *args)
free_copy_options(options); free_copy_options(options);
return false; 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); result = PSQLexec(query);
switch (PQresultStatus(result)) switch (PQresultStatus(result))
......
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