postgres.git / summary / log / commit / refs

commit    4eaceec97ae2add49413918dc6ed9383fc6680b1
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 a09247fae47..f8680474775 100644 --- a/src/bin/pg_dump/parallel.c +++ b/src/bin/pg_dump/parallel.c @@ -974,6 +974,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: be63b285e500]