Skip to content

Commit f10b7b2

Browse files
authored
gh-111178: fix UBSan failures in Modules/cjkcodecs/multibytecodec.c (gh-129090)
1 parent 9abbb58 commit f10b7b2

File tree

1 file changed

+49
-22
lines changed

1 file changed

+49
-22
lines changed

Modules/cjkcodecs/multibytecodec.c

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,27 @@ class _multibytecodec.MultibyteStreamWriter "MultibyteStreamWriterObject *" "cli
5656
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=305a76dfdd24b99c]*/
5757
#undef clinic_get_state
5858

59+
#define _MultibyteCodec_CAST(op) ((MultibyteCodec *)(op))
60+
#define _MultibyteCodecObject_CAST(op) ((MultibyteCodecObject *)(op))
61+
62+
#define _MultibyteStatefulCodecContext_CAST(op) \
63+
((MultibyteStatefulCodecContext *)(op))
64+
65+
#define _MultibyteStatefulEncoderContext_CAST(op) \
66+
((MultibyteStatefulEncoderContext *)(op))
67+
#define _MultibyteStatefulDecoderContext_CAST(op) \
68+
((MultibyteStatefulDecoderContext *)(op))
69+
70+
#define _MultibyteIncrementalEncoderObject_CAST(op) \
71+
((MultibyteIncrementalEncoderObject *)(op))
72+
#define _MultibyteIncrementalDecoderObject_CAST(op) \
73+
((MultibyteIncrementalDecoderObject *)(op))
74+
75+
#define _MultibyteStreamReaderObject_CAST(op) \
76+
((MultibyteStreamReaderObject *)(op))
77+
#define _MultibyteStreamWriterObject_CAST(op) \
78+
((MultibyteStreamWriterObject *)(op))
79+
5980
typedef struct {
6081
PyObject *inobj;
6182
Py_ssize_t inpos, inlen;
@@ -136,9 +157,10 @@ call_error_callback(PyObject *errors, PyObject *exc)
136157
}
137158

138159
static PyObject *
139-
codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored))
160+
codecctx_errors_get(PyObject *op, void *Py_UNUSED(closure))
140161
{
141162
const char *errors;
163+
MultibyteStatefulCodecContext *self = _MultibyteStatefulCodecContext_CAST(op);
142164

143165
if (self->errors == ERROR_STRICT)
144166
errors = "strict";
@@ -154,11 +176,11 @@ codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored
154176
}
155177

