mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
gh-111178: fix UBSan failures in Modules/cjkcodecs/multibytecodec.c
(gh-129090)
This commit is contained in:
parent
9abbb58e3f
commit
f10b7b29cb
1 changed files with 49 additions and 22 deletions
|
@ -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) \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue