Skip to content

Commit 22e4df8

Browse files
committed
fix UBSan failures for dequeobject
1 parent cf0b2da commit 22e4df8

File tree

1 file changed

+45
-29
lines changed

1 file changed

+45
-29
lines changed

Modules/_collectionsmodule.c

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ struct dequeobject {
144144
PyObject *weakreflist;
145145
};
146146

147+
#define _dequeobject_CAST(op) ((dequeobject *)(op))
148+
147149
/* For debug builds, add error checking to track the endpoints
148150
* in the chain of links. The goal is to make sure that link
149151
* assignments only take place at endpoints so that links already
@@ -570,8 +572,9 @@ deque_extendleft_impl(dequeobject *deque, PyObject *iterable)
570572
}
571573

572574
static PyObject *
573-
deque_inplace_concat(dequeobject *deque, PyObject *other)
575+
deque_inplace_concat(PyObject *self, PyObject *other)
574576
{
577+
dequeobject *deque = _dequeobject_CAST(self);
575578
PyObject *result;
576579

577580
// deque_extend is thread-safe
@@ -597,14 +600,13 @@ deque_copy_impl(dequeobject *deque)
597600
/*[clinic end generated code: output=6409b3d1ad2898b5 input=51d2ed1a23bab5e2]*/
598601
{
599602
PyObject *result;
600-
dequeobject *old_deque = (dequeobject *)deque;
603+
dequeobject *old_deque = deque;
601604
collections_state *state = find_module_state_by_def(Py_TYPE(deque));
602605
if (Py_IS_TYPE(deque, state->deque_type)) {
603606
dequeobject *new_deque;
604607
PyObject *rv;
605608

606-
new_deque = (dequeobject *)deque_new(state->deque_type,
607-
(PyObject *)NULL, (PyObject *)NULL);
609+
new_deque = (dequeobject *)deque_new(state->deque_type, NULL, NULL);
608610
if (new_deque == NULL)
609611
return NULL;
610612
new_deque->maxlen = old_deque->maxlen;
@@ -689,8 +691,9 @@ deque_concat_lock_held(dequeobject *deque, PyObject *other)
689691
}
690692

691693
static PyObject *
692-
deque_concat(dequeobject *deque, PyObject *other)
694+
deque_concat(PyObject *self, PyObject *other)
693695
{
696+
dequeobject *deque = _dequeobject_CAST(self);
694697
PyObject *result;
695698
Py_BEGIN_CRITICAL_SECTION(deque);
696699
result = deque_concat_lock_held(deque, other);
@@ -699,7 +702,7 @@ deque_concat(dequeobject *deque, PyObject *other)
699702
}
700703

701704
static int
702-
deque_clear(dequeobject *deque)
705+
deque_clear(PyObject *self)
703706
{
704707
block *b;
705708
block *prevblock;
@@ -708,6 +711,7 @@ deque_clear(dequeobject *deque)
708711
Py_ssize_t n, m;
709712
PyObject *item;
710713
PyObject **itemptr, **limit;
714+
dequeobject *deque = _dequeobject_CAST(self);
711715

712716
if (Py_SIZE(deque) == 0)
713717
return 0;
@@ -795,7 +799,7 @@ static PyObject *
795799
deque_clearmethod_impl(dequeobject *deque)
796800
/*[clinic end generated code: output=79b2513e097615c1 input=3a22e9605d20c5e9]*/
797801
{
798-
deque_clear(deque);
802+
(void)deque_clear((PyObject *)deque);
799803
Py_RETURN_NONE;
800804
}
801805

@@ -812,7 +816,7 @@ deque_inplace_repeat_lock_held(dequeobject *deque, Py_ssize_t n)
812816
}
813817

814818
if (n <= 0) {
815-
deque_clear(deque);
819+
(void)deque_clear((PyObject *)deque);
816820
return Py_NewRef(deque);
817821
}
818822

@@ -877,8 +881,9 @@ deque_inplace_repeat_lock_held(dequeobject *deque, Py_ssize_t n)
877881
}
878882