156178
static int
157-
codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value,
158-
void *closure)
179+
codecctx_errors_set(PyObject *op, PyObject *value, void *Py_UNUSED(closure))
159180
{
160181
PyObject *cb;
161182
const char *str;
183+
MultibyteStatefulCodecContext *self = _MultibyteStatefulCodecContext_CAST(op);
162184

163185
if (value == NULL) {
164186
PyErr_SetString(PyExc_AttributeError, "cannot delete attribute");
@@ -184,9 +206,8 @@ codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value,
184206

185207
/* This getset handlers list is used by all the stateful codec objects */
186208
static PyGetSetDef codecctx_getsets[] = {
187-
{"errors", (getter)codecctx_errors_get,
188-
(setter)codecctx_errors_set,
189-
PyDoc_STR("how to treat errors")},
209+
{"errors", codecctx_errors_get, codecctx_errors_set,
210+
PyDoc_STR("how to treat errors")},
190211
{NULL,}
191212
};
192213

@@ -719,22 +740,24 @@ static struct PyMethodDef multibytecodec_methods[] = {
719740
};
720741

721742
static int
722-
multibytecodec_clear(MultibyteCodecObject *self)
743+
multibytecodec_clear(PyObject *op)
723744
{
745+
MultibyteCodecObject *self = _MultibyteCodecObject_CAST(op);
724746
Py_CLEAR(self->cjk_module);
725747
return 0;
726748
}
727749

728750
static int
729-
multibytecodec_traverse(MultibyteCodecObject *self, visitproc visit, void *arg)
751+
multibytecodec_traverse(PyObject *op, visitproc visit, void *arg)
730752
{
753+
MultibyteCodecObject *self = _MultibyteCodecObject_CAST(op);
731754
Py_VISIT(Py_TYPE(self));
732755
Py_VISIT(self->cjk_module);
733756
return 0;
734757
}
735758

736759
static void
737-
multibytecodec_dealloc(MultibyteCodecObject *self)
760+
multibytecodec_dealloc(PyObject *self)
738761
{
739762
PyObject_GC_UnTrack(self);
740763
PyTypeObject *tp = Py_TYPE(self);
@@ -1106,17 +1129,18 @@ mbiencoder_init(PyObject *self, PyObject *args, PyObject *kwds)
11061129
}
11071130

11081131
static int
1109-
mbiencoder_traverse(MultibyteIncrementalEncoderObject *self,
1110-
visitproc visit, void *arg)
1132+
mbiencoder_traverse(PyObject *op, visitproc visit, void *arg)
11111133
{
1134+
MultibyteIncrementalEncoderObject *self = _MultibyteIncrementalEncoderObject_CAST(op);
11121135
if (ERROR_ISCUSTOM(self->errors))
11131136
Py_VISIT(self->errors);
11141137
return 0;
11151138
}
11161139

11171140
static void
1118-
mbiencoder_dealloc(MultibyteIncrementalEncoderObject *self)
1141+
mbiencoder_dealloc(PyObject *op)
11191142
{
1143+
MultibyteIncrementalEncoderObject *self = _MultibyteIncrementalEncoderObject_CAST(op);
11201144
PyTypeObject *tp = Py_TYPE(self);
11211145
PyObject_GC_UnTrack(self);
11221146
ERROR_DECREF(self->errors);
@@ -1388,17 +1412,18 @@ mbidecoder_init(PyObject *self, PyObject *args, PyObject *kwds)
13881412
}
13891413

13901414
static int
1391-
mbidecoder_traverse(MultibyteIncrementalDecoderObject *self,
1392-
visitproc visit, void *arg)
1415+
mbidecoder_traverse(PyObject *op, visitproc visit, void *arg)
13931416
{
1417+
MultibyteIncrementalDecoderObject *self = _MultibyteIncrementalDecoderObject_CAST(op);
13941418
if (ERROR_ISCUSTOM(self->errors))
13951419
Py_VISIT(self->errors);
13961420
return 0;
13971421
}
13981422

13991423
static void
1400-
mbidecoder_dealloc(MultibyteIncrementalDecoderObject *self)
1424+
mbidecoder_dealloc(PyObject *op)
14011425
{
1426+
MultibyteIncrementalDecoderObject *self = _MultibyteIncrementalDecoderObject_CAST(op);
14021427
PyTypeObject *tp = Py_TYPE(self);
14031428
PyObject_GC_UnTrack(self);
14041429
ERROR_DECREF(self->errors);
@@ -1704,18 +1729,19 @@ mbstreamreader_init(PyObject *self, PyObject *args, PyObject *kwds)
17041729
}
17051730

17061731
static int
1707-
mbstreamreader_traverse(MultibyteStreamReaderObject *self,
1708-
visitproc visit, void *arg)
1732+
mbstreamreader_traverse(PyObject *op, visitproc visit, void *arg)
17091733
{
1734+
MultibyteStreamReaderObject *self = _MultibyteStreamReaderObject_CAST(op);
17101735
if (ERROR_ISCUSTOM(self->errors))
17111736
Py_VISIT(self->errors);
17121737
Py_VISIT(self->stream);
17131738
return 0;
17141739
}
17151740

17161741
static void
1717-
mbstreamreader_dealloc(MultibyteStreamReaderObject *self)
1742+
mbstreamreader_dealloc(PyObject *op)
17181743
{
1744+
MultibyteStreamReaderObject *self = _MultibyteStreamReaderObject_CAST(op);
17191745
PyTypeObject *tp = Py_TYPE(self);
17201746
PyObject_GC_UnTrack(self);
17211747
ERROR_DECREF(self->errors);
@@ -1927,18 +1953,19 @@ mbstreamwriter_init(PyObject *self, PyObject *args, PyObject *kwds)
19271953
}
19281954

19291955
static int
1930-
mbstreamwriter_traverse(MultibyteStreamWriterObject *self,
1931-
visitproc visit, void *arg)
1956+
mbstreamwriter_traverse(PyObject *op, visitproc visit, void *arg)
19321957
{
1958+
MultibyteStreamWriterObject *self = _MultibyteStreamWriterObject_CAST(op);
19331959
if (ERROR_ISCUSTOM(self->errors))
19341960
Py_VISIT(self->errors);
19351961
Py_VISIT(self->stream);
19361962
return 0;
19371963
}
19381964

19391965
static void
1940-
mbstreamwriter_dealloc(MultibyteStreamWriterObject *self)
1966+
mbstreamwriter_dealloc(PyObject *op)
19411967
{
1968+
MultibyteStreamWriterObject *self = _MultibyteStreamWriterObject_CAST(op);
19421969
PyTypeObject *tp = Py_TYPE(self);
19431970
PyObject_GC_UnTrack(self);
19441971
ERROR_DECREF(self->errors);
@@ -2044,7 +2071,7 @@ _multibytecodec_clear(PyObject *mod)
20442071
static void
20452072
_multibytecodec_free(void *mod)
20462073
{
2047-
_multibytecodec_clear((PyObject *)mod);
2074+
(void)_multibytecodec_clear((PyObject *)mod);
20482075
}
20492076

20502077
#define CREATE_TYPE(module, type, spec) \

0 commit comments

Comments
 (0)