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

Commit73fa762

Browse files
committed
Work around portability issue with newer versions of mktime().
Recent glibc versions have made mktime() fail if tm_isdst isinconsistent with the prevailing timezone; in particular it fails fortm_isdst = 1 when the zone is UTC. (This seems wildly inconsistentwith the POSIX-mandated treatment of "incorrect" values for the otherfields of struct tm, so if you ask me it's a bug, but I bet they'llsay it's intentional.) This has been observed to cause cosmeticproblems when pg_restore'ing an archive created in a differenttimezone.To fix, do mktime() using the field values from the archive, and ifthat fails try again with tm_isdst = -1. This will give a resultthat's off by the UTC-offset difference from the original zone, butthat was true before, too. It's not terribly critical since we don'tdo anything with the result except possibly print it. (Someday weshould flush this entire bit of logic and record a standard-formattimestamp in the archive instead. That's not okay for a back-patchedbug fix, though.)Also, guard our only other use of mktime() by having initdb'sbuild_time_t() set tm_isdst = -1 not 0. This case could only havean issue in zones that are DST year-round; but I think some do exist,or could in future.Per report from Wells Oliver. Back-patch to all supportedversions, since any of them might need to run with a newer glibc.Discussion:https://postgr.es/m/CAOC+FBWDhDHO7G-i1_n_hjRzCnUeFO+H-Czi1y10mFhRWpBrew@mail.gmail.com
1 parent8cb3d95 commit73fa762

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

‎src/bin/initdb/findtimezone.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ build_time_t(int year, int month, int day)
195195
tm.tm_mday=day;
196196
tm.tm_mon=month-1;
197197
tm.tm_year=year-1900;
198+
tm.tm_isdst=-1;
198199

199200
returnmktime(&tm);
200201
}

‎src/bin/pg_dump/pg_backup_archiver.c

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3723,7 +3723,6 @@ ReadHead(ArchiveHandle *AH)
37233723
vmin,
37243724
vrev;
37253725
intfmt;
3726-
structtmcrtm;
37273726

37283727
/*
37293728
* If we haven't already read the header, do so.
@@ -3791,6 +3790,8 @@ ReadHead(ArchiveHandle *AH)
37913790

37923791
if (AH->version >=K_VERS_1_4)
37933792
{
3793+
structtmcrtm;
3794+
37943795
crtm.tm_sec=ReadInt(AH);
37953796
crtm.tm_min=ReadInt(AH);
37963797
crtm.tm_hour=ReadInt(AH);
@@ -3799,12 +3800,33 @@ ReadHead(ArchiveHandle *AH)
37993800
crtm.tm_year=ReadInt(AH);
38003801
crtm.tm_isdst=ReadInt(AH);
38013802

3802-
AH->archdbname=ReadStr(AH);
3803-
3803+
/*
3804+
* Newer versions of glibc have mktime() report failure if tm_isdst is
3805+
* inconsistent with the prevailing timezone, e.g. tm_isdst = 1 when
3806+
* TZ=UTC. This is problematic when restoring an archive under a
3807+
* different timezone setting. If we get a failure, try again with
3808+
* tm_isdst set to -1 ("don't know").
3809+
*
3810+
* XXX with or without this hack, we reconstruct createDate
3811+
* incorrectly when the prevailing timezone is different from
3812+
* pg_dump's. Next time we bump the archive version, we should flush
3813+
* this representation and store a plain seconds-since-the-Epoch
3814+
* timestamp instead.
3815+
*/
38043816
AH->createDate=mktime(&crtm);
3805-
38063817
if (AH->createDate== (time_t)-1)
3807-
write_msg(modulename,"WARNING: invalid creation date in header\n");
3818+
{
3819+
crtm.tm_isdst=-1;
3820+
AH->createDate=mktime(&crtm);
3821+
if (AH->createDate== (time_t)-1)
3822+
write_msg(modulename,
3823+
"WARNING: invalid creation date in header\n");
3824+
}
3825+
}
3826+
3827+
if (AH->version >=K_VERS_1_4)
3828+
{
3829+
AH->archdbname=ReadStr(AH);
38083830
}
38093831

38103832
if (AH->version >=K_VERS_1_10)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp