Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commita75dfb7

Browse files
committed
Fix failure to honor -Z compression level option in pg_dump -Fd.
cfopen() and cfopen_write() failed to pass the compression level throughto zlib, so that you always got the default compression level if you gotany at all.In passing, also fix these and related functions so that the correct errnois reliably returned on failure; the original coding supposes that free()cannot change errno, which is untrue on at least some platforms.Per bug #12779 from Christoph Berg. Back-patch to 9.1 where the faultycode was introduced.Michael Paquier
1 parenta271c92 commita75dfb7

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

‎src/bin/pg_dump/compress_io.c

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -452,13 +452,25 @@ struct cfp
452452
staticinthasSuffix(constchar*filename,constchar*suffix);
453453
#endif
454454

455+
/* free() without changing errno; useful in several places below */
456+
staticvoid
457+
free_keep_errno(void*p)
458+
{
459+
intsave_errno=errno;
460+
461+
free(p);
462+
errno=save_errno;
463+
}
464+
455465
/*
456466
* Open a file for reading. 'path' is the file to open, and 'mode' should
457467
* be either "r" or "rb".
458468
*
459469
* If the file at 'path' does not exist, we append the ".gz" suffix (if 'path'
460470
* doesn't already have it) and try again. So if you pass "foo" as 'path',
461471
* this will open either "foo" or "foo.gz".
472+
*
473+
* On failure, return NULL with an error code in errno.
462474
*/
463475
cfp*
464476
cfopen_read(constchar*path,constchar*mode)
@@ -479,7 +491,7 @@ cfopen_read(const char *path, const char *mode)
479491

480492
fname=psprintf("%s.gz",path);
481493
fp=cfopen(fname,mode,1);
482-
free(fname);
494+
free_keep_errno(fname);
483495
}
484496
#endif
485497
}
@@ -492,8 +504,10 @@ cfopen_read(const char *path, const char *mode)
492504
* ("w", "wb", "a", or "ab").
493505
*
494506
* If 'compression' is non-zero, a gzip compressed stream is opened, and
495-
*and'compression' indicates the compression level used. The ".gz" suffix
507+
* 'compression' indicates the compression level used. The ".gz" suffix
496508
* is automatically added to 'path' in that case.
509+
*
510+
* On failure, return NULL with an error code in errno.
497511
*/
498512
cfp*
499513
cfopen_write(constchar*path,constchar*mode,intcompression)
@@ -508,8 +522,8 @@ cfopen_write(const char *path, const char *mode, int compression)
508522
char*fname;
509523

510524
fname=psprintf("%s.gz",path);
511-
fp=cfopen(fname,mode,1);
512-
free(fname);
525+
fp=cfopen(fname,mode,compression);
526+
free_keep_errno(fname);
513527
#else
514528
exit_horribly(modulename,"not built with zlib support\n");
515529
fp=NULL;/* keep compiler quiet */
@@ -520,7 +534,9 @@ cfopen_write(const char *path, const char *mode, int compression)
520534

521535
/*
522536
* Opens file 'path' in 'mode'. If 'compression' is non-zero, the file
523-
* is opened with libz gzopen(), otherwise with plain fopen()
537+
* is opened with libz gzopen(), otherwise with plain fopen().
538+
*
539+
* On failure, return NULL with an error code in errno.
524540
*/
525541
cfp*
526542
cfopen(constchar*path,constchar*mode,intcompression)
@@ -530,11 +546,15 @@ cfopen(const char *path, const char *mode, int compression)
530546
if (compression!=0)
531547
{
532548
#ifdefHAVE_LIBZ
533-
fp->compressedfp=gzopen(path,mode);
549+
charmode_compression[32];
550+
551+
snprintf(mode_compression,sizeof(mode_compression),"%s%d",
552+
mode,compression);
553+
fp->compressedfp=gzopen(path,mode_compression);
534554
fp->uncompressedfp=NULL;
535555
if (fp->compressedfp==NULL)
536556
{
537-
free(fp);
557+
free_keep_errno(fp);
538558
fp=NULL;
539559
}
540560
#else
@@ -549,7 +569,7 @@ cfopen(const char *path, const char *mode, int compression)
549569
fp->uncompressedfp=fopen(path,mode);
550570
if (fp->uncompressedfp==NULL)
551571
{
552-
free(fp);
572+
free_keep_errno(fp);
553573
fp=NULL;
554574
}
555575
}
@@ -658,7 +678,7 @@ cfclose(cfp *fp)
658678
result=fclose(fp->uncompressedfp);
659679
fp->uncompressedfp=NULL;
660680
}
661-
free(fp);
681+
free_keep_errno(fp);
662682

663683
returnresult;
664684
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp