Skip to content

Commit 4e81886

Browse files
committed
Revert "pg_upgrade: Fix quoting of some arguments in pg_ctl command"
This reverts commit d1c0b61. The patch has some downsides that require more attention, as discussed with Noah Misch. Backpatch-through: 9.5
1 parent 3dfba9f commit 4e81886

File tree

1 file changed

+29
-67
lines changed

1 file changed

+29
-67
lines changed

src/bin/pg_upgrade/server.c

Lines changed: 29 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,10 @@ stop_postmaster_atexit(void)
195195
bool
196196
start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
197197
{
198+
char cmd[MAXPGPATH * 4 + 1000];
198199
PGconn *conn;
199200
bool pg_ctl_return = false;
200-
PQExpBufferData cmd;
201-
PQExpBufferData opts;
201+
char socket_string[MAXPGPATH + 200];
202202

203203
static bool exit_hook_registered = false;
204204

@@ -208,28 +208,22 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
208208
exit_hook_registered = true;
209209
}
210210

211-
initPQExpBuffer(&cmd);
211+
socket_string[0] = '\0';
212212

213-
/* Path to pg_ctl */
214-
appendPQExpBuffer(&cmd, "\"%s/pg_ctl\" -w ", cluster->bindir);
215-
216-
/* log file */
217-
appendPQExpBufferStr(&cmd, "-l ");
218-
appendShellString(&cmd, SERVER_LOG_FILE);
219-
appendPQExpBufferChar(&cmd, ' ');
220-
221-
/* data folder */
222-
appendPQExpBufferStr(&cmd, "-D ");
223-
appendShellString(&cmd, cluster->pgconfig);
224-
appendPQExpBufferChar(&cmd, ' ');
213+
#ifdef HAVE_UNIX_SOCKETS
214+
/* prevent TCP/IP connections, restrict socket access */
215+
strcat(socket_string,
216+
" -c listen_addresses='' -c unix_socket_permissions=0700");
225217

226-
/*
227-
* Build set of options for the instance to start. These are handled with
228-
* a separate string as they are one argument in the command produced to
229-
* which shell quoting needs to be applied.
230-
*/
231-
initPQExpBuffer(&opts);
232-
appendPQExpBuffer(&opts, "-p %d ", cluster->port);
218+
/* Have a sockdir? Tell the postmaster. */
219+
if (cluster->sockdir)
220+
snprintf(socket_string + strlen(socket_string),
221+
sizeof(socket_string) - strlen(socket_string),
222+
" -c %s='%s'",
223+
(GET_MAJOR_VERSION(cluster->major_version) < 903) ?
224+
"unix_socket_directory" : "unix_socket_directories",
225+
cluster->sockdir);
226+
#endif
233227

234228
/*
235229
* Since PG 9.1, we have used -b to disable autovacuum. For earlier
@@ -240,52 +234,21 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
240234
* is no need to set that.) We assume all datfrozenxid and relfrozenxid
241235
* values are less than a gap of 2000000000 from the current xid counter,
242236
* so autovacuum will not touch them.
243-
*/
244-
if (cluster->controldata.cat_ver >= BINARY_UPGRADE_SERVER_FLAG_CAT_VER)
245-
appendPQExpBufferStr(&opts, "-b ");
246-
else
247-
appendPQExpBufferStr(&opts,
248-
"-c autovacuum=off "
249-
"-c autovacuum_freeze_max_age=2000000000 ");
250-
251-
/*
237+
*
252238
* Turn off durability requirements to improve object creation speed, and
253239
* we only modify the new cluster, so only use it there. If there is a
254240
* crash, the new cluster has to be recreated anyway. fsync=off is a big
255241
* win on ext4.
256242
*/
257-
if (cluster == &new_cluster)
258-
appendPQExpBufferStr(&opts,
259-
"-c synchronous_commit=off "
260-
"-c fsync=off "
261-
"-c full_page_writes=off ");
262-
263-
if (cluster->pgopts)
264-
appendPQExpBufferStr(&opts, cluster->pgopts);
265-
266-
#ifdef HAVE_UNIX_SOCKETS
267-
appendPQExpBuffer(&opts,
268-
"-c listen_addresses='' -c unix_socket_permissions=0700 ");
269-
270-
/* Have a sockdir? Tell the postmaster. */
271-
if (cluster->sockdir)
272-
{
273-
appendPQExpBuffer(&opts,
274-
" -c %s=",
275-
(GET_MAJOR_VERSION(cluster->major_version) < 903) ?
276-
"unix_socket_directory" : "unix_socket_directories");
277-
appendPQExpBufferStr(&opts, cluster->sockdir);
278-
appendPQExpBufferChar(&opts, ' ');
279-
}
280-
#endif
281-
282-
/* Apply shell quoting to the option string */
283-
appendPQExpBufferStr(&cmd, "-o ");
284-
appendShellString(&cmd, opts.data);
285-
termPQExpBuffer(&opts);
286-
287-
/* Start mode for pg_ctl */
288-
appendPQExpBufferStr(&cmd, " start");
243+
snprintf(cmd, sizeof(cmd),
244+
"\"%s/pg_ctl\" -w -l \"%s\" -D \"%s\" -o \"-p %d%s%s %s%s\" start",
245+
cluster->bindir, SERVER_LOG_FILE, cluster->pgconfig, cluster->port,
246+
(cluster->controldata.cat_ver >=
247+
BINARY_UPGRADE_SERVER_FLAG_CAT_VER) ? " -b" :
248+
" -c autovacuum=off -c autovacuum_freeze_max_age=2000000000",
249+
(cluster == &new_cluster) ?
250+
" -c synchronous_commit=off -c fsync=off -c full_page_writes=off" : "",
251+
cluster->pgopts ? cluster->pgopts : "", socket_string);
289252

290253
/*
291254
* Don't throw an error right away, let connecting throw the error because
@@ -297,7 +260,7 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
297260
SERVER_START_LOG_FILE) != 0) ?
298261
SERVER_LOG_FILE : NULL,
299262
report_and_exit_on_error, false,
300-
"%s", cmd.data);
263+
"%s", cmd);
301264

302265
/* Did it fail and we are just testing if the server could be started? */
303266
if (!pg_ctl_return && !report_and_exit_on_error)
@@ -335,14 +298,13 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error)
335298
if (cluster == &old_cluster)
336299
pg_fatal("could not connect to source postmaster started with the command:\n"
337300
"%s\n",
338-
cmd.data);
301+
cmd);
339302
else
340303
pg_fatal("could not connect to target postmaster started with the command:\n"
341304
"%s\n",
342-
cmd.data);
305+
cmd);
343306
}
344307
PQfinish(conn);
345-
termPQExpBuffer(&cmd);
346308

347309
/*
348310
* If pg_ctl failed, and the connection didn't fail, and

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy