From: Bruce Momjian Date: Thu, 25 Jul 2013 15:33:14 +0000 (-0400) Subject: pg_upgrade: adjust umask() calls X-Git-Tag: REL9_3_RC1~46 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=830d0e0edd73c015ca07423c402a3b1f79118d8f;p=postgresql pg_upgrade: adjust umask() calls Since pg_upgrade -j on Windows uses threads, calling umask() before/after opening a file via fopen_priv() is no longer possible, so set umask() as we enter the thread-creating loop, and reset it on exit. Also adjust internal fopen_priv() calls to just use fopen(). Backpatch to 9.3beta. --- diff --git a/contrib/pg_upgrade/dump.c b/contrib/pg_upgrade/dump.c index 8bf726b4c8..2504c84a8e 100644 --- a/contrib/pg_upgrade/dump.c +++ b/contrib/pg_upgrade/dump.c @@ -17,6 +17,7 @@ void generate_old_dump(void) { int dbnum; + mode_t old_umask; prep_status("Creating dump of global objects"); @@ -31,6 +32,13 @@ generate_old_dump(void) prep_status("Creating dump of database schemas\n"); + /* + * Set umask for this function, all functions it calls, and all + * subprocesses/threads it creates. We can't use fopen_priv() + * as Windows uses threads and umask is process-global. + */ + old_umask = umask(S_IRWXG | S_IRWXO); + /* create per-db dump files */ for (dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) { @@ -54,6 +62,8 @@ generate_old_dump(void) while (reap_child(true) == true) ; + umask(old_umask); + end_progress_output(); check_ok(); } diff --git a/contrib/pg_upgrade/exec.c b/contrib/pg_upgrade/exec.c index 005ded4af4..ef123a8eef 100644 --- a/contrib/pg_upgrade/exec.c +++ b/contrib/pg_upgrade/exec.c @@ -47,12 +47,9 @@ exec_prog(const char *log_file, const char *opt_log_file, #define MAXCMDLEN (2 * MAXPGPATH) char cmd[MAXCMDLEN]; - mode_t old_umask = 0; FILE *log; va_list ap; - old_umask = umask(S_IRWXG | S_IRWXO); - written = strlcpy(cmd, SYSTEMQUOTE, sizeof(cmd)); va_start(ap, fmt); written += vsnprintf(cmd + written, MAXCMDLEN - written, fmt, ap); @@ -64,7 +61,7 @@ exec_prog(const char *log_file, const char *opt_log_file, if (written >= MAXCMDLEN) pg_log(PG_FATAL, "command too long\n"); - log = fopen_priv(log_file, "a"); + log = fopen(log_file, "a"); #ifdef WIN32 { @@ -80,7 +77,7 @@ exec_prog(const char *log_file, const char *opt_log_file, for (iter = 0; iter < 4 && log == NULL; iter++) { sleep(1); - log = fopen_priv(log_file, "a"); + log = fopen(log_file, "a"); } } #endif @@ -101,8 +98,6 @@ exec_prog(const char *log_file, const char *opt_log_file, result = system(cmd); - umask(old_umask); - if (result != 0) { /* we might be in on a progress status line, so go to the next line */ @@ -131,7 +126,7 @@ exec_prog(const char *log_file, const char *opt_log_file, * never reused while the server is running, so it works fine. We could * log these commands to a third file, but that just adds complexity. */ - if ((log = fopen_priv(log_file, "a")) == NULL) + if ((log = fopen(log_file, "a")) == NULL) pg_log(PG_FATAL, "cannot write to log file %s\n", log_file); fprintf(log, "\n\n"); fclose(log);