mirror of
https://github.com/postgres/postgres.git
synced 2025-04-27 22:56:53 +03:00
Fix incorrect ordering of operations in pg_resetwal and pg_rewind.
Commit c37b3d08c dropped its added GetDataDirectoryCreatePerm call into the wrong place in pg_resetwal.c, namely after the chdir to DataDir. That broke invocations using a relative path, as reported by Tushar Ahuja. We could have left it where it was and changed the argument to be ".", but that'd result in a rather confusing error message in event of a failure, so re-ordering seems like a better solution. Similarly reorder operations in pg_rewind.c. The issue there is that it doesn't seem like a good idea to do any actual operations before the not-root check (on Unix) or the restricted token acquisition (on Windows). I don't know that this is an actual bug, but I'm definitely not convinced that it isn't, either. Assorted other code review for c37b3d08c and da9b580d8: fix some misspelled or otherwise badly worded comments, put the #include for <sys/stat.h> where it actually belongs, etc. Discussion: https://postgr.es/m/aeb9c3a7-3c3f-a57f-1a18-c8d4fcdc2a1f@enterprisedb.com
This commit is contained in:
parent
b06d8e58b5
commit
1d96c1b91a
@ -3552,8 +3552,8 @@ fsync_parent_path(const char *fname, int elevel)
|
|||||||
/*
|
/*
|
||||||
* Create a PostgreSQL data sub-directory
|
* Create a PostgreSQL data sub-directory
|
||||||
*
|
*
|
||||||
* The data directory itself, along with most other directories, are created at
|
* The data directory itself, and most of its sub-directories, are created at
|
||||||
* initdb-time, but we do have some occations where we create directories from
|
* initdb time, but we do have some occasions when we create directories in
|
||||||
* the backend (CREATE TABLESPACE, for example). In those cases, we want to
|
* the backend (CREATE TABLESPACE, for example). In those cases, we want to
|
||||||
* make sure that those directories are created consistently. Today, that means
|
* make sure that those directories are created consistently. Today, that means
|
||||||
* making sure that the created directory has the correct permissions, which is
|
* making sure that the created directory has the correct permissions, which is
|
||||||
@ -3562,8 +3562,8 @@ fsync_parent_path(const char *fname, int elevel)
|
|||||||
* Note that we also set the umask() based on what we understand the correct
|
* Note that we also set the umask() based on what we understand the correct
|
||||||
* permissions to be (see file_perm.c).
|
* permissions to be (see file_perm.c).
|
||||||
*
|
*
|
||||||
* For permissions other than the default mkdir() can be used directly, but be
|
* For permissions other than the default, mkdir() can be used directly, but
|
||||||
* sure to consider carefully such cases -- a directory with incorrect
|
* be sure to consider carefully such cases -- a sub-directory with incorrect
|
||||||
* permissions in a PostgreSQL data directory could cause backups and other
|
* permissions in a PostgreSQL data directory could cause backups and other
|
||||||
* processes to fail.
|
* processes to fail.
|
||||||
*/
|
*/
|
||||||
|
@ -18,8 +18,6 @@
|
|||||||
*/
|
*/
|
||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include "common/file_perm.h"
|
#include "common/file_perm.h"
|
||||||
#include "libpq/libpq-be.h"
|
#include "libpq/libpq-be.h"
|
||||||
#include "libpq/pqcomm.h"
|
#include "libpq/pqcomm.h"
|
||||||
@ -63,7 +61,7 @@ struct Latch *MyLatch;
|
|||||||
char *DataDir = NULL;
|
char *DataDir = NULL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mode of the data directory. The default is 0700 but may it be changed in
|
* Mode of the data directory. The default is 0700 but it may be changed in
|
||||||
* checkDataDir() to 0750 if the data directory actually has that mode.
|
* checkDataDir() to 0750 if the data directory actually has that mode.
|
||||||
*/
|
*/
|
||||||
int data_directory_mode = PG_DIR_MODE_OWNER;
|
int data_directory_mode = PG_DIR_MODE_OWNER;
|
||||||
|
@ -356,13 +356,6 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
get_restricted_token(progname);
|
get_restricted_token(progname);
|
||||||
|
|
||||||
if (chdir(DataDir) < 0)
|
|
||||||
{
|
|
||||||
fprintf(stderr, _("%s: could not change directory to \"%s\": %s\n"),
|
|
||||||
progname, DataDir, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set mask based on PGDATA permissions */
|
/* Set mask based on PGDATA permissions */
|
||||||
if (!GetDataDirectoryCreatePerm(DataDir))
|
if (!GetDataDirectoryCreatePerm(DataDir))
|
||||||
{
|
{
|
||||||
@ -373,6 +366,13 @@ main(int argc, char *argv[])
|
|||||||
|
|
||||||
umask(pg_mode_mask);
|
umask(pg_mode_mask);
|
||||||
|
|
||||||
|
if (chdir(DataDir) < 0)
|
||||||
|
{
|
||||||
|
fprintf(stderr, _("%s: could not change directory to \"%s\": %s\n"),
|
||||||
|
progname, DataDir, strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check that data directory matches our server version */
|
/* Check that data directory matches our server version */
|
||||||
CheckDataVersion();
|
CheckDataVersion();
|
||||||
|
|
||||||
|
@ -186,16 +186,6 @@ main(int argc, char **argv)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set mask based on PGDATA permissions */
|
|
||||||
if (!GetDataDirectoryCreatePerm(datadir_target))
|
|
||||||
{
|
|
||||||
fprintf(stderr, _("%s: could not read permissions of directory \"%s\": %s\n"),
|
|
||||||
progname, datadir_target, strerror(errno));
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
umask(pg_mode_mask);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't allow pg_rewind to be run as root, to avoid overwriting the
|
* Don't allow pg_rewind to be run as root, to avoid overwriting the
|
||||||
* ownership of files in the data directory. We need only check for root
|
* ownership of files in the data directory. We need only check for root
|
||||||
@ -214,6 +204,16 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
get_restricted_token(progname);
|
get_restricted_token(progname);
|
||||||
|
|
||||||
|
/* Set mask based on PGDATA permissions */
|
||||||
|
if (!GetDataDirectoryCreatePerm(datadir_target))
|
||||||
|
{
|
||||||
|
fprintf(stderr, _("%s: could not read permissions of directory \"%s\": %s\n"),
|
||||||
|
progname, datadir_target, strerror(errno));
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
umask(pg_mode_mask);
|
||||||
|
|
||||||
/* Connect to remote server */
|
/* Connect to remote server */
|
||||||
if (connstr_source)
|
if (connstr_source)
|
||||||
libpqConnect(connstr_source);
|
libpqConnect(connstr_source);
|
||||||
|
@ -10,9 +10,8 @@
|
|||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
#include <sys/stat.h>
|
|
||||||
|
|
||||||
#include "c.h"
|
#include "c.h"
|
||||||
|
|
||||||
#include "common/file_perm.h"
|
#include "common/file_perm.h"
|
||||||
|
|
||||||
/* Modes for creating directories and files in the data directory */
|
/* Modes for creating directories and files in the data directory */
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/*-------------------------------------------------------------------------
|
/*-------------------------------------------------------------------------
|
||||||
*
|
*
|
||||||
* File and directory permission constants
|
* File and directory permission definitions
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group
|
||||||
@ -13,6 +13,8 @@
|
|||||||
#ifndef FILE_PERM_H
|
#ifndef FILE_PERM_H
|
||||||
#define FILE_PERM_H
|
#define FILE_PERM_H
|
||||||
|
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mode mask for data directory permissions that only allows the owner to
|
* Mode mask for data directory permissions that only allows the owner to
|
||||||
* read/write directories and files.
|
* read/write directories and files.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user