Skip to content

Commit 9bfe0e7

Browse files
Fix more leaks.
1 parent 3387f58 commit 9bfe0e7

13 files changed

+339
-349
lines changed

Modules/_csv.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1642,7 +1642,7 @@ PyInit__csv(void)
16421642
/* Add version to the module. */
16431643
if (PyModule_AddStringConstant(module, "__version__",
16441644
MODULE_VERSION) == -1)
1645-
return NULL;
1645+
goto error;
16461646

16471647
/* Set the field limit */
16481648
get_csv_state(module)->field_limit = 128 * 1024;
@@ -1652,24 +1652,28 @@ PyInit__csv(void)
16521652
get_csv_state(module)->dialects = PyDict_New();
16531653
Py_XINCREF(get_csv_state(module)->dialects);
16541654
if (PyModule_Add(module, "_dialects", get_csv_state(module)->dialects))
1655-
return NULL;
1655+
goto error;
16561656

16571657
/* Add quote styles into dictionary */
16581658
for (style = quote_styles; style->name; style++) {
16591659
if (PyModule_AddIntConstant(module, style->name,
16601660
style->style) == -1)
1661-
return NULL;
1661+
goto error;
16621662
}
16631663

16641664
if (PyModule_AddType(module, &Dialect_Type)) {
1665-
return NULL;
1665+
goto error;
16661666
}
16671667

16681668
/* Add the CSV exception object to the module. */
16691669
get_csv_state(module)->error_obj = PyErr_NewException("_csv.Error", NULL, NULL);
16701670
Py_XINCREF(get_csv_state(module)->error_obj);
16711671
if (PyModule_Add(module, "Error", get_csv_state(module)->error_obj) < 0) {
1672-
return NULL;
1672+
goto error;
16731673
}
16741674
return module;
1675+
1676+
error:
1677+
Py_DECREF(module);
1678+
return NULL;
16751679
}

Modules/_datetimemodule.c

Lines changed: 79 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -6538,97 +6538,123 @@ PyInit__datetime(void)
65386538

65396539
for (size_t i = 0; i < Py_ARRAY_LENGTH(types); i++) {
65406540
if (PyModule_AddType(m, types[i]) < 0) {
6541-
return NULL;
6541+
goto error;
65426542
}
65436543
}
65446544

65456545
if (PyType_Ready(&PyDateTime_IsoCalendarDateType) < 0) {
6546-
return NULL;
6546+
goto error;
65476547
}
65486548
Py_INCREF(&PyDateTime_IsoCalendarDateType);
65496549

65506550
/* timedelta values */
65516551
d = PyDateTime_DeltaType.tp_dict;
65526552

65536553
x = new_delta(0, 0, 1, 0);
6554-
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
6555-
return NULL;
6554+
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) {
6555+
Py_XDECREF(x);
6556+
goto error;
6557+
}
65566558
Py_DECREF(x);
65576559

65586560
x = new_delta(-MAX_DELTA_DAYS, 0, 0, 0);
6559-
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
6560-
return NULL;
6561+
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) {
6562+
Py_XDECREF(x);
6563+
goto error;
6564+
}
65616565
Py_DECREF(x);
65626566

65636567
x = new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0);
6564-
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
6565-
return NULL;
6568+
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) {
6569+
Py_XDECREF(x);
6570+
goto error;
6571+
}
65666572
Py_DECREF(x);
65676573

65686574
/* date values */
65696575
d = PyDateTime_DateType.tp_dict;
65706576

65716577
x = new_date(1, 1, 1);
6572-
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
6573-
return NULL;
6578+
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) {
6579+
Py_XDECREF(x);
6580+
goto error;
6581+
}
65746582
Py_DECREF(x);
65756583

65766584
x = new_date(MAXYEAR, 12, 31);
6577-
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
6578-
return NULL;
6585+
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) {
6586+
Py_XDECREF(x);
6587+
goto error;
6588+
}
65796589
Py_DECREF(x);
65806590

65816591
x = new_delta(1, 0, 0, 0);
6582-
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
6583-
return NULL;
6592+
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) {
6593+
Py_XDECREF(x);
6594+
goto error;
6595+
}
65846596
Py_DECREF(x);
65856597

65866598
/* time values */
65876599
d = PyDateTime_TimeType.tp_dict;
65886600

