mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Refactor dir/file permissions
Consolidate directory and file create permissions for tools which work with the PG data directory by adding a new module (common/file_perm.c) that contains variables (pg_file_create_mode, pg_dir_create_mode) and constants to initialize them (0600 for files and 0700 for directories). Convert mkdir() calls in the backend to MakePGDirectory() if the original call used default permissions (always the case for regular PG directories). Add tests to make sure permissions in PGDATA are set correctly by the tools which modify the PG data directory. Authors: David Steele <david@pgmasters.net>, Adam Brightwell <adam.brightwell@crunchydata.com> Reviewed-By: Michael Paquier, with discussion amongst many others. Discussion: https://postgr.es/m/ad346fe6-b23e-59f1-ecb7-0e08390ad629%40pgmasters.net
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
#endif
|
||||
|
||||
#include "access/xlog_internal.h"
|
||||
#include "common/file_perm.h"
|
||||
#include "common/file_utils.h"
|
||||
#include "common/string.h"
|
||||
#include "fe_utils/string_utils.h"
|
||||
@@ -629,7 +630,7 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier)
|
||||
PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ?
|
||||
"pg_xlog" : "pg_wal");
|
||||
|
||||
if (pg_mkdir_p(statusdir, S_IRWXU) != 0 && errno != EEXIST)
|
||||
if (pg_mkdir_p(statusdir, pg_dir_create_mode) != 0 && errno != EEXIST)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("%s: could not create directory \"%s\": %s\n"),
|
||||
@@ -685,7 +686,7 @@ verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found)
|
||||
/*
|
||||
* Does not exist, so create
|
||||
*/
|
||||
if (pg_mkdir_p(dirname, S_IRWXU) == -1)
|
||||
if (pg_mkdir_p(dirname, pg_dir_create_mode) == -1)
|
||||
{
|
||||
fprintf(stderr,
|
||||
_("%s: could not create directory \"%s\": %s\n"),
|
||||
@@ -1129,7 +1130,7 @@ ReceiveTarFile(PGconn *conn, PGresult *res, int rownum)
|
||||
|
||||
tarCreateHeader(header, "recovery.conf", NULL,
|
||||
recoveryconfcontents->len,
|
||||
0600, 04000, 02000,
|
||||
pg_file_create_mode, 04000, 02000,
|
||||
time(NULL));
|
||||
|
||||
padding = ((recoveryconfcontents->len + 511) & ~511) - recoveryconfcontents->len;
|
||||
@@ -1441,7 +1442,7 @@ ReceiveAndUnpackTarFile(PGconn *conn, PGresult *res, int rownum)
|
||||
* Directory
|
||||
*/
|
||||
filename[strlen(filename) - 1] = '\0'; /* Remove trailing slash */
|
||||
if (mkdir(filename, S_IRWXU) != 0)
|
||||
if (mkdir(filename, pg_dir_create_mode) != 0)
|
||||
{
|
||||
/*
|
||||
* When streaming WAL, pg_wal (or pg_xlog for pre-9.6
|
||||
|
@@ -6,7 +6,7 @@ use File::Basename qw(basename dirname);
|
||||
use File::Path qw(rmtree);
|
||||
use PostgresNode;
|
||||
use TestLib;
|
||||
use Test::More tests => 104;
|
||||
use Test::More tests => 105;
|
||||
|
||||
program_help_ok('pg_basebackup');
|
||||
program_version_ok('pg_basebackup');
|
||||
@@ -16,6 +16,9 @@ my $tempdir = TestLib::tempdir;
|
||||
|
||||
my $node = get_new_node('main');
|
||||
|
||||
# Set umask so test directories and files are created with default permissions
|
||||
umask(0077);
|
||||
|
||||
# Initialize node without replication settings
|
||||
$node->init(extra => [ '--data-checksums' ]);
|
||||
$node->start;
|
||||
@@ -94,6 +97,15 @@ $node->command_ok([ 'pg_basebackup', '-D', "$tempdir/backup", '-X', 'none' ],
|
||||
'pg_basebackup runs');
|
||||
ok(-f "$tempdir/backup/PG_VERSION", 'backup was created');
|
||||
|
||||
# Permissions on backup should be default
|
||||
SKIP:
|
||||
{
|
||||
skip "unix-style permissions not supported on Windows", 1 if ($windows_os);
|
||||
|
||||
ok(check_mode_recursive("$tempdir/backup", 0700, 0600),
|
||||
"check backup dir permissions");
|
||||
}
|
||||
|
||||
# Only archive_status directory should be copied in pg_wal/.
|
||||
is_deeply(
|
||||
[ sort(slurp_dir("$tempdir/backup/pg_wal/")) ],
|
||||
|
@@ -2,12 +2,15 @@ use strict;
|
||||
use warnings;
|
||||
use TestLib;
|
||||
use PostgresNode;
|
||||
use Test::More tests => 18;
|
||||
use Test::More tests => 19;
|
||||
|
||||
program_help_ok('pg_receivewal');
|
||||
program_version_ok('pg_receivewal');
|
||||
program_options_handling_ok('pg_receivewal');
|
||||
|
||||
# Set umask so test directories and files are created with default permissions
|
||||
umask(0077);
|
||||
|
||||
my $primary = get_new_node('primary');
|
||||
$primary->init(allows_streaming => 1);
|
||||
$primary->start;
|
||||
@@ -56,3 +59,12 @@ $primary->command_ok(
|
||||
[ 'pg_receivewal', '-D', $stream_dir, '--verbose',
|
||||
'--endpos', $nextlsn, '--synchronous', '--no-loop' ],
|
||||
'streaming some WAL with --synchronous');
|
||||
|
||||
# Permissions on WAL files should be default
|
||||
SKIP:
|
||||
{
|
||||
skip "unix-style permissions not supported on Windows", 1 if ($windows_os);
|
||||
|
||||
ok(check_mode_recursive($stream_dir, 0700, 0600),
|
||||
"check stream dir permissions");
|
||||
}
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#endif
|
||||
|
||||
#include "pgtar.h"
|
||||
#include "common/file_perm.h"
|
||||
#include "common/file_utils.h"
|
||||
|
||||
#include "receivelog.h"
|
||||
@@ -89,7 +90,7 @@ dir_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_
|
||||
* does not do any system calls to fsync() to make changes permanent on
|
||||
* disk.
|
||||
*/
|
||||
fd = open(tmppath, O_WRONLY | O_CREAT | PG_BINARY, S_IRUSR | S_IWUSR);
|
||||
fd = open(tmppath, O_WRONLY | O_CREAT | PG_BINARY, pg_file_create_mode);
|
||||
if (fd < 0)
|
||||
return NULL;
|
||||
|
||||
@@ -534,7 +535,8 @@ tar_open_for_write(const char *pathname, const char *temp_suffix, size_t pad_to_
|
||||
* We open the tar file only when we first try to write to it.
|
||||
*/
|
||||
tar_data->fd = open(tar_data->tarfilename,
|
||||
O_WRONLY | O_CREAT | PG_BINARY, S_IRUSR | S_IWUSR);
|
||||
O_WRONLY | O_CREAT | PG_BINARY,
|
||||
pg_file_create_mode);
|
||||
if (tar_data->fd < 0)
|
||||
return NULL;
|
||||
|
||||
|
Reference in New Issue
Block a user