From b7813f94c8546356a00218cf49db67a9cf194d96 Mon Sep 17 00:00:00 2001 From: Yurii Rashkovskii Date: Mon, 24 Apr 2023 13:39:44 +0200 Subject: [PATCH] Extend the length of BackgroundWorker.bgw_library_name. It is currently set at BGW_MAXLEN, which is often insufficient for absolute paths. While it may be acceptable when used in conjunction with $libdir, this makes it tricky to use libraries that have longer paths to them. The use cases where this is necessary may include: * Local test benches * Extensions provisioned outside of standard packaging or build procedures --- doc/src/sgml/bgworker.sgml | 2 +- src/backend/postmaster/bgworker.c | 2 +- src/backend/replication/logical/launcher.c | 4 ++-- src/include/postmaster/bgworker.h | 14 +++++++++++++- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/bgworker.sgml b/doc/src/sgml/bgworker.sgml index 7ba5da27e5..9ad1146ba0 100644 --- a/doc/src/sgml/bgworker.sgml +++ b/doc/src/sgml/bgworker.sgml @@ -59,7 +59,7 @@ typedef struct BackgroundWorker int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ - char bgw_library_name[BGW_MAXLEN]; + char bgw_library_name[MAXPGPATH]; char bgw_function_name[BGW_MAXLEN]; Datum bgw_main_arg; char bgw_extra[BGW_EXTRALEN]; diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index 0dd22b2351..ade8b38984 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -362,7 +362,7 @@ BackgroundWorkerStateChange(bool allow_new_workers) ascii_safe_strlcpy(rw->rw_worker.bgw_type, slot->worker.bgw_type, BGW_MAXLEN); ascii_safe_strlcpy(rw->rw_worker.bgw_library_name, - slot->worker.bgw_library_name, BGW_MAXLEN); + slot->worker.bgw_library_name, sizeof(slot->worker.bgw_library_name)); ascii_safe_strlcpy(rw->rw_worker.bgw_function_name, slot->worker.bgw_function_name, BGW_MAXLEN); diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 970d170e73..4f69b03cb3 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -456,7 +456,7 @@ retry: bgw.bgw_flags = BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION; bgw.bgw_start_time = BgWorkerStart_RecoveryFinished; - snprintf(bgw.bgw_library_name, BGW_MAXLEN, "postgres"); + snprintf(bgw.bgw_library_name, sizeof(bgw.bgw_library_name), "postgres"); if (is_parallel_apply_worker) snprintf(bgw.bgw_function_name, BGW_MAXLEN, "ParallelApplyWorkerMain"); @@ -889,7 +889,7 @@ ApplyLauncherRegister(void) bgw.bgw_flags = BGWORKER_SHMEM_ACCESS | BGWORKER_BACKEND_DATABASE_CONNECTION; bgw.bgw_start_time = BgWorkerStart_RecoveryFinished; - snprintf(bgw.bgw_library_name, BGW_MAXLEN, "postgres"); + snprintf(bgw.bgw_library_name, sizeof(bgw.bgw_library_name), "postgres"); snprintf(bgw.bgw_function_name, BGW_MAXLEN, "ApplyLauncherMain"); snprintf(bgw.bgw_name, BGW_MAXLEN, "logical replication launcher"); diff --git a/src/include/postmaster/bgworker.h b/src/include/postmaster/bgworker.h index 845d4498e6..0ecb0f9804 100644 --- a/src/include/postmaster/bgworker.h +++ b/src/include/postmaster/bgworker.h @@ -93,13 +93,25 @@ typedef struct BackgroundWorker int bgw_flags; BgWorkerStartTime bgw_start_time; int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */ - char bgw_library_name[BGW_MAXLEN]; + char bgw_library_name[MAXPGPATH]; char bgw_function_name[BGW_MAXLEN]; Datum bgw_main_arg; char bgw_extra[BGW_EXTRALEN]; pid_t bgw_notify_pid; /* SIGUSR1 this backend on start/stop */ } BackgroundWorker; +/* + * Ensure bgw_library_name's size is backwards-compatible and sensible. + * + * Before PostgreSQL 17, we used BGW_MAXLEN for bgw_library_name which was + * too short for some use cases, particularly, absolute paths. + * + * The assertion below ensures that the new length is at least as long as + * it was before. + */ +StaticAssertDecl(sizeof((BackgroundWorker *)NULL)->bgw_library_name >= BGW_MAXLEN, + "BackgroundWorker.bgw_library_name size must be at least equal to BGW_MAXLEN"); + typedef enum BgwHandleStatus { BGWH_STARTED, /* worker is running */ -- 2.39.2 (Apple Git-143)