Restore use of zlib default compression in pg_dump directory mode.
authorAndrew Dunstan
Sat, 25 Jul 2015 21:14:36 +0000 (17:14 -0400)
committerAndrew Dunstan
Sat, 25 Jul 2015 21:15:48 +0000 (17:15 -0400)
This was broken by commit 0e7e355f27302b62af3e1add93853ccd45678443 and
friends, which ignored the fact that gzopen() will treat "-1" in the
mode argument as an invalid character, which it ignores, and a flag for
compression level 1. Now, when this value is encountered no compression
level flag is passed  to gzopen, leaving it to use the zlib default.

Also, enforce the documented allowed range for pg_dump's -Z option,
namely 0 .. 9, and remove some consequently dead code from
pg_backup_tar.c.

Problem reported by Marc Mamin.

Backpatch to 9.1, like the patch that introduced the bug.

src/bin/pg_dump/compress_io.c
src/bin/pg_dump/pg_backup_tar.c
src/bin/pg_dump/pg_dump.c

index ffced11a02e1001d7abfae006b1dd6b1b4cced3b..9511313dd6ef7652395f886640d5ca03ca8636a9 100644 (file)
@@ -546,11 +546,21 @@ cfopen(const char *path, const char *mode, int compression)
    if (compression != 0)
    {
 #ifdef HAVE_LIBZ
-       char        mode_compression[32];
+       if (compression != Z_DEFAULT_COMPRESSION)
+       {
+           /* user has specified a compression level, so tell zlib to use it */
+           char        mode_compression[32];
+
+           snprintf(mode_compression, sizeof(mode_compression), "%s%d",
+                    mode, compression);
+           fp->compressedfp = gzopen(path, mode_compression);
+       }
+       else
+       {
+           /* don't specify a level, just use the zlib default */
+           fp->compressedfp = gzopen(path, mode);
+       }
 
-       snprintf(mode_compression, sizeof(mode_compression), "%s%d",
-                mode, compression);
-       fp->compressedfp = gzopen(path, mode_compression);
        fp->uncompressedfp = NULL;
        if (fp->compressedfp == NULL)
        {
index 457b742fa487d1b5cb2068a0e8a9d3c70a82e1b0..d6e78ceb1f13740e53c92e7742b14c5008e95489 100644 (file)
@@ -209,13 +209,6 @@ InitArchiveFmt_Tar(ArchiveHandle *AH)
 
        ctx->hasSeek = checkSeek(ctx->tarFH);
 
-       if (AH->compression < 0 || AH->compression > 9)
-           AH->compression = Z_DEFAULT_COMPRESSION;
-
-       /* Don't compress into tar files unless asked to do so */
-       if (AH->compression == Z_DEFAULT_COMPRESSION)
-           AH->compression = 0;
-
        /*
         * We don't support compression because reading the files back is not
         * possible since gzdopen uses buffered IO which totally screws file
index 8dbfaff767464bcf5816850f17bd0141ebac8c1c..0516bda21d2b7e134f67592ffdd5222b3fc9e3d4 100644 (file)
@@ -513,6 +513,11 @@ main(int argc, char **argv)
 
            case 'Z':           /* Compression Level */
                compressLevel = atoi(optarg);
+               if (compressLevel < 0 || compressLevel > 9)
+               {
+                   write_msg(NULL, "compression level must be in range 0..9\n");
+                   exit_nicely(1);
+               }
                break;
 
            case 0: