postgres.git / summary / log / commit / refs
commit 50313f8f015efd8d4f2de89e4d7fa83a8205aa6d
Author: Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date: Tue Jul 07 15:11:28 2026 +0000
First released in: 14.24, 15.19, 16.15, 17.11, 18.6
pg_dump: check for _beginthreadex() failure in parallel dump
ParallelBackupStart() stored _beginthreadex()'s return value as the
worker's thread handle without checking it. On failure that value is 0,
which would later reach WaitForMultipleObjects() as a null handle, caught
only by an Assert. The fork() path already calls pg_fatal() when it
fails; do the same for _beginthreadex(), as pgbench does.
Author: Bryan Green <dbryan.green@gmail.com>
Discussion: https://www.postgresql.org/message-id/8c712d76-ecf7-4749-a6d8-dddc01f298ec@gmail.com
Backpatch-through: 14
src/bin/pg_dump/parallel.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c
index 086adcdc502..8f57b62ba25 100644
--- a/src/bin/pg_dump/parallel.c
+++ b/src/bin/pg_dump/parallel.c
@@ -976,6 +976,8 @@ ParallelBackupStart(ArchiveHandle *AH)
handle = _beginthreadex(NULL, 0, (void *) &init_spawned_worker_win32,
wi, 0, &(slot->threadId));
+ if (handle == 0)
+ pg_fatal("could not create worker thread: %m");
slot->hThread = handle;
slot->workerStatus = WRKR_IDLE;
#else /* !WIN32 */
[parent: cf184ec77a04]