@@ -1805,27 +1805,42 @@ delta_str(PyDateTime_Delta *self)
18051805 int us = GET_TD_MICROSECONDS (self );
18061806 int hours ;
18071807 int minutes ;
1808- char buf [500 ];
1809- int i = 0 ;
1808+ char buf [100 ];
1809+ char * pbuf = buf ;
1810+ size_t buflen = sizeof (buf );
1811+ int n ;
18101812
18111813 minutes = divmod (seconds , 60 , & seconds );
18121814 hours = divmod (minutes , 60 , & minutes );
18131815
18141816 if (days ) {
1815- i += sprintf (buf + i , "%d day%s, " , days ,
1816- (days == 1 || days == -1 ) ? "" : "s" );
1817- assert (i < sizeof (buf ));
1817+ n = PyOS_snprintf (pbuf , buflen , "%d day%s, " , days ,
1818+ (days == 1 || days == -1 ) ? "" : "s" );
1819+ if (n < 0 || (size_t )n >= buflen )
1820+ goto Fail ;
1821+ pbuf += n ;
1822+ buflen -= (size_t )n ;
18181823 }
18191824
1820- i += sprintf (buf + i , "%d:%02d:%02d" , hours , minutes , seconds );
1821- assert (i < sizeof (buf ));
1825+ n = PyOS_snprintf (pbuf , buflen , "%d:%02d:%02d" ,
1826+ hours , minutes , seconds );
1827+ if (n < 0 || (size_t )n >= buflen )
1828+ goto Fail ;
1829+ pbuf += n ;
1830+ buflen -= (size_t )n ;
18221831
18231832 if (us ) {
1824- i += sprintf (buf + i , ".%06d" , us );
1825- assert (i < sizeof (buf ));
1833+ n = PyOS_snprintf (pbuf , buflen , ".%06d" , us );
1834+ if (n < 0 || (size_t )n >= buflen )
1835+ goto Fail ;
1836+ pbuf += n ;
18261837 }
18271838
1828- return PyString_FromStringAndSize (buf , i );
1839+ return PyString_FromStringAndSize (buf , pbuf - buf );
1840+
1841+ Fail :
1842+ PyErr_SetString (PyExc_SystemError , "goofy result from PyOS_snprintf" );
1843+ return NULL ;
18291844}
18301845
18311846/* Pickle support. Quite a maze! While __getstate__/__setstate__ sufficed
0 commit comments