@@ -1959,6 +1959,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
19591959 i ++ ;
19601960 /* A % has been seen and ch is the character after it. */
19611961 PyObject * replacement = NULL ;
1962+ int need_decref_replacement = 0 ;
1963+
19621964 if (ch == 'z' ) {
19631965 /* %z -> +HHMM */
19641966 if (zreplacement == NULL ) {
@@ -2058,22 +2060,11 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
20582060
20592061 PyObject * tmp = make_dash_replacement (object , next_ch , timetuple );
20602062 if (tmp == NULL ) {
2061- Py_DECREF (tmp );
2062- goto Error ;
2063- }
2064-
2065- if (PyUnicodeWriter_WriteSubstring (writer , format , start , end ) < 0 ) {
2066- Py_DECREF (tmp );
2067- goto Error ;
2068- }
2069- start = i ;
2070- if (PyUnicodeWriter_WriteStr (writer , tmp ) < 0 ) {
2071- Py_DECREF (tmp );
20722063 goto Error ;
20732064 }
20742065
2075- Py_DECREF ( tmp ) ;
2076- continue ;
2066+ replacement = tmp ;
2067+ need_decref_replacement = 1 ;
20772068 }
20782069 #endif
20792070 else {
@@ -2083,12 +2074,21 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
20832074 assert (replacement != NULL );
20842075 assert (PyUnicode_Check (replacement ));
20852076 if (PyUnicodeWriter_WriteSubstring (writer , format , start , end ) < 0 ) {
2077+ if (need_decref_replacement ) {
2078+ Py_DECREF (replacement );
2079+ }
20862080 goto Error ;
20872081 }
20882082 start = i ;
20892083 if (PyUnicodeWriter_WriteStr (writer , replacement ) < 0 ) {
2084+ if (need_decref_replacement ) {
2085+ Py_DECREF (replacement );
2086+ }
20902087 goto Error ;
20912088 }
2089+ if (need_decref_replacement ) {
2090+ Py_DECREF (replacement );
2091+ }
20922092 } /* end while() */
20932093
20942094 PyObject * newformat ;
0 commit comments