mirror of
https://github.com/postgres/postgres.git
synced 2025-07-03 20:02:46 +03:00
Path-mangling logic was failing to account for paths containing mentions
of '.' or '..'. Extend canonicalize_path() to trim off trailing occurrences of these things, and use it to fix up paths where needed (which I think is only after places where we trim the last path component, but maybe some others will turn up). Fixes Josh's complaint that './initdb' does not work.
This commit is contained in:
@ -39,7 +39,7 @@
|
|||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
* Portions taken from FreeBSD.
|
* Portions taken from FreeBSD.
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.46 2004/08/01 06:19:23 momjian Exp $
|
* $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.47 2004/08/09 20:20:47 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -2227,6 +2227,7 @@ main(int argc, char *argv[])
|
|||||||
/* store binary directory */
|
/* store binary directory */
|
||||||
strcpy(bin_path, backend_exec);
|
strcpy(bin_path, backend_exec);
|
||||||
*last_dir_separator(bin_path) = '\0';
|
*last_dir_separator(bin_path) = '\0';
|
||||||
|
canonicalize_path(bin_path);
|
||||||
|
|
||||||
if (!share_path)
|
if (!share_path)
|
||||||
{
|
{
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/port/exec.c,v 1.20 2004/08/09 03:12:38 momjian Exp $
|
* $PostgreSQL: pgsql/src/port/exec.c,v 1.21 2004/08/09 20:20:46 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -433,6 +433,9 @@ find_other_exec(const char *argv0, const char *target,
|
|||||||
|
|
||||||
/* Trim off program name and keep just directory */
|
/* Trim off program name and keep just directory */
|
||||||
*last_dir_separator(retpath) = '\0';
|
*last_dir_separator(retpath) = '\0';
|
||||||
|
canonicalize_path(retpath);
|
||||||
|
|
||||||
|
/* Now append the other program's name */
|
||||||
snprintf(retpath + strlen(retpath), MAXPGPATH - strlen(retpath),
|
snprintf(retpath + strlen(retpath), MAXPGPATH - strlen(retpath),
|
||||||
"/%s%s", target, EXE);
|
"/%s%s", target, EXE);
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/port/path.c,v 1.26 2004/08/01 06:56:39 momjian Exp $
|
* $PostgreSQL: pgsql/src/port/path.c,v 1.27 2004/08/09 20:20:46 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -116,11 +116,33 @@ canonicalize_path(char *path)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Removing the trailing slash on a path means we never get
|
* Removing the trailing slash on a path means we never get ugly double
|
||||||
* ugly double slashes. Don't remove a leading slash, though.
|
* slashes. Also, Win32 can't stat() a directory with a trailing slash.
|
||||||
* Also, Win32 can't stat() a directory with a trailing slash.
|
* Don't remove a leading slash, though.
|
||||||
*/
|
*/
|
||||||
trim_trailing_separator(path);
|
trim_trailing_separator(path);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Remove any trailing uses of "." or "..", too.
|
||||||
|
*/
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
int len = strlen(path);
|
||||||
|
|
||||||
|
if (len >= 2 && strcmp(path + len - 2, "/.") == 0)
|
||||||
|
{
|
||||||
|
trim_directory(path);
|
||||||
|
trim_trailing_separator(path);
|
||||||
|
}
|
||||||
|
else if (len >= 3 && strcmp(path + len - 3, "/..") == 0)
|
||||||
|
{
|
||||||
|
trim_directory(path);
|
||||||
|
trim_directory(path);
|
||||||
|
trim_trailing_separator(path);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -444,7 +466,7 @@ trim_trailing_separator(char *path)
|
|||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
/*
|
/*
|
||||||
* Skip over network and drive specifiers for win32.
|
* Skip over network and drive specifiers for win32.
|
||||||
* Set 'path' to point to the last character to keep.
|
* Set 'path' to point to the last character we must keep.
|
||||||
*/
|
*/
|
||||||
if (strlen(path) >= 2)
|
if (strlen(path) >= 2)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user