◐ Shell
clean mode source ↗

bpo-34672: Try to pass the C library's own timezone strings back to it. by benjaminp · Pull Request #9288 · python/cpython

Expand Up @@ -523,6 +523,10 @@ time_localtime(PyObject *self, PyObject *args) #endif }
#if defined(__linux__) && !defined(__GLIBC__) static const char *utc_string = NULL; #endif
PyDoc_STRVAR(localtime_doc, "localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\ tm_sec,tm_wday,tm_yday,tm_isdst)\n\ Expand Down Expand Up @@ -565,11 +569,32 @@ gettmarg(PyObject *args, struct tm *p, const char *format) if (Py_TYPE(args) == &StructTimeType) { PyObject *item; item = PyTuple_GET_ITEM(args, 9); p->tm_zone = item == Py_None ? NULL : (char*)PyUnicode_AsUTF8(item); if (item != Py_None) { p->tm_zone = PyUnicode_AsUTF8(item); if (p->tm_zone == NULL) { return 0; } #if defined(__linux__) && !defined(__GLIBC__) // Make an attempt to return the C library's own timezone strings to // it. musl refuses to process a tm_zone field unless it produced // it. See issue #34672. if (utc_string && strcmp(p->tm_zone, utc_string) == 0) { p->tm_zone = utc_string; } else if (tzname[0] && strcmp(p->tm_zone, tzname[0]) == 0) { p->tm_zone = tzname[0]; } else if (tzname[1] && strcmp(p->tm_zone, tzname[1]) == 0) { p->tm_zone = tzname[1]; } #endif } item = PyTuple_GET_ITEM(args, 10); p->tm_gmtoff = item == Py_None ? 0 : PyLong_AsLong(item); if (PyErr_Occurred()) return 0; if (item != Py_None) { p->tm_gmtoff = PyLong_AsLong(item); if (PyErr_Occurred()) return 0; } } #endif /* HAVE_STRUCT_TM_TM_ZONE */ return 1; Expand Down Expand Up @@ -1736,6 +1761,13 @@ PyInit_time(void) PyModule_AddIntConstant(m, "_STRUCT_TM_ITEMS", 11); PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType); initialized = 1;
#if defined(__linux__) && !defined(__GLIBC__) struct tm tm; if (gmtime_r(0, &tm) != NULL) utc_string = tm.tm_zone; #endif
return m; }
Expand Down