879883
static PyObject *
880-
deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
884+
deque_inplace_repeat(PyObject *self, Py_ssize_t n)
881885
{
886+
dequeobject *deque = _dequeobject_CAST(self);
882887
PyObject *result;
883888
Py_BEGIN_CRITICAL_SECTION(deque);
884889
result = deque_inplace_repeat_lock_held(deque, n);
@@ -887,8 +892,9 @@ deque_inplace_repeat(dequeobject *deque, Py_ssize_t n)
887892
}
888893

889894
static PyObject *
890-
deque_repeat(dequeobject *deque, Py_ssize_t n)
895+
deque_repeat(PyObject *self, Py_ssize_t n)
891896
{
897+
dequeobject *deque = _dequeobject_CAST(self);
892898
dequeobject *new_deque;
893899
PyObject *rv;
894900

@@ -1202,8 +1208,9 @@ deque_contains_lock_held(dequeobject *deque, PyObject *v)
12021208
}
12031209

12041210
static int
1205-
deque_contains(dequeobject *deque, PyObject *v)
1211+
deque_contains(PyObject *self, PyObject *v)
12061212
{
1213+
dequeobject *deque = _dequeobject_CAST(self);
12071214
int result;
12081215
Py_BEGIN_CRITICAL_SECTION(deque);
12091216
result = deque_contains_lock_held(deque, v);
@@ -1212,9 +1219,10 @@ deque_contains(dequeobject *deque, PyObject *v)
12121219
}
12131220

12141221
static Py_ssize_t
1215-
deque_len(dequeobject *deque)
1222+
deque_len(PyObject *self)
12161223
{
1217-
return FT_ATOMIC_LOAD_SSIZE(((PyVarObject *)deque)->ob_size);
1224+
PyVarObject *deque = _PyVarObject_CAST(self);
1225+
return FT_ATOMIC_LOAD_SSIZE(deque->ob_size);
12181226
}
12191227

