]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
pg_dump: check for _beginthreadex() failure in parallel dump
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 7 Jul 2026 15:11:28 +0000 (18:11 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Tue, 7 Jul 2026 15:11:46 +0000 (18:11 +0300)
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

index c9f6b86bb05f5d8716cf1953c0ed83aaac45e4b7..4a4296ec85f2d3a42f612b6be14bf634cc0401d2 100644 (file)
@@ -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 */