Skip to content

Commit 6d1f263

Browse files
committed
fix UBSan failures for PyDateTime_Delta
1 parent d4be207 commit 6d1f263

File tree

1 file changed

+31
-29
lines changed

1 file changed

+31
-29
lines changed

Modules/_datetimemodule.c

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -309,9 +309,9 @@ clear_current_module(PyInterpreterState *interp, PyObject *expected)
309309
#define TIME_SET_FOLD(o, v) (PyDateTime_TIME_GET_FOLD(o) = (v))
310310

311311
/* Delta accessors for timedelta. */
312-
#define GET_TD_DAYS(o) (((PyDateTime_Delta *)(o))->days)
313-
#define GET_TD_SECONDS(o) (((PyDateTime_Delta *)(o))->seconds)
314-
#define GET_TD_MICROSECONDS(o) (((PyDateTime_Delta *)(o))->microseconds)
312+
#define GET_TD_DAYS(o) (_PyDelta_CAST(o)->days)
313+
#define GET_TD_SECONDS(o) (_PyDelta_CAST(o)->seconds)
314+
#define GET_TD_MICROSECONDS(o) (_PyDelta_CAST(o)->microseconds)
315315

316316
#define SET_TD_DAYS(o, v) ((o)->days = (v))
317317
#define SET_TD_SECONDS(o, v) ((o)->seconds = (v))
@@ -1430,7 +1430,7 @@ create_timezone(PyObject *offset, PyObject *name)
14301430
return (PyObject *)self;
14311431
}
14321432

1433-
static int delta_bool(PyDateTime_Delta *self);
1433+
static int delta_bool(PyObject *op);
14341434
static PyDateTime_TimeZone utc_timezone;
14351435

14361436
static PyObject *
@@ -1440,7 +1440,7 @@ new_timezone(PyObject *offset, PyObject *name)
14401440
assert(PyDelta_Check(offset));
14411441
assert(name == NULL || PyUnicode_Check(name));
14421442

1443-
if (name == NULL && delta_bool((PyDateTime_Delta *)offset) == 0) {
1443+
if (name == NULL && delta_bool(offset) == 0) {
14441444
return Py_NewRef(CONST_UTC(NO_STATE));
14451445
}
14461446
if ((GET_TD_DAYS(offset) == -1 &&
@@ -1694,7 +1694,7 @@ format_ctime(PyDateTime_Date *date, int hours, int minutes, int seconds)
16941694
GET_YEAR(date));
16951695
}
16961696

1697-
static PyObject *delta_negative(PyDateTime_Delta *self);
1697+
static PyObject *delta_negative(PyObject *op);
16981698

16991699
/* Add formatted UTC offset string to buf. buf has no more than
17001700
* buflen bytes remaining. The UTC offset is gotten by calling
@@ -1727,7 +1727,7 @@ format_utcoffset(char *buf, size_t buflen, const char *sep,
17271727
/* Offset is normalized, so it is negative if days < 0 */
17281728
if (GET_TD_DAYS(offset) < 0) {
17291729
sign = '-';
1730-
Py_SETREF(offset, delta_negative((PyDateTime_Delta *)offset));
1730+
Py_SETREF(offset, delta_negative(offset));
17311731
if (offset == NULL)
17321732
return -1;
17331733
}
@@ -2429,7 +2429,7 @@ delta_add(PyObject *left, PyObject *right)
24292429
}
24302430

