@@ -6477,9 +6477,9 @@ static PyMethodDef module_methods[] = {
6477
6477
* Clients get at C API via PyDateTime_IMPORT, defined in datetime.h.
6478
6478
*/
6479
6479
static inline PyDateTime_CAPI *
6480
- get_datetime_capi ()
6480
+ get_datetime_capi (void )
6481
6481
{
6482
- PyDateTime_CAPI * capi = PyMem_Calloc ( 1 , sizeof (PyDateTime_CAPI ));
6482
+ PyDateTime_CAPI * capi = PyMem_Malloc ( sizeof (PyDateTime_CAPI ));
6483
6483
if (capi == NULL ) {
6484
6484
PyErr_NoMemory ();
6485
6485
return NULL ;
@@ -6498,6 +6498,10 @@ get_datetime_capi()
6498
6498
capi -> Date_FromTimestamp = datetime_date_fromtimestamp_capi ;
6499
6499
capi -> DateTime_FromDateAndTimeAndFold = new_datetime_ex2 ;
6500
6500
capi -> Time_FromTimeAndFold = new_time_ex2 ;
6501
+ // Make sure this function is called after PyDateTime_TimeZone_UTC has
6502
+ // been initialized.
6503
+ assert (PyDateTime_TimeZone_UTC != NULL );
6504
+ capi -> TimeZone_UTC = PyDateTime_TimeZone_UTC ; // borrowed ref
6501
6505
return capi ;
6502
6506
}
6503
6507
@@ -6511,11 +6515,6 @@ datetime_destructor(PyObject *op)
6511
6515
static int
6512
6516
_datetime_exec (PyObject * module )
6513
6517
{
6514
- PyDateTime_CAPI * CAPI = get_datetime_capi ();
6515
- if (CAPI == NULL ) {
6516
- return -1 ;
6517
- }
6518
-
6519
6518
// `&...` is not a constant expression according to a strict reading
6520
6519
// of C standards. Fill tp_base at run-time rather than statically.
6521
6520
// See https://bugs.python.org/issue40777
@@ -6600,13 +6599,17 @@ _datetime_exec(PyObject *module)
6600
6599
}
6601
6600
6602
6601
PyDateTime_TimeZone_UTC = x ;
6603
- CAPI -> TimeZone_UTC = PyDateTime_TimeZone_UTC ;
6602
+ PyDateTime_CAPI * capi = get_datetime_capi ();
6603
+ if (capi == NULL ) {
6604
+ return -1 ;
6605
+ }
6604
6606
6605
6607
/* bpo-37642: These attributes are rounded to the nearest minute for backwards
6606
6608
* compatibility, even though the constructor will accept a wider range of
6607
6609
* values. This may change in the future.*/
6608
6610
delta = new_delta (-1 , 60 , 0 , 1 ); /* -23:59 */
6609
6611
if (delta == NULL ) {
6612
+ PyMem_Free (capi );
6610
6613
return -1 ;
6611
6614
}
6612
6615
@@ -6616,6 +6619,7 @@ _datetime_exec(PyObject *module)
6616
6619
6617
6620
delta = new_delta (0 , (23 * 60 + 59 ) * 60 , 0 , 0 ); /* +23:59 */
6618
6621
if (delta == NULL ) {
6622
+ PyMem_Free (capi );
6619
6623
return -1 ;
6620
6624
}
6621
6625
@@ -6627,25 +6631,29 @@ _datetime_exec(PyObject *module)
6627
6631
PyDateTime_Epoch = new_datetime (1970 , 1 , 1 , 0 , 0 , 0 , 0 ,
6628
6632
PyDateTime_TimeZone_UTC , 0 );
6629
6633
if (PyDateTime_Epoch == NULL ) {
6634
+ PyMem_Free (capi );
6630
6635
return -1 ;
6631
6636
}
6632
6637
6633
6638
/* module initialization */
6634
6639
if (PyModule_AddIntMacro (module , MINYEAR ) < 0 ) {
6640
+ PyMem_Free (capi );
6635
6641
return -1 ;
6636
6642
}
6637
6643
if (PyModule_AddIntMacro (module , MAXYEAR ) < 0 ) {
6644
+ PyMem_Free (capi );
6638
6645
return -1 ;
6639
6646
}
6640
6647
6641
- x = PyCapsule_New (CAPI , PyDateTime_CAPSULE_NAME , datetime_destructor );
6648
+ x = PyCapsule_New (capi , PyDateTime_CAPSULE_NAME , datetime_destructor );
6642
6649
if (x == NULL ) {
6643
- PyMem_Free (CAPI );
6650
+ PyMem_Free (capi );
6644
6651
return -1 ;
6645
6652
}
6646
6653
6647
6654
if (PyModule_AddObject (module , "datetime_CAPI" , x ) < 0 ) {
6648
6655
Py_DECREF (x );
6656
+ PyMem_Free (capi );
6649
6657
return -1 ;
6650
6658
}
6651
6659
@@ -6673,6 +6681,7 @@ _datetime_exec(PyObject *module)
6673
6681
seconds_per_day = PyLong_FromLong (24 * 3600 );
6674
6682
if (us_per_ms == NULL || us_per_second == NULL ||
6675
6683
us_per_minute == NULL || seconds_per_day == NULL ) {
6684
+ PyMem_Free (capi );
6676
6685
return -1 ;
6677
6686
}
6678
6687
@@ -6683,6 +6692,7 @@ _datetime_exec(PyObject *module)
6683
6692
us_per_day = PyLong_FromDouble (86400000000.0 );
6684
6693
us_per_week = PyLong_FromDouble (604800000000.0 );
6685
6694
if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL ) {
6695
+ PyMem_Free (capi );
6686
6696
return -1 ;
6687
6697
}
6688
6698
return 0 ;
0 commit comments