65896601
x = new_time(0, 0, 0, 0, Py_None, 0);
6590-
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
6591-
return NULL;
6602+
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) {
6603+
Py_XDECREF(x);
6604+
goto error;
6605+
}
65926606
Py_DECREF(x);
65936607

65946608
x = new_time(23, 59, 59, 999999, Py_None, 0);
6595-
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
6596-
return NULL;
6609+
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) {
6610+
Py_XDECREF(x);
6611+
goto error;
6612+
}
65976613
Py_DECREF(x);
65986614

65996615
x = new_delta(0, 0, 1, 0);
6600-
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
6601-
return NULL;
6616+
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) {
6617+
Py_XDECREF(x);
6618+
goto error;
6619+
}
66026620
Py_DECREF(x);
66036621

66046622
/* datetime values */
66056623
d = PyDateTime_DateTimeType.tp_dict;
66066624

66076625
x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None, 0);
6608-
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
6609-
return NULL;
6626+
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) {
6627+
Py_XDECREF(x);
6628+
goto error;
6629+
}
66106630
Py_DECREF(x);
66116631

66126632
x = new_datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, Py_None, 0);
6613-
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
6614-
return NULL;
6633+
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) {
6634+
Py_XDECREF(x);
6635+
goto error;
6636+
}
66156637
Py_DECREF(x);
66166638

66176639
x = new_delta(0, 0, 1, 0);
6618-
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
6619-
return NULL;
6640+
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0) {
6641+
Py_XDECREF(x);
6642+
goto error;
6643+
}
66206644
Py_DECREF(x);
66216645

66226646
/* timezone values */
66236647
d = PyDateTime_TimeZoneType.tp_dict;
66246648

66256649
delta = new_delta(0, 0, 0, 0);
66266650
if (delta == NULL)
6627-
return NULL;
6651+
goto error;
66286652
x = create_timezone(delta, NULL);
66296653
Py_DECREF(delta);
6630-
if (x == NULL || PyDict_SetItemString(d, "utc", x) < 0)
6631-
return NULL;
6654+
if (x == NULL || PyDict_SetItemString(d, "utc", x) < 0) {
6655+
Py_XDECREF(x);
6656+
goto error;
6657+
}
66326658
PyDateTime_TimeZone_UTC = x;
66336659
CAPI.TimeZone_UTC = PyDateTime_TimeZone_UTC;
66346660

@@ -6637,35 +6663,43 @@ PyInit__datetime(void)
66376663
* values. This may change in the future.*/
66386664
delta = new_delta(-1, 60, 0, 1); /* -23:59 */
66396665
if (delta == NULL)
6640-
return NULL;
6666+
goto error;
66416667
x = create_timezone(delta, NULL);
66426668
Py_DECREF(delta);
6643-
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
6644-
return NULL;
6669+
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0) {
6670+
Py_XDECREF(x);
6671+
goto error;
6672+
}
66456673
Py_DECREF(x);
66466674

66476675
delta = new_delta(0, (23 * 60 + 59) * 60, 0, 0); /* +23:59 */
66486676
if (delta == NULL)
6649-
return NULL;
6677+
goto error;
66506678
x = create_timezone(delta, NULL);
66516679
Py_DECREF(delta);
6652-
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)
6653-
return NULL;
6680+
if (x == NULL || PyDict_SetItemString(d, "max", x) < 0) {
6681+
Py_XDECREF(x);
6682+
goto error;
6683+
}
66546684
Py_DECREF(x);
66556685

66566686
/* Epoch */
66576687
PyDateTime_Epoch = new_datetime(1970, 1, 1, 0, 0, 0, 0,
66586688
PyDateTime_TimeZone_UTC, 0);
66596689
if (PyDateTime_Epoch == NULL)
6660-
return NULL;
6690+
goto error;
66616691

66626692
/* module initialization */
6663-
PyModule_AddIntMacro(m, MINYEAR);
6664-
PyModule_AddIntMacro(m, MAXYEAR);
6693+
if (PyModule_AddIntMacro(m, MINYEAR) < 0) {
6694+
goto error;
6695+
}
6696+
if (PyModule_AddIntMacro(m, MAXYEAR) < 0) {
6697+
goto error;
6698+
}
66656699

66666700
if (PyModule_Add(m, "datetime_CAPI",
66676701
PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL)) < 0) {
6668-
return NULL;
6702+
goto error;
66696703
};
66706704

