Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Restore use of zlib default compression in pg_dump directory mode.
authorAndrew Dunstan <andrew@dunslane.net>
Sat, 25 Jul 2015 21:14:36 +0000 (17:14 -0400)
committerAndrew Dunstan <andrew@dunslane.net>
Sat, 25 Jul 2015 21:16:39 +0000 (17:16 -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 c6652727a752f97660240fa47efb2bbaebb562da..315dd03a4a10e2edacb83a8585d084b715518287 100644 (file)
@@ -572,11 +572,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 09fad7e095b2306418409a24457325d1a12de0b4..bd2ba7add956a8f1e52ba7fd69d8feb9c22c2619 100644 (file)
@@ -202,13 +202,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 79dfee42df647906d6ae4b8e3d73f5106f6ecf83..69ca956c43b67ac7f510701a210ade985c2ed815 100644 (file)
@@ -474,6 +474,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: