@@ -1959,6 +1959,8 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
1959
1959
i ++ ;
1960
1960
/* A % has been seen and ch is the character after it. */
1961
1961
PyObject * replacement = NULL ;
1962
+ int need_decref_replacement = 0 ;
1963
+
1962
1964
if (ch == 'z' ) {
1963
1965
/* %z -> +HHMM */
1964
1966
if (zreplacement == NULL ) {
@@ -2058,22 +2060,11 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
2058
2060
2059
2061
PyObject * tmp = make_dash_replacement (object , next_ch , timetuple );
2060
2062
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 );
2072
2063
goto Error ;
2073
2064
}
2074
2065
2075
- Py_DECREF ( tmp ) ;
2076
- continue ;
2066
+ replacement = tmp ;
2067
+ need_decref_replacement = 1 ;
2077
2068
}
2078
2069
#endif
2079
2070
else {
@@ -2083,12 +2074,21 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
2083
2074
assert (replacement != NULL );
2084
2075
assert (PyUnicode_Check (replacement ));
2085
2076
if (PyUnicodeWriter_WriteSubstring (writer , format , start , end ) < 0 ) {
2077
+ if (need_decref_replacement ) {
2078
+ Py_DECREF (replacement );
2079
+ }
2086
2080
goto Error ;
2087
2081
}
2088
2082
start = i ;
2089
2083
if (PyUnicodeWriter_WriteStr (writer , replacement ) < 0 ) {
2084
+ if (need_decref_replacement ) {
2085
+ Py_DECREF (replacement );
2086
+ }
2090
2087
goto Error ;
2091
2088
}
2089
+ if (need_decref_replacement ) {
2090
+ Py_DECREF (replacement );
2091
+ }
2092
2092
} /* end while() */
2093
2093
2094
2094
PyObject * newformat ;
0 commit comments