postgres.git / summary / log / commit / refs

commit    f59a592f9b2fe64affdbc63187d2da763df0caf0
Author:   Heikki Linnakangas <heikki.linnakangas@iki.fi>
Date:     Tue Jul 07 15:11:28 2026 +0000

    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 f1577e785fa..323a97c69ba 100644 --- a/src/bin/pg_dump/parallel.c +++ b/src/bin/pg_dump/parallel.c @@ -979,6 +979,8 @@ ParallelBackupStart(ArchiveHandle *AH) handle = _beginthreadex(NULL, 0, (void *) &init_spawned_worker_win32, wi, 0, &(slot->threadId)); + if (handle == 0) + fatal("could not create worker thread: %m"); slot->hThread = handle; slot->workerStatus = WRKR_IDLE; #else /* !WIN32 */ [parent: 0115650de937]