OK'ed by Peter.
Patch applied. Thanks.
---------------------------------------------------------------------------
Brent Verner wrote:
> [2002-01-17 07:08] Brent Verner said:
> | [2002-01-16 17:47] Douglas Trainor said:
> | | I'd like to report a bug in 7.1.3 psql (at least on a 64-bit Alpha Linux box).
> | | Maybe someone can confirm this or maybe it's fixed in 7.2
> |
> | The attached patch is for 7.2, but might apply (with some fuzz) to 7.1.x.
> |
> | files:
> | src/backend/commands/copy.c
> | src/bin/psql/copy.c
> |
> | note:
> | Add fstat / S_ISDIR checks to make sure we're not trying to use a directory
> | for COPY TO/FROM.
>
> ...too early in the AM. The proper/complete patch is attached this
> time.
>
> b
--
Bruce Momjian | http://candle.pha.pa.us
[EMAIL PROTECTED] | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
Index: src/backend/commands/copy.c
===================================================================
RCS file: /var/cvsup/pgsql/src/backend/commands/copy.c,v
retrieving revision 1.144
diff -c -r1.144 copy.c
*** src/backend/commands/copy.c 4 Dec 2001 21:19:57 -0000 1.144
--- src/backend/commands/copy.c 17 Jan 2002 12:24:17 -0000
***************
*** 326,337 ****
}
else
{
fp = AllocateFile(filename, PG_BINARY_R);
! 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);
}
CopyFrom(rel, binary, oids, fp, delim, null_print);
}
--- 326,345 ----
}
else
{
+ struct stat st;
fp = AllocateFile(filename, PG_BINARY_R);
!
! 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);
}
***************
*** 360,365 ****
--- 368,374 ----
else
{
mode_t oumask; /* Pre-existing umask value */
+ struct stat st;
/*
* Prevent write to relative path ... too easy to shoot
***************
*** 378,383 ****
--- 387,397 ----
"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);
}
Index: src/bin/psql/copy.c
===================================================================
RCS file: /var/cvsup/pgsql/src/bin/psql/copy.c,v
retrieving revision 1.19
diff -c -r1.19 copy.c
*** src/bin/psql/copy.c 2 Jun 2001 18:25:18 -0000 1.19
--- src/bin/psql/copy.c 17 Jan 2002 12:25:07 -0000
***************
*** 11,16 ****
--- 11,17 ----
#include <errno.h>
#include <assert.h>
#include <signal.h>
+ #include <sys/stat.h>
#ifndef WIN32
#include <unistd.h> /* for isatty */
#else
***************
*** 233,238 ****
--- 234,240 ----
struct copy_options *options;
PGresult *result;
bool success;
+ struct stat st;
/* parse options */
options = parse_slash_copy(args);
***************
*** 292,298 ****
free_copy_options(options);
return false;
}
!
result = PSQLexec(query);
switch (PQresultStatus(result))
--- 294,309 ----
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))
---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?
http://archives.postgresql.org