]> granicus.if.org Git - python/commitdiff
bpo-29240: Ignore UTF-8 Mode in time module (#5148)
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 11 Jan 2018 09:37:59 +0000 (10:37 +0100)
committerGitHub <noreply@github.com>
Thu, 11 Jan 2018 09:37:59 +0000 (10:37 +0100)
time.strftime() must use the current LC_CTYPE encoding, not UTF-8
if the UTF-8 mode is enabled.

Add _PyUnicode_DecodeCurrentLocale() function.

Include/unicodeobject.h
Modules/readline.c
Modules/timemodule.c
Objects/unicodeobject.c

index 576e7ad8510c5073039d75e080c5729582d1d1a1..d263026b56230862b708a6c3f88ed16390ae957b 100644 (file)
@@ -1811,6 +1811,10 @@ PyAPI_FUNC(PyObject*) PyUnicode_EncodeLocale(
     const char *errors
     );
 
+PyAPI_FUNC(PyObject*) _PyUnicode_DecodeCurrentLocale(
+    const char *str,
+    const char *errors);
+
 PyAPI_FUNC(PyObject*) _PyUnicode_DecodeCurrentLocaleAndSize(
     const char *str,
     Py_ssize_t len,
index 8db4cfd01524a33c77e4142537c758dd8b2addd9..caf661c81d4a420b043e343e6a227932cf5d19e2 100644 (file)
@@ -138,8 +138,7 @@ encode(PyObject *b)
 static PyObject *
 decode(const char *s)
 {
-    return _PyUnicode_DecodeCurrentLocaleAndSize(s, strlen(s),
-                                                 "surrogateescape");
+    return _PyUnicode_DecodeCurrentLocale(s, "surrogateescape");
 }
 
 
index 5cae03dd416ef7f0807116be84d8d699363724bd..4e7f9d9482e6069f33ac7f3694bc2d58fce4aa61 100644 (file)
@@ -418,11 +418,11 @@ tmtotuple(struct tm *p
     SET(8, p->tm_isdst);
 #ifdef HAVE_STRUCT_TM_TM_ZONE
     PyStructSequence_SET_ITEM(v, 9,
-        PyUnicode_DecodeLocale(p->tm_zone, "surrogateescape"));
+        _PyUnicode_DecodeCurrentLocale(p->tm_zone, "surrogateescape"));
     SET(10, p->tm_gmtoff);
 #else
     PyStructSequence_SET_ITEM(v, 9,
-        PyUnicode_DecodeLocale(zone, "surrogateescape"));
+        _PyUnicode_DecodeCurrentLocale(zone, "surrogateescape"));
     PyStructSequence_SET_ITEM(v, 10, _PyLong_FromTime_t(gmtoff));
 #endif /* HAVE_STRUCT_TM_TM_ZONE */
 #undef SET
@@ -809,8 +809,8 @@ time_strftime(PyObject *self, PyObject *args)
 #ifdef HAVE_WCSFTIME
             ret = PyUnicode_FromWideChar(outbuf, buflen);
 #else
-            ret = PyUnicode_DecodeLocaleAndSize(outbuf, buflen,
-                                                "surrogateescape");
+            ret = _PyUnicode_DecodeCurrentLocaleAndSize(outbuf, buflen,
+                                                        "surrogateescape");
 #endif
             PyMem_Free(outbuf);
             break;
@@ -1541,8 +1541,8 @@ PyInit_timezone(PyObject *m) {
     PyModule_AddIntConstant(m, "altzone", timezone-3600);
 #endif
     PyModule_AddIntConstant(m, "daylight", daylight);
-    otz0 = PyUnicode_DecodeLocale(tzname[0], "surrogateescape");
-    otz1 = PyUnicode_DecodeLocale(tzname[1], "surrogateescape");
+    otz0 = _PyUnicode_DecodeCurrentLocale(tzname[0], "surrogateescape");
+    otz1 = _PyUnicode_DecodeCurrentLocale(tzname[1], "surrogateescape");
     PyModule_AddObject(m, "tzname", Py_BuildValue("(NN)", otz0, otz1));
 #else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/
     {
index 1a230e03e639c9e0bfaad63e6a3e30efcd089b08..a6e02f478b1f764cdcdc29ad83a5e6a8ddc8bdf8 100644 (file)
@@ -3836,6 +3836,12 @@ _PyUnicode_DecodeCurrentLocaleAndSize(const char *str, Py_ssize_t len,
     return unicode_decode_locale(str, len, errors, 1);
 }
 
+PyObject*
+_PyUnicode_DecodeCurrentLocale(const char *str, const char *errors)
+{
+    return unicode_decode_locale(str, (Py_ssize_t)strlen(str), errors, 1);
+}
+
 PyObject*
 PyUnicode_DecodeLocale(const char *str, const char *errors)
 {