12201228
/*[clinic input]
@@ -1394,8 +1402,9 @@ deque_item_lock_held(dequeobject *deque, Py_ssize_t i)
13941402
}
13951403

13961404
static PyObject *
1397-
deque_item(dequeobject *deque, Py_ssize_t i)
1405+
deque_item(PyObject *self, Py_ssize_t i)
13981406
{
1407+
dequeobject *deque = _dequeobject_CAST(self);
13991408
PyObject *result;
14001409
Py_BEGIN_CRITICAL_SECTION(deque);
14011410
result = deque_item_lock_held(deque, i);
@@ -1505,8 +1514,9 @@ deque_ass_item_lock_held(dequeobject *deque, Py_ssize_t i, PyObject *v)
15051514
}
15061515

15071516
static int
1508-
deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
1517+
deque_ass_item(PyObject *self, Py_ssize_t i, PyObject *v)
15091518
{
1519+
dequeobject *deque = _dequeobject_CAST(self);
15101520
int result;
15111521
Py_BEGIN_CRITICAL_SECTION(deque);
15121522
result = deque_ass_item_lock_held(deque, i, v);
@@ -1515,16 +1525,18 @@ deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)
15151525
}
15161526

15171527
static void
1518-
deque_dealloc(dequeobject *deque)
1528+
deque_dealloc(PyObject *self)
15191529
{
1530+
dequeobject *deque = _dequeobject_CAST(self);
15201531
PyTypeObject *tp = Py_TYPE(deque);
15211532
Py_ssize_t i;
15221533

15231534
PyObject_GC_UnTrack(deque);
1524-
if (deque->weakreflist != NULL)
1525-
PyObject_ClearWeakRefs((PyObject *) deque);
1535+
if (deque->weakreflist != NULL) {
1536+
PyObject_ClearWeakRefs(self);
1537+
}
15261538
if (deque->leftblock != NULL) {
1527-
deque_clear(deque);
1539+
(void)deque_clear(self);
15281540
assert(deque->leftblock != NULL);
15291541
freeblock(deque, deque->leftblock);
15301542
}
@@ -1538,8 +1550,9 @@ deque_dealloc(dequeobject *deque)
15381550
}
15391551

15401552
static int
1541-
deque_traverse(dequeobject *deque, visitproc visit, void *arg)
1553+
deque_traverse(PyObject *self, visitproc visit, void *arg)
15421554
{
1555+
dequeobject *deque = _dequeobject_CAST(self);
15431556
Py_VISIT(Py_TYPE(deque));
15441557

15451558
block *b;
@@ -1618,10 +1631,11 @@ deque_repr(PyObject *deque)
16181631
Py_ReprLeave(deque);
16191632
return NULL;
16201633
}
1621-
if (((dequeobject *)deque)->maxlen >= 0)
1634+
Py_ssize_t maxlen = _dequeobject_CAST(deque)->maxlen;
1635+
if (maxlen >= 0)
16221636
result = PyUnicode_FromFormat("%s(%R, maxlen=%zd)",
16231637
_PyType_Name(Py_TYPE(deque)), aslist,
1624-
((dequeobject *)deque)->maxlen);
1638+
maxlen);
16251639
else
16261640
result = PyUnicode_FromFormat("%s(%R)",
16271641
_PyType_Name(Py_TYPE(deque)), aslist);
@@ -1644,8 +1658,8 @@ deque_richcompare(PyObject *v, PyObject *w, int op)
16441658
}
16451659

16461660
/* Shortcuts */
1647-
vs = Py_SIZE((dequeobject *)v);
1648-
ws = Py_SIZE((dequeobject *)w);
1661+
vs = Py_SIZE(v);
1662+
ws = Py_SIZE(w);
16491663
if (op == Py_EQ) {
16501664
if (v == w)
16511665
Py_RETURN_TRUE;
@@ -1737,7 +1751,7 @@ deque_init_impl(dequeobject *deque, PyObject *iterable, PyObject *maxlenobj)
17371751
}
17381752
deque->maxlen = maxlen;
17391753
if (Py_SIZE(deque) > 0)
1740-
deque_clear(deque);
1754+
(void)deque_clear((PyObject *)deque);
17411755
if (iterable != NULL) {
17421756
PyObject *rv = deque_extend_impl(deque, iterable);
17431757
if (rv == NULL)
@@ -1770,8 +1784,9 @@ deque___sizeof___impl(dequeobject *deque)
17701784
}
17711785

17721786
static PyObject *
1773-
deque_get_maxlen(dequeobject *deque, void *Py_UNUSED(ignored))
1787+
deque_get_maxlen(PyObject *self, void *Py_UNUSED(closure))
17741788
{
1789+
dequeobject *deque = _dequeobject_CAST(self);
17751790
if (deque->maxlen < 0)
17761791
Py_RETURN_NONE;
17771792
return PyLong_FromSsize_t(deque->maxlen);
@@ -1797,12 +1812,12 @@ deque___reversed___impl(dequeobject *deque)
17971812
/* deque object ********************************************************/
17981813

17991814
static PyGetSetDef deque_getset[] = {
1800-
{"maxlen", (getter)deque_get_maxlen, (setter)NULL,
1815+
{"maxlen", deque_get_maxlen, NULL,
18011816
"maximum size of a deque or None if unbounded"},
18021817
{0}
18031818
};
18041819

1805-
static PyObject *deque_iter(dequeobject *deque);
1820+
static PyObject *deque_iter(PyObject *deque);
18061821

18071822
static PyMethodDef deque_methods[] = {
18081823
DEQUE_APPEND_METHODDEF
@@ -1884,9 +1899,10 @@ typedef struct {
18841899
} dequeiterobject;
18851900

18861901
static PyObject *
1887-
deque_iter(dequeobject *deque)
1902+
deque_iter(PyObject *self)
18881903
{
18891904
dequeiterobject *it;
1905+
dequeobject *deque = _dequeobject_CAST(self);
18901906

18911907
collections_state *state = find_module_state_by_def(Py_TYPE(deque));
18921908
it = PyObject_GC_New(dequeiterobject, state->dequeiter_type);

0 commit comments

Comments
 (0)