postgres.git / summary / log / commit / refs

commit    dbd1a06c97f5a2f0c13b05cee1d1ca292ed77f7f
Author:   Michael Paquier <michael@paquier.xyz>
Date:     Thu Sep 07 05:12:36 2023 +0000
First released in: 17.0, 11.22, 12.17, 13.13, 14.10, 15.5, 16.0

    pg_basebackup: Generate valid temporary slot names under PQbackendPID()
    
    pgbouncer can cause PQbackendPID() to return negative values due to it
    filling be_pid with random bytes (even these days pid_max can only be
    set up to 2^22 on 64b machines on Linux, for example, so this cannot
    happen with normal PID numbers).  When this happens, pg_basebackup may
    generate a temporary slot name that may not be accepted by the parser,
    leading to spurious failures, like:
    pg_basebackup: error: could not send replication command
    ERROR:  replication slot name "pg_basebackup_-1201966863" contains
    invalid character
    
    This commit fixes that problem by formatting the result from
    PQbackendPID() as an unsigned integer when creating the temporary
    replication slot name, so as the invalid character is gone and the
    command can be parsed.
    
    Author: Jelte Fennema
    Reviewed-by: Daniel Gustafsson, Nishant Sharma
    Discussion: https://postgr.es/m/CAGECzQQOGvYfp8ziF4fWQ_o8s2K7ppaoWBQnTmdakn3s-4Z=5g@mail.gmail.com
    Backpatch-through: 11


src/bin/pg_basebackup/pg_basebackup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index af2575a58b1..401d1a415f6 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -612,7 +612,8 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier) * Create replication slot if requested */ if (temp_replication_slot && !replication_slot) - replication_slot = psprintf("pg_basebackup_%d", (int) PQbackendPID(param->bgconn)); + replication_slot = psprintf("pg_basebackup_%u", + (unsigned int) PQbackendPID(param->bgconn)); if (temp_replication_slot || create_slot) { if (!CreateReplicationSlot(param->bgconn, replication_slot, NULL, [parent: 69e22dd38faf]