@@ -1362,21 +1362,26 @@ isoformat_date(PyDateTime_Date *dt, char buffer[], int bufflen)
13621362 x = PyOS_snprintf (buffer , bufflen ,
13631363 "%04d-%02d-%02d" ,
13641364 GET_YEAR (dt ), GET_MONTH (dt ), GET_DAY (dt ));
1365+ assert (bufflen >= x );
13651366 return buffer + x ;
13661367}
13671368
1368- static void
1369+ static char *
13691370isoformat_time (PyDateTime_DateTime * dt , char buffer [], int bufflen )
13701371{
1372+ int x ;
13711373 int us = DATE_GET_MICROSECOND (dt );
13721374
1373- PyOS_snprintf (buffer , bufflen ,
1374- "%02d:%02d:%02d" , /* 8 characters */
1375- DATE_GET_HOUR (dt ),
1376- DATE_GET_MINUTE (dt ),
1377- DATE_GET_SECOND (dt ));
1375+ x = PyOS_snprintf (buffer , bufflen ,
1376+ "%02d:%02d:%02d" ,
1377+ DATE_GET_HOUR (dt ),
1378+ DATE_GET_MINUTE (dt ),
1379+ DATE_GET_SECOND (dt ));
1380+ assert (bufflen >= x );
13781381 if (us )
1379- PyOS_snprintf (buffer + 8 , bufflen - 8 , ".%06d" , us );
1382+ x += PyOS_snprintf (buffer + x , bufflen - x , ".%06d" , us );
1383+ assert (bufflen >= x );
1384+ return buffer + x ;
13801385}
13811386
13821387/* ---------------------------------------------------------------------------
@@ -4211,8 +4216,8 @@ datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)
42114216 cp = isoformat_date ((PyDateTime_Date * )self , buffer , sizeof (buffer ));
42124217 assert (cp != NULL );
42134218 * cp ++ = sep ;
4214- isoformat_time (self , cp , sizeof (buffer ) - (cp - buffer ));
4215- result = PyString_FromString ( buffer );
4219+ cp = isoformat_time (self , cp , sizeof (buffer ) - (cp - buffer ));
4220+ result = PyString_FromStringAndSize ( buffer , cp - buffer );
42164221 if (result == NULL || ! HASTZINFO (self ))
42174222 return result ;
42184223
0 commit comments