v2-0001-Extend-the-length-of-BackgroundWorker.bgw_library_na.patch
application/octet-stream
Filename: v2-0001-Extend-the-length-of-BackgroundWorker.bgw_library_na.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v2-0001
Subject: Extend the length of BackgroundWorker.bgw_library_name.
| File | + | − |
|---|---|---|
| doc/src/sgml/bgworker.sgml | 1 | 1 |
| src/backend/postmaster/bgworker.c | 1 | 1 |
| src/backend/replication/logical/launcher.c | 2 | 2 |
| src/include/postmaster/bgworker.h | 13 | 1 |
From b7813f94c8546356a00218cf49db67a9cf194d96 Mon Sep 17 00:00:00 2001
From: Yurii Rashkovskii <yrashk@gmail.com>
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)