gh-111178: fix UBSan failures in Modules/cjkcodecs/multibytecodec.c (gh-129090)

This commit is contained in:
Bénédikt Tran 2025-01-25 02:04:31 +01:00 committed by GitHub
parent 9abbb58e3f
commit f10b7b29cb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -56,6 +56,27 @@ class _multibytecodec.MultibyteStreamWriter "MultibyteStreamWriterObject *" "cli
/*[clinic end generated code: output=da39a3ee5e6b4b0d input=305a76dfdd24b99c]*/ /*[clinic end generated code: output=da39a3ee5e6b4b0d input=305a76dfdd24b99c]*/
#undef clinic_get_state #undef clinic_get_state
#define _MultibyteCodec_CAST(op) ((MultibyteCodec *)(op))
#define _MultibyteCodecObject_CAST(op) ((MultibyteCodecObject *)(op))
#define _MultibyteStatefulCodecContext_CAST(op) \
((MultibyteStatefulCodecContext *)(op))
#define _MultibyteStatefulEncoderContext_CAST(op) \
((MultibyteStatefulEncoderContext *)(op))
#define _MultibyteStatefulDecoderContext_CAST(op) \
((MultibyteStatefulDecoderContext *)(op))
#define _MultibyteIncrementalEncoderObject_CAST(op) \
((MultibyteIncrementalEncoderObject *)(op))
#define _MultibyteIncrementalDecoderObject_CAST(op) \
((MultibyteIncrementalDecoderObject *)(op))
#define _MultibyteStreamReaderObject_CAST(op) \
((MultibyteStreamReaderObject *)(op))
#define _MultibyteStreamWriterObject_CAST(op) \
((MultibyteStreamWriterObject *)(op))
typedef struct { typedef struct {
PyObject *inobj; PyObject *inobj;
Py_ssize_t inpos, inlen; Py_ssize_t inpos, inlen;
@ -136,9 +157,10 @@ call_error_callback(PyObject *errors, PyObject *exc)
} }
static PyObject * static PyObject *
codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored)) codecctx_errors_get(PyObject *op, void *Py_UNUSED(closure))
{ {
const char *errors; const char *errors;
MultibyteStatefulCodecContext *self = _MultibyteStatefulCodecContext_CAST(op);
if (self->errors == ERROR_STRICT) if (self->errors == ERROR_STRICT)
errors = "strict"; errors = "strict";
@ -154,11 +176,11 @@ codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored
} }
static int static int
codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value, codecctx_errors_set(PyObject *op, PyObject *value, void *Py_UNUSED(closure))
void *closure)
{ {
PyObject *cb; PyObject *cb;
const char *str; const char *str;
MultibyteStatefulCodecContext *self = _MultibyteStatefulCodecContext_CAST(op);
if (value == NULL) { if (value == NULL) {
PyErr_SetString(PyExc_AttributeError, "cannot delete attribute"); PyErr_SetString(PyExc_AttributeError, "cannot delete attribute");
@ -184,9 +206,8 @@ codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value,
/* This getset handlers list is used by all the stateful codec objects */ /* This getset handlers list is used by all the stateful codec objects */
static PyGetSetDef codecctx_getsets[] = { static PyGetSetDef codecctx_getsets[] = {
{"errors", (getter)codecctx_errors_get, {"errors", codecctx_errors_get, codecctx_errors_set,
(setter)codecctx_errors_set, PyDoc_STR("how to treat errors")},
PyDoc_STR("how to treat errors")},
{NULL,} {NULL,}
}; };
@ -719,22 +740,24 @@ static struct PyMethodDef multibytecodec_methods[] = {
}; };
static int static int
multibytecodec_clear(MultibyteCodecObject *self) multibytecodec_clear(PyObject *op)
{ {
MultibyteCodecObject *self = _MultibyteCodecObject_CAST(op);
Py_CLEAR(self->cjk_module); Py_CLEAR(self->cjk_module);
return 0; return 0;
} }
static int static int
multibytecodec_traverse(MultibyteCodecObject *self, visitproc visit, void *arg) multibytecodec_traverse(PyObject *op, visitproc visit, void *arg)
{ {
MultibyteCodecObject *self = _MultibyteCodecObject_CAST(op);
Py_VISIT(Py_TYPE(self)); Py_VISIT(Py_TYPE(self));
Py_VISIT(self->cjk_module); Py_VISIT(self->cjk_module);
return 0; return 0;
} }
static void static void
multibytecodec_dealloc(MultibyteCodecObject *self) multibytecodec_dealloc(PyObject *self)
{ {
PyObject_GC_UnTrack(self); PyObject_GC_UnTrack(self);
PyTypeObject *tp = Py_TYPE(self); PyTypeObject *tp = Py_TYPE(self);
@ -1106,17 +1129,18 @@ mbiencoder_init(PyObject *self, PyObject *args, PyObject *kwds)
} }
static int static int
mbiencoder_traverse(MultibyteIncrementalEncoderObject *self, mbiencoder_traverse(PyObject *op, visitproc visit, void *arg)
visitproc visit, void *arg)
{ {
MultibyteIncrementalEncoderObject *self = _MultibyteIncrementalEncoderObject_CAST(op);
if (ERROR_ISCUSTOM(self->errors)) if (ERROR_ISCUSTOM(self->errors))
Py_VISIT(self->errors); Py_VISIT(self->errors);
return 0; return 0;
} }
static void static void
mbiencoder_dealloc(MultibyteIncrementalEncoderObject *self) mbiencoder_dealloc(PyObject *op)
{ {
MultibyteIncrementalEncoderObject *self = _MultibyteIncrementalEncoderObject_CAST(op);
PyTypeObject *tp = Py_TYPE(self); PyTypeObject *tp = Py_TYPE(self);
PyObject_GC_UnTrack(self); PyObject_GC_UnTrack(self);
ERROR_DECREF(self->errors); ERROR_DECREF(self->errors);
@ -1388,17 +1412,18 @@ mbidecoder_init(PyObject *self, PyObject *args, PyObject *kwds)
} }
static int static int
mbidecoder_traverse(MultibyteIncrementalDecoderObject *self, mbidecoder_traverse(PyObject *op, visitproc visit, void *arg)
visitproc visit, void *arg)
{ {
MultibyteIncrementalDecoderObject *self = _MultibyteIncrementalDecoderObject_CAST(op);
if (ERROR_ISCUSTOM(self->errors)) if (ERROR_ISCUSTOM(self->errors))
Py_VISIT(self->errors); Py_VISIT(self->errors);
return 0; return 0;
} }
static void static void
mbidecoder_dealloc(MultibyteIncrementalDecoderObject *self) mbidecoder_dealloc(PyObject *op)
{ {
MultibyteIncrementalDecoderObject *self = _MultibyteIncrementalDecoderObject_CAST(op);
PyTypeObject *tp = Py_TYPE(self); PyTypeObject *tp = Py_TYPE(self);
PyObject_GC_UnTrack(self); PyObject_GC_UnTrack(self);
ERROR_DECREF(self->errors); ERROR_DECREF(self->errors);
@ -1704,9 +1729,9 @@ mbstreamreader_init(PyObject *self, PyObject *args, PyObject *kwds)
} }
static int static int
mbstreamreader_traverse(MultibyteStreamReaderObject *self, mbstreamreader_traverse(PyObject *op, visitproc visit, void *arg)
visitproc visit, void *arg)
{ {
MultibyteStreamReaderObject *self = _MultibyteStreamReaderObject_CAST(op);
if (ERROR_ISCUSTOM(self->errors)) if (ERROR_ISCUSTOM(self->errors))
Py_VISIT(self->errors); Py_VISIT(self->errors);
Py_VISIT(self->stream); Py_VISIT(self->stream);
@ -1714,8 +1739,9 @@ mbstreamreader_traverse(MultibyteStreamReaderObject *self,
} }
static void static void
mbstreamreader_dealloc(MultibyteStreamReaderObject *self) mbstreamreader_dealloc(PyObject *op)
{ {
MultibyteStreamReaderObject *self = _MultibyteStreamReaderObject_CAST(op);
PyTypeObject *tp = Py_TYPE(self); PyTypeObject *tp = Py_TYPE(self);
PyObject_GC_UnTrack(self); PyObject_GC_UnTrack(self);
ERROR_DECREF(self->errors); ERROR_DECREF(self->errors);
@ -1927,9 +1953,9 @@ mbstreamwriter_init(PyObject *self, PyObject *args, PyObject *kwds)
} }
static int static int
mbstreamwriter_traverse(MultibyteStreamWriterObject *self, mbstreamwriter_traverse(PyObject *op, visitproc visit, void *arg)
visitproc visit, void *arg)
{ {
MultibyteStreamWriterObject *self = _MultibyteStreamWriterObject_CAST(op);
if (ERROR_ISCUSTOM(self->errors)) if (ERROR_ISCUSTOM(self->errors))
Py_VISIT(self->errors); Py_VISIT(self->errors);
Py_VISIT(self->stream); Py_VISIT(self->stream);
@ -1937,8 +1963,9 @@ mbstreamwriter_traverse(MultibyteStreamWriterObject *self,
} }
static void static void
mbstreamwriter_dealloc(MultibyteStreamWriterObject *self) mbstreamwriter_dealloc(PyObject *op)
{ {
MultibyteStreamWriterObject *self = _MultibyteStreamWriterObject_CAST(op);
PyTypeObject *tp = Py_TYPE(self); PyTypeObject *tp = Py_TYPE(self);
PyObject_GC_UnTrack(self); PyObject_GC_UnTrack(self);
ERROR_DECREF(self->errors); ERROR_DECREF(self->errors);
@ -2044,7 +2071,7 @@ _multibytecodec_clear(PyObject *mod)
static void static void
_multibytecodec_free(void *mod) _multibytecodec_free(void *mod)
{ {
_multibytecodec_clear((PyObject *)mod); (void)_multibytecodec_clear((PyObject *)mod);
} }
#define CREATE_TYPE(module, type, spec) \ #define CREATE_TYPE(module, type, spec) \