summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2022-05-31 18:47:44 +0000
committerTom Lane2022-05-31 18:47:44 +0000
commit16c80e7d0cdad933103968aec7cd024bca5274c0 (patch)
treef3ba33f4a4f9d6061d63fc9205672ae8a3cc60b7
parentc03b7f52607f20e8b49e662927ba5810d49f3427 (diff)
Ensure ParseTzFile() closes the input file after failing.
We hadn't noticed this because (a) few people feed invalid timezone abbreviation files to the server, and (b) in typical scenarios guc.c would throw ereport(ERROR) and then transaction abort handling would silently clean up the leaked file reference. However, it was possible to observe file leakage warnings if one breaks an already-active abbreviation file, because guc.c does not throw ERROR when loading supposedly-validated settings during session start or SIGHUP processing. Report and fix by Kyotaro Horiguchi (cosmetic adjustments by me) Discussion: https://postgr.es/m/[email protected]
-rw-r--r--src/backend/utils/misc/tzparser.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/backend/utils/misc/tzparser.c b/src/backend/utils/misc/tzparser.c
index a69cb2d2682..8f2c95f0550 100644
--- a/src/backend/utils/misc/tzparser.c
+++ b/src/backend/utils/misc/tzparser.c
@@ -364,7 +364,8 @@ ParseTzFile(const char *filename, int depth,
{
GUC_check_errmsg("could not read time zone file \"%s\": %m",
filename);
- return -1;
+ n = -1;
+ break;
}
/* else we're at EOF after all */
break;
@@ -374,7 +375,8 @@ ParseTzFile(const char *filename, int depth,
/* the line is too long for tzbuf */
GUC_check_errmsg("line is too long in time zone file \"%s\", line %d",
filename, lineno);
- return -1;
+ n = -1;
+ break;
}
/* skip over whitespace */
@@ -397,12 +399,13 @@ ParseTzFile(const char *filename, int depth,
{
GUC_check_errmsg("@INCLUDE without file name in time zone file \"%s\", line %d",
filename, lineno);
- return -1;
+ n = -1;
+ break;
}
n = ParseTzFile(includeFile, depth + 1,
base, arraysize, n);
if (n < 0)
- return -1;
+ break;
continue;
}
@@ -413,12 +416,18 @@ ParseTzFile(const char *filename, int depth,
}
if (!splitTzLine(filename, lineno, line, &tzentry))
- return -1;
+ {
+ n = -1;
+ break;
+ }
if (!validateTzEntry(&tzentry))
- return -1;
+ {
+ n = -1;
+ break;
+ }
n = addToArray(base, arraysize, n, &tzentry, override);
if (n < 0)
- return -1;
+ break;
}
FreeFile(tzFile);