Files
packages/libs/postgresql/patches/900-pg_ctl-setuid.patch
Hannu Nyman 3dbefd299a Revert "postgresql: update to version 16.3"
This reverts commit 6a46887e60
from PR https://github.com/openwrt/packages/pull/24327

Postgresql version upgrade fails in buildbot for all targets
with error like:

[236/1612] Generating src/fe_utils/psqlscan with a custom command
FAILED: src/fe_utils/psqlscan.c
/builder/shared-workdir/build/sdk/staging_dir/host/bin/python3 ../src/tools/pgflex --builddir . --srcdir .. --privatedir src/fe_utils/psqlscan.c.p --flex /builder/shared-workdir/build/sdk/staging_dir/host/bin/flex --perl /builder/shared-workdir/build/sdk/staging_dir/host/bin/perl -i ../src/fe_utils/psqlscan.l -o src/fe_utils/psqlscan.c --no-backup --fix-warnings -- -Cfe -p -p
flex: fatal internal error, exec of /builder/shared-workdir/build/staging_dir/host/bin/m4 failed
[237/1612] Compiling C object src/interfaces/libpq/libpq.so.5.16.p/pqexpbuffer.c.o
ninja: build stopped: subcommand failed.
make[3]: *** [Makefile:264: /builder/shared-workdir/build/sdk/build_dir/target-aarch64_cortex-a53_musl/postgresql-16.3/.built] Error 1

Several dozen packages depend upon postgresql, so the fallout is
rather large. Let's revert the upgrade until a fix is found.

Signed-off-by: Hannu Nyman <hannu.nyman@iki.fi>
2024-07-09 13:09:18 +03:00

108 lines
3.2 KiB
Diff

--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -96,6 +96,7 @@ static char *event_source = NULL;
static char *register_servicename = "PostgreSQL"; /* FIXME: + version ID? */
static char *register_username = NULL;
static char *register_password = NULL;
+static char *username = "";
static char *argv0 = NULL;
static bool allow_core_files = false;
static time_t start_time;
@@ -2086,6 +2087,9 @@ do_help(void)
#endif
printf(_(" -s, --silent only print errors, no informational messages\n"));
printf(_(" -t, --timeout=SECS seconds to wait when using -w option\n"));
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ printf(_(" -U, --username=NAME user name of account PostgreSQL server is running as\n"));
+#endif
printf(_(" -V, --version output version information, then exit\n"));
printf(_(" -w, --wait wait until operation completes (default)\n"));
printf(_(" -W, --no-wait do not wait until operation completes\n"));
@@ -2298,6 +2302,7 @@ main(int argc, char **argv)
{"options", required_argument, NULL, 'o'},
{"silent", no_argument, NULL, 's'},
{"timeout", required_argument, NULL, 't'},
+ {"username", required_argument, NULL, 'U'},
{"core-files", no_argument, NULL, 'c'},
{"wait", no_argument, NULL, 'w'},
{"no-wait", no_argument, NULL, 'W'},
@@ -2338,20 +2343,6 @@ main(int argc, char **argv)
}
}
- /*
- * Disallow running as root, to forestall any possible security holes.
- */
-#ifndef WIN32
- if (geteuid() == 0)
- {
- write_stderr(_("%s: cannot be run as root\n"
- "Please log in (using, e.g., \"su\") as the "
- "(unprivileged) user that will\n"
- "own the server process.\n"),
- progname);
- exit(1);
- }
-#endif
env_wait = getenv("PGCTLTIMEOUT");
if (env_wait != NULL)
@@ -2437,11 +2428,15 @@ main(int argc, char **argv)
wait_seconds_arg = true;
break;
case 'U':
+#if defined(WIN32) || defined(__CYGWIN__)
if (strchr(optarg, '\\'))
register_username = pg_strdup(optarg);
else
/* Prepend .\ for local accounts */
register_username = psprintf(".\\%s", optarg);
+#else
+ username = pg_strdup(optarg);
+#endif
break;
case 'w':
do_wait = true;
@@ -2523,6 +2518,41 @@ main(int argc, char **argv)
exit(1);
}
+ /*
+ * Disallow running as root, to forestall any possible security holes.
+ */
+#if !defined(WIN32) && !defined(__CYGWIN__)
+ if (geteuid() == 0)
+ {
+ struct passwd *p;
+ if (!username || !strlen(username)) {
+ fprintf(stderr,
+ _("%s: when run as root, username needs to be provided\n"),
+ progname);
+ exit(1);
+ }
+ p = getpwnam(username);
+ if (!p) {
+ fprintf(stderr,
+ _("%s: invalid username: %s\n"),
+ progname, username);
+ exit(1);
+ }
+ if (!p->pw_uid) {
+ fprintf(stderr,
+ _("%s: user needs to be non-root\n"),
+ progname);
+ exit(1);
+ }
+ if (setgid(p->pw_gid) || setuid(p->pw_uid)) {
+ fprintf(stderr,
+ _("%s: failed to set user id %d: %d (%s)\n"),
+ progname, p->pw_uid, errno, strerror(errno));
+ exit(1);
+ }
+ }
+#endif
+
/* Note we put any -D switch into the env var above */
pg_config = getenv("PGDATA");
if (pg_config)