summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS.d/next/Library/2023-06-09-22-45-26.gh-issue-105375.9rp6tG.rst2
-rw-r--r--Modules/_datetimemodule.c35
2 files changed, 32 insertions, 5 deletions
diff --git a/Misc/NEWS.d/next/Library/2023-06-09-22-45-26.gh-issue-105375.9rp6tG.rst b/Misc/NEWS.d/next/Library/2023-06-09-22-45-26.gh-issue-105375.9rp6tG.rst
new file mode 100644
index 0000000..352d7b8
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-06-09-22-45-26.gh-issue-105375.9rp6tG.rst
@@ -0,0 +1,2 @@
+Fix bugs in :mod:`!_datetime` where exceptions could be overwritten in case
+of module initialisation failure.
diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c
index 19e1178..cbc331c 100644
--- a/Modules/_datetimemodule.c
+++ b/Modules/_datetimemodule.c
@@ -6871,24 +6871,49 @@ _datetime_exec(PyObject *module)
assert(DI100Y == days_before_year(100+1));
us_per_ms = PyLong_FromLong(1000);
+ if (us_per_ms == NULL) {
+ goto error;
+ }
us_per_second = PyLong_FromLong(1000000);
+ if (us_per_second == NULL) {
+ goto error;
+ }
us_per_minute = PyLong_FromLong(60000000);
+ if (us_per_minute == NULL) {
+ goto error;
+ }
seconds_per_day = PyLong_FromLong(24 * 3600);
- if (us_per_ms == NULL || us_per_second == NULL ||
- us_per_minute == NULL || seconds_per_day == NULL) {
- return -1;
+ if (seconds_per_day == NULL) {
+ goto error;
}
/* The rest are too big for 32-bit ints, but even
* us_per_week fits in 40 bits, so doubles should be exact.
*/
us_per_hour = PyLong_FromDouble(3600000000.0);
+ if (us_per_hour == NULL) {
+ goto error;
+ }
us_per_day = PyLong_FromDouble(86400000000.0);
+ if (us_per_day == NULL) {
+ goto error;
+ }
us_per_week = PyLong_FromDouble(604800000000.0);
- if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL) {
- return -1;
+ if (us_per_week == NULL) {
+ goto error;
}
+
return 0;
+
+error:
+ Py_XDECREF(us_per_ms);
+ Py_XDECREF(us_per_second);
+ Py_XDECREF(us_per_minute);
+ Py_XDECREF(us_per_hour);
+ Py_XDECREF(us_per_day);
+ Py_XDECREF(us_per_week);
+ Py_XDECREF(seconds_per_day);
+ return -1;
}
static struct PyModuleDef datetimemodule = {