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

Appearance settings

Commit 3dfef0c

Browse filesBrowse files
committed
Avoid statically allocating gmtsub()'s timezone workspace.
localtime.c's "struct state" is a rather large object, ~23KB. We were statically allocating one for gmtsub() to use to represent the GMT timezone, even though that function is not at all heavily used and is never reached in most backends. Let's malloc it on-demand, instead. This does pose the question of how to handle a malloc failure, but there's already a well-defined error report convention here, ie set errno and return NULL. We have but one caller of pg_gmtime in HEAD, and two in back branches, neither of which were troubling to check for error. Make them do so. The possible errors are sufficiently unlikely (out-of-range timestamp, and now malloc failure) that I think elog() is adequate. Back-patch to all supported branches to keep our copies of the IANA timezone code in sync. This particular change is in a stanza that already differs from upstream, so it's a wash for maintenance purposes --- but only as long as we keep the branches the same. Discussion: https://postgr.es/m/20181015200754.7y7zfuzsoux2c4ya@alap3.anarazel.de
1 parent 62649ba commit 3dfef0c
Copy full SHA for 3dfef0c

File tree

Expand file treeCollapse file tree

2 files changed

+9
-5
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+9
-5
lines changed

‎src/backend/utils/adt/timestamp.c

Copy file name to clipboardExpand all lines: src/backend/utils/adt/timestamp.c
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,6 +2008,9 @@ GetEpochTime(struct pg_tm *tm)
20082008

20092009
t0 = pg_gmtime(&epoch);
20102010

2011+
if (t0 == NULL)
2012+
elog(ERROR, "could not convert epoch to timestamp: %m");
2013+
20112014
tm->tm_year = t0->tm_year;
20122015
tm->tm_mon = t0->tm_mon;
20132016
tm->tm_mday = t0->tm_mday;

‎src/timezone/localtime.c

Copy file name to clipboardExpand all lines: src/timezone/localtime.c
+6-5Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1328,13 +1328,14 @@ gmtsub(pg_time_t const *timep, int32 offset, struct pg_tm *tmp)
13281328
struct pg_tm *result;
13291329

13301330
/* GMT timezone state data is kept here */
1331-
static struct state gmtmem;
1332-
static bool gmt_is_set = false;
1333-
#define gmtptr (&gmtmem)
1331+
static struct state *gmtptr = NULL;
13341332

1335-
if (!gmt_is_set)
1333+
if (gmtptr == NULL)
13361334
{
1337-
gmt_is_set = true;
1335+
/* Allocate on first use */
1336+
gmtptr = (struct state *) malloc(sizeof(struct state));
1337+
if (gmtptr == NULL)
1338+
return NULL; /* errno should be set by malloc */
13381339
gmtload(gmtptr);
13391340
}
13401341
result = timesub(timep, offset, gmtptr, tmp);

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.