Commit 9a279da7 authored by Tom Lane's avatar Tom Lane

Guard against createdb --location=PGDATA foo; without this, the code

tries to create a symlink pointing at itself.  Per trouble report from
Kenneth McDowell.
parent 9b3a6b5e
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.81 2001/10/25 05:49:24 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/dbcommands.c,v 1.82 2002/02/23 20:55:46 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -164,10 +164,21 @@ createdb(const char *dbname, const char *dbpath, ...@@ -164,10 +164,21 @@ createdb(const char *dbname, const char *dbpath,
* Compute nominal location (where we will try to access the * Compute nominal location (where we will try to access the
* database), and resolve alternate physical location if one is * database), and resolve alternate physical location if one is
* specified. * specified.
*
* If an alternate location is specified but is the same as the
* normal path, just drop the alternate-location spec (this seems
* friendlier than erroring out). We must test this case to avoid
* creating a circular symlink below.
*/ */
nominal_loc = GetDatabasePath(dboid); nominal_loc = GetDatabasePath(dboid);
alt_loc = resolve_alt_dbpath(dbpath, dboid); alt_loc = resolve_alt_dbpath(dbpath, dboid);
if (alt_loc && strcmp(alt_loc, nominal_loc) == 0)
{
alt_loc = NULL;
dbpath = NULL;
}
if (strchr(nominal_loc, '\'')) if (strchr(nominal_loc, '\''))
elog(ERROR, "database path may not contain single quotes"); elog(ERROR, "database path may not contain single quotes");
if (alt_loc && strchr(alt_loc, '\'')) if (alt_loc && strchr(alt_loc, '\''))
...@@ -198,7 +209,9 @@ createdb(const char *dbname, const char *dbpath, ...@@ -198,7 +209,9 @@ createdb(const char *dbname, const char *dbpath,
if (mkdir(target_dir, S_IRWXU) != 0) if (mkdir(target_dir, S_IRWXU) != 0)
elog(ERROR, "CREATE DATABASE: unable to create database directory '%s': %m", elog(ERROR, "CREATE DATABASE: unable to create database directory '%s': %m",
target_dir); target_dir);
rmdir(target_dir); if (rmdir(target_dir) != 0)
elog(ERROR, "CREATE DATABASE: unable to remove temp directory '%s': %m",
target_dir);
/* Make the symlink, if needed */ /* Make the symlink, if needed */
if (alt_loc) if (alt_loc)
...@@ -548,6 +561,9 @@ resolve_alt_dbpath(const char *dbpath, Oid dboid) ...@@ -548,6 +561,9 @@ resolve_alt_dbpath(const char *dbpath, Oid dboid)
} }
len = strlen(prefix) + 6 + sizeof(Oid) * 8 + 1; len = strlen(prefix) + 6 + sizeof(Oid) * 8 + 1;
if (len >= MAXPGPATH - 100)
elog(ERROR, "Alternate path is too long");
ret = palloc(len); ret = palloc(len);
snprintf(ret, len, "%s/base/%u", prefix, dboid); snprintf(ret, len, "%s/base/%u", prefix, dboid);
......
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