Fix a dangling pointer and reference leak in `local_timezone_from_timestamp` (#156598)
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index ec71a89..9a771cd 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -6761,6 +6761,9 @@ local_timezone_from_timestamp(time_t timestamp)
struct tm local_time_tm;
PyObject *nameo = NULL;
const char *zone = NULL;
+#ifndef HAVE_STRUCT_TM_TM_ZONE
+ char buf[100]; // for zone, which is used after the block below
+#endif
if (_PyTime_localtime(timestamp, &local_time_tm) != 0)
return NULL;
@@ -6771,9 +6774,9 @@ local_timezone_from_timestamp(time_t timestamp)
{
PyObject *local_time, *utc_time;
struct tm utc_time_tm;
- char buf[100];
- strftime(buf, sizeof(buf), "%Z", &local_time_tm);
- zone = buf;
+ if (strftime(buf, sizeof(buf), "%Z", &local_time_tm) != 0) {
+ zone = buf;
+ }
local_time = new_datetime(local_time_tm.tm_year + 1900,
local_time_tm.tm_mon + 1,
local_time_tm.tm_mday,
@@ -6783,8 +6786,10 @@ local_timezone_from_timestamp(time_t timestamp)
if (local_time == NULL) {
return NULL;
}
- if (_PyTime_gmtime(timestamp, &utc_time_tm) != 0)
+ if (_PyTime_gmtime(timestamp, &utc_time_tm) != 0) {
+ Py_DECREF(local_time);
return NULL;
+ }
utc_time = new_datetime(utc_time_tm.tm_year + 1900,
utc_time_tm.tm_mon + 1,
utc_time_tm.tm_mday,