66716705
/* A 4-year cycle has an extra leap day over what we'd get from
@@ -6692,7 +6726,7 @@ PyInit__datetime(void)
66926726
seconds_per_day = PyLong_FromLong(24 * 3600);
66936727
if (us_per_ms == NULL || us_per_second == NULL ||
66946728
us_per_minute == NULL || seconds_per_day == NULL)
6695-
return NULL;
6729+
goto error;
66966730

66976731
/* The rest are too big for 32-bit ints, but even
66986732
* us_per_week fits in 40 bits, so doubles should be exact.
@@ -6701,8 +6735,12 @@ PyInit__datetime(void)
67016735
us_per_day = PyLong_FromDouble(86400000000.0);
67026736
us_per_week = PyLong_FromDouble(604800000000.0);
67036737
if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL)
6704-
return NULL;
6738+
goto error;
67056739
return m;
6740+
6741+
error:
6742+
Py_DECREF(m);
6743+
return NULL;
67066744
}
67076745

67086746
/* ---------------------------------------------------------------------------

Modules/_pickle.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7973,13 +7973,13 @@ PyInit__pickle(void)
79737973

79747974
/* Add types */
79757975
if (PyModule_AddType(m, &Pickler_Type) < 0) {
7976-
return NULL;
7976+
goto error;
79777977
}
79787978
if (PyModule_AddType(m, &Unpickler_Type) < 0) {
7979-
return NULL;
7979+
goto error;
79807980
}
79817981
if (PyModule_AddType(m, &PyPickleBuffer_Type) < 0) {
7982-
return NULL;
7982+
goto error;
79837983
}
79847984

79857985
st = _Pickle_GetState(m);
@@ -7988,22 +7988,26 @@ PyInit__pickle(void)
79887988
st->PickleError = PyErr_NewException("_pickle.PickleError", NULL, NULL);
79897989
Py_XINCREF(st->PickleError);
79907990
if (PyModule_Add(m, "PickleError", st->PickleError) < 0)
7991-
return NULL;
7991+
goto error;
79927992

79937993
st->PicklingError = \
79947994
PyErr_NewException("_pickle.PicklingError", st->PickleError, NULL);
79957995
Py_XINCREF(st->PicklingError);
79967996
if (PyModule_Add(m, "PicklingError", st->PicklingError) < 0)
7997-
return NULL;
7997+
goto error;
79987998

79997999
st->UnpicklingError = \
80008000
PyErr_NewException("_pickle.UnpicklingError", st->PickleError, NULL);
80018001
Py_XINCREF(st->UnpicklingError);
80028002
if (PyModule_Add(m, "UnpicklingError", st->UnpicklingError) < 0)
8003-
return NULL;
8003+
goto error;
80048004

80058005
if (_Pickle_InitState(st) < 0)
8006-
return NULL;
8006+
goto error;
80078007

80088008
return m;
8009+
8010+
error:
8011+
Py_DECREF(m);
8012+
return NULL;
80098013
}

Modules/_struct.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2374,12 +2374,12 @@ PyInit__struct(void)
23742374
get_struct_state(m)->PyStructType = PyStructType;
23752375
Py_XINCREF(PyStructType);
23762376
if (PyModule_Add(m, "Struct", PyStructType) < 0) {
2377-
return NULL;
2377+
goto error;
23782378
}
23792379

23802380
PyObject *unpackiter_type = PyType_FromSpec(&unpackiter_type_spec);
23812381
if (unpackiter_type == NULL) {
2382-
return NULL;
2382+
goto error;
23832383
}
23842384
get_struct_state(m)->unpackiter_type = unpackiter_type;
23852385

@@ -2429,9 +2429,13 @@ PyInit__struct(void)
24292429
PyObject *StructError = PyErr_NewException("struct.error", NULL, NULL);
24302430
get_struct_state(m)->StructError = StructError;
24312431
Py_XINCREF(StructError);
2432-
if (PyModule_AddObject(m, "error", StructError) < 0) {
2433-
return NULL;
2432+
if (PyModule_Add(m, "error", StructError) < 0) {
2433+
goto error;
24342434
}
24352435

24362436
return m;
2437+
2438+
error:
2439+
Py_DECREF(m);
2440+
return NULL;
24372441
}

0 commit comments

Comments
 (0)