]> granicus.if.org Git - python/commitdiff
Fix problem spotted by Coverity that occurs if tzinfo.tzname().replace()
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 20 Mar 2006 01:58:39 +0000 (01:58 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 20 Mar 2006 01:58:39 +0000 (01:58 +0000)
returns a non-string when converting %Z.

Will backport.

Lib/test/test_datetime.py
Modules/datetimemodule.c

index 27f42c67902e535d54c91e21440f15a6f54abb09..2528b4a0299b8372b35e2bd2ebec7e7e0e393638 100644 (file)
@@ -1168,6 +1168,17 @@ class TestDateTime(TestDate):
         self.assertEqual(dt2 - dt1, us)
         self.assert_(dt1 < dt2)
 
+    def test_strftime_with_bad_tzname_replace(self):
+        # verify ok if tzinfo.tzname().replace() returns a non-string
+        class MyTzInfo(FixedOffset):
+            def tzname(self, dt):
+                class MyStr(str):
+                    def replace(self, *args):
+                        return None
+                return MyStr('name')
+        t = self.theclass(2005, 3, 2, 0, 0, 0, 0, MyTzInfo(3, 'name'))
+        self.assertRaises(TypeError, t.strftime, '%Z')
+
     def test_bad_constructor_arguments(self):
         # bad years
         self.theclass(MINYEAR, 1, 1)  # no exception
index 199ee654f8c4ae5704d4881c8b575d06e6e71ad4..68231101858790ad9217a7480da1c9c8b4432cff 100644 (file)
@@ -1228,8 +1228,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
                                }
                        }
                        assert(zreplacement != NULL);
-                       ptoappend = PyString_AsString(zreplacement);
-                       ntoappend = PyString_Size(zreplacement);
+                       ptoappend = PyString_AS_STRING(zreplacement);
+                       ntoappend = PyString_GET_SIZE(zreplacement);
                }
                else if (ch == 'Z') {
                        /* format tzname */
@@ -1257,14 +1257,18 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
                                                Py_DECREF(temp);
                                                if (Zreplacement == NULL)
                                                        goto Done;
+                                               if (!PyString_Check(Zreplacement)) {
+                                                       PyErr_SetString(PyExc_TypeError, "tzname.replace() did not return a string");
+                                                       goto Done;
+                                               }
                                        }
                                        else
                                                Py_DECREF(temp);
                                }
                        }
                        assert(Zreplacement != NULL);
-                       ptoappend = PyString_AsString(Zreplacement);
-                       ntoappend = PyString_Size(Zreplacement);
+                       ptoappend = PyString_AS_STRING(Zreplacement);
+                       ntoappend = PyString_GET_SIZE(Zreplacement);
                }
                else {
                        /* percent followed by neither z nor Z */
@@ -1275,6 +1279,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
                /* Append the ntoappend chars starting at ptoappend to
                 * the new format.
                 */
+               assert(ptoappend != NULL);
                assert(ntoappend >= 0);
                if (ntoappend == 0)
                        continue;