24312431
static PyObject *
2432-
delta_negative(PyDateTime_Delta *self)
2432+
delta_negative(PyObject *self)
24332433
{
24342434
return new_delta(-GET_TD_DAYS(self),
24352435
-GET_TD_SECONDS(self),
@@ -2438,7 +2438,7 @@ delta_negative(PyDateTime_Delta *self)
24382438
}
24392439

24402440
static PyObject *
2441-
delta_positive(PyDateTime_Delta *self)
2441+
delta_positive(PyObject *self)
24422442
{
24432443
/* Could optimize this (by returning self) if this isn't a
24442444
* subclass -- but who uses unary + ? Approximately nobody.
@@ -2450,7 +2450,7 @@ delta_positive(PyDateTime_Delta *self)
24502450
}
24512451

24522452
static PyObject *
2453-
delta_abs(PyDateTime_Delta *self)
2453+
delta_abs(PyObject *self)
24542454
{
24552455
PyObject *result;
24562456

@@ -2515,8 +2515,9 @@ delta_richcompare(PyObject *self, PyObject *other, int op)
25152515
static PyObject *delta_getstate(PyDateTime_Delta *self);
25162516

25172517
static Py_hash_t
2518-
delta_hash(PyDateTime_Delta *self)
2518+
delta_hash(PyObject *op)
25192519
{
2520+
PyDateTime_Delta *self = _PyDelta_CAST(op);
25202521
if (self->hashcode == -1) {
25212522
PyObject *temp = delta_getstate(self);
25222523
if (temp != NULL) {
@@ -2880,15 +2881,15 @@ delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)
28802881
}
28812882

28822883
static int
2883-
delta_bool(PyDateTime_Delta *self)
2884+
delta_bool(PyObject *self)
28842885
{
28852886
return (GET_TD_DAYS(self) != 0
28862887
|| GET_TD_SECONDS(self) != 0
28872888
|| GET_TD_MICROSECONDS(self) != 0);
28882889
}
28892890

28902891
static PyObject *
2891-
delta_repr(PyDateTime_Delta *self)
2892+
delta_repr(PyObject *self)
28922893
{
28932894
PyObject *args = Py_GetConstant(Py_CONSTANT_EMPTY_STR);
28942895

@@ -2937,7 +2938,7 @@ delta_repr(PyDateTime_Delta *self)
29372938
}
29382939

29392940
static PyObject *
2940-
delta_str(PyDateTime_Delta *self)
2941+
delta_str(PyObject *self)
29412942
{
29422943
int us = GET_TD_MICROSECONDS(self);
29432944
int seconds = GET_TD_SECONDS(self);
@@ -2977,12 +2978,12 @@ delta_getstate(PyDateTime_Delta *self)
29772978
}
29782979

29792980
static PyObject *
2980-
delta_total_seconds(PyObject *self, PyObject *Py_UNUSED(ignored))
2981+
delta_total_seconds(PyObject *op, PyObject *Py_UNUSED(closure))
29812982
{
29822983
PyObject *total_seconds;
29832984
PyObject *total_microseconds;
29842985

2985-
total_microseconds = delta_to_microseconds((PyDateTime_Delta *)self);
2986+
total_microseconds = delta_to_microseconds(_PyDelta_CAST(op));
29862987
if (total_microseconds == NULL)
29872988
return NULL;
29882989

@@ -2997,8 +2998,9 @@ delta_total_seconds(PyObject *self, PyObject *Py_UNUSED(ignored))
29972998
}
29982999

29993000
static PyObject *
3000-
delta_reduce(PyDateTime_Delta* self, PyObject *Py_UNUSED(ignored))
3001+
delta_reduce(PyObject *op, PyObject *Py_UNUSED(closure))
30013002
{
3003+
PyDateTime_Delta *self = _PyDelta_CAST(op);
30023004
return Py_BuildValue("ON", Py_TYPE(self), delta_getstate(self));
30033005
}
30043006

@@ -3021,7 +3023,7 @@ static PyMethodDef delta_methods[] = {
30213023
{"total_seconds", delta_total_seconds, METH_NOARGS,
30223024
PyDoc_STR("Total seconds in the duration.")},
30233025

3024-
{"__reduce__", (PyCFunction)delta_reduce, METH_NOARGS,
3026+
{"__reduce__", delta_reduce, METH_NOARGS,
30253027
PyDoc_STR("__reduce__() -> (cls, state)")},
30263028

30273029
{NULL, NULL},
@@ -3041,10 +3043,10 @@ static PyNumberMethods delta_as_number = {
30413043
delta_remainder, /* nb_remainder */
30423044
delta_divmod, /* nb_divmod */
30433045
0, /* nb_power */
3044-
(unaryfunc)delta_negative, /* nb_negative */
3045-
(unaryfunc)delta_positive, /* nb_positive */
3046-
(unaryfunc)delta_abs, /* nb_absolute */
3047-
(inquiry)delta_bool, /* nb_bool */
3046+
delta_negative, /* nb_negative */
3047+
delta_positive, /* nb_positive */
3048+
delta_abs, /* nb_absolute */
3049+
delta_bool, /* nb_bool */
30483050
0, /*nb_invert*/
30493051
0, /*nb_lshift*/
30503052
0, /*nb_rshift*/
@@ -3080,13 +3082,13 @@ static PyTypeObject PyDateTime_DeltaType = {
30803082
0, /* tp_getattr */
30813083
0, /* tp_setattr */
30823084
0, /* tp_as_async */
3083-
(reprfunc)delta_repr, /* tp_repr */
3085+
delta_repr, /* tp_repr */
30843086
&delta_as_number, /* tp_as_number */
30853087
0, /* tp_as_sequence */
30863088
0, /* tp_as_mapping */
3087-
(hashfunc)delta_hash, /* tp_hash */
3089+
delta_hash, /* tp_hash */
30883090
0, /* tp_call */
3089-
(reprfunc)delta_str, /* tp_str */
3091+
delta_str, /* tp_str */
30903092
PyObject_GenericGetAttr, /* tp_getattro */
30913093
0, /* tp_setattro */
30923094
0, /* tp_as_buffer */
@@ -4113,7 +4115,7 @@ tzinfo_fromutc(PyDateTime_TZInfo *self, PyObject *dt)
41134115
goto Fail;
41144116
if (dst == Py_None)
41154117
goto Inconsistent;
4116-
if (delta_bool((PyDateTime_Delta *)dst) != 0) {
4118+
if (delta_bool(dst) != 0) {
41174119
Py_SETREF(result, add_datetime_timedelta((PyDateTime_DateTime *)result,
41184120
(PyDateTime_Delta *)dst, 1));
41194121
if (result == NULL)
@@ -4274,7 +4276,7 @@ timezone_richcompare(PyDateTime_TimeZone *self,
42744276
static Py_hash_t
42754277
timezone_hash(PyDateTime_TimeZone *self)
42764278
{
4277-
return delta_hash((PyDateTime_Delta *)self->offset);
4279+
return delta_hash(self->offset);
42784280
}
42794281

42804282
/* Check argument type passed to tzname, utcoffset, or dst methods.
@@ -4330,7 +4332,7 @@ timezone_str(PyDateTime_TimeZone *self)
43304332
/* Offset is normalized, so it is negative if days < 0 */
43314333
if (GET_TD_DAYS(self->offset) < 0) {
43324334
sign = '-';
4333-
offset = delta_negative((PyDateTime_Delta *)self->offset);
4335+
offset = delta_negative(self->offset);
43344336
if (offset == NULL)
43354337
return NULL;
43364338
}
@@ -6726,7 +6728,7 @@ datetime_timetuple(PyDateTime_DateTime *self, PyObject *Py_UNUSED(ignored))
67266728
return NULL;
67276729

67286730
if (dst != Py_None)
6729-
dstflag = delta_bool((PyDateTime_Delta *)dst);
6731+
dstflag = delta_bool(dst);
67306732
Py_DECREF(dst);
67316733
}
67326734
return build_struct_time(GET_YEAR(self),

0 commit comments

Comments
 (0)