]> granicus.if.org Git - postgresql/commitdiff
Fix parsing of xlog file name in pg_receivexlog.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 4 Nov 2013 08:51:37 +0000 (10:51 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 4 Nov 2013 08:59:02 +0000 (10:59 +0200)
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.

src/bin/pg_basebackup/pg_receivexlog.c

index 031ec1aa97ce8f621fede20bf99e29b889848eea..252a7e08d6727e9e3aa08cf1fc3eb7e925638104 100644 (file)
@@ -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