From: Heikki Linnakangas Date: Mon, 4 Nov 2013 08:51:37 +0000 (+0200) Subject: Fix parsing of xlog file name in pg_receivexlog. X-Git-Tag: REL9_3_2~56 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e843d12ebc6cfea9704eca5da62a78ac34ad2602;p=postgresql Fix parsing of xlog file name in pg_receivexlog. The parsing of WAL filenames of segments larger than > 255 was broken, making pg_receivexlog unable to restart streaming after stopping it. The bug was introduced by the changes in 9.3 to represent WAL segment number as a 64-bit integer instead of two ints, log and seg. To fix, replace the plain sscanf call with XLogFromFileName macro, which does the conversion from log+seg to a 64-bit integer correcly. Reported by Mika Eloranta. --- diff --git a/src/bin/pg_basebackup/pg_receivexlog.c b/src/bin/pg_basebackup/pg_receivexlog.c index 031ec1aa97..252a7e08d6 100644 --- a/src/bin/pg_basebackup/pg_receivexlog.c +++ b/src/bin/pg_basebackup/pg_receivexlog.c @@ -134,8 +134,6 @@ FindStreamingStart(uint32 *tli) while ((dirent = readdir(dir)) != NULL) { uint32 tli; - unsigned int log, - seg; XLogSegNo segno; bool ispartial; @@ -164,14 +162,7 @@ FindStreamingStart(uint32 *tli) /* * Looks like an xlog file. Parse its position. */ - if (sscanf(dirent->d_name, "%08X%08X%08X", &tli, &log, &seg) != 3) - { - fprintf(stderr, - _("%s: could not parse transaction log file name \"%s\"\n"), - progname, dirent->d_name); - disconnect_and_exit(1); - } - segno = ((uint64) log) << 32 | seg; + XLogFromFileName(dirent->d_name, &tli, &segno); /* * Check that the segment has the right size, if it's supposed to be