From d5a8c23d84f0fdfd86137c828e037c8254d1781a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:16:52 +0100 Subject: [PATCH 1/9] Add casts macros --- Modules/cjkcodecs/multibytecodec.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index 5b85e2e3de316d..ad6cc954e1f63a 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -72,6 +72,8 @@ typedef struct { PyObject *cjk_module; } MultibyteCodecObject; +#define _MultibyteCodec_CAST(op) ((MultibyteCodec *)(op)) +#define _MultibyteCodecObject_CAST(op) ((MultibyteCodecObject *)(op)) #define MultibyteCodec_Check(state, op) Py_IS_TYPE((op), state->multibytecodec_type) #define _MultibyteStatefulCodec_HEAD \ @@ -79,14 +81,18 @@ typedef struct { const MultibyteCodec *codec; \ MultibyteCodec_State state; \ PyObject *errors; + typedef struct { _MultibyteStatefulCodec_HEAD } MultibyteStatefulCodecContext; +#define _MultibyteStatefulCodecContext_CAST(op) ((MultibyteStatefulCodecContext *)(op)) + #define MAXENCPENDING 2 #define _MultibyteStatefulEncoder_HEAD \ _MultibyteStatefulCodec_HEAD \ PyObject *pending; + typedef struct { _MultibyteStatefulEncoder_HEAD } MultibyteStatefulEncoderContext; @@ -96,10 +102,14 @@ typedef struct { _MultibyteStatefulCodec_HEAD \ unsigned char pending[MAXDECPENDING]; \ Py_ssize_t pendingsize; + typedef struct { _MultibyteStatefulDecoder_HEAD } MultibyteStatefulDecoderContext; +#define _MultibyteStatefulEncoderContext_CAST(op) ((MultibyteStatefulEncoderContext *)(op)) +#define _MultibyteStatefulDecoderContext_CAST(op) ((MultibyteStatefulDecoderContext *)(op)) + typedef struct { _MultibyteStatefulEncoder_HEAD } MultibyteIncrementalEncoderObject; @@ -108,6 +118,9 @@ typedef struct { _MultibyteStatefulDecoder_HEAD } MultibyteIncrementalDecoderObject; +#define _MultibyteIncrementalEncoderObject_CAST(op) ((MultibyteIncrementalEncoderObject *)(op)) +#define _MultibyteIncrementalDecoderObject_CAST(op) ((MultibyteIncrementalDecoderObject *)(op)) + typedef struct { _MultibyteStatefulDecoder_HEAD PyObject *stream; @@ -118,6 +131,9 @@ typedef struct { PyObject *stream; } MultibyteStreamWriterObject; +#define _MultibyteStreamReaderObject_CAST(op) ((MultibyteStreamReaderObject *)(op)) +#define _MultibyteStreamWriterObject_CAST(op) ((MultibyteStreamWriterObject *)(op)) + /* positive values for illegal sequences */ #define MBERR_TOOSMALL (-1) /* insufficient output buffer space */ #define MBERR_TOOFEW (-2) /* incomplete input buffer */ From efff44626a86606eace10fadb3afd9d393c31cfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:19:32 +0100 Subject: [PATCH 2/9] fix UBSan failures for `MultibyteCodecObject` --- Modules/cjkcodecs/multibytecodec.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 53135ae4aa7968..2ddeff3d4cdca3 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -136,9 +136,10 @@ call_error_callback(PyObject *errors, PyObject *exc) } static PyObject * -codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored)) +codecctx_errors_get(PyObject *op, void *Py_UNUSED(closure)) { const char *errors; + MultibyteStatefulCodecContext *self = _MultibyteStatefulCodecContext_CAST(op); if (self->errors == ERROR_STRICT) errors = "strict"; @@ -154,11 +155,11 @@ codecctx_errors_get(MultibyteStatefulCodecContext *self, void *Py_UNUSED(ignored } static int -codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value, - void *closure) +codecctx_errors_set(PyObject *op, PyObject *value, void *Py_UNUSED(closure)) { PyObject *cb; const char *str; + MultibyteStatefulCodecContext *self = _MultibyteStatefulCodecContext_CAST(op); if (value == NULL) { PyErr_SetString(PyExc_AttributeError, "cannot delete attribute"); @@ -184,9 +185,8 @@ codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value, /* This getset handlers list is used by all the stateful codec objects */ static PyGetSetDef codecctx_getsets[] = { - {"errors", (getter)codecctx_errors_get, - (setter)codecctx_errors_set, - PyDoc_STR("how to treat errors")}, + {"errors", codecctx_errors_get, codecctx_errors_set, + PyDoc_STR("how to treat errors")}, {NULL,} }; @@ -719,22 +719,24 @@ static struct PyMethodDef multibytecodec_methods[] = { }; static int -multibytecodec_clear(MultibyteCodecObject *self) +multibytecodec_clear(PyObject *op) { + MultibyteCodecObject *self = _MultibyteCodecObject_CAST(op); Py_CLEAR(self->cjk_module); return 0; } 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(self->cjk_module); return 0; } static void -multibytecodec_dealloc(MultibyteCodecObject *self) +multibytecodec_dealloc(PyObject *self) { PyObject_GC_UnTrack(self); PyTypeObject *tp = Py_TYPE(self); From a9fe4985c9b82b11aee92c260856d8d02b952687 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:22:37 +0100 Subject: [PATCH 3/9] fix UBSan failures for `MultibyteIncrementalEncoderObject` --- Modules/cjkcodecs/multibytecodec.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 2ddeff3d4cdca3..0b420ed92bfe4f 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1108,17 +1108,18 @@ mbiencoder_init(PyObject *self, PyObject *args, PyObject *kwds) } static int -mbiencoder_traverse(MultibyteIncrementalEncoderObject *self, - visitproc visit, void *arg) +mbiencoder_traverse(PyObject *op, visitproc visit, void *arg) { + MultibyteIncrementalEncoderObject *self = _MultibyteIncrementalEncoderObject_CAST(op); if (ERROR_ISCUSTOM(self->errors)) Py_VISIT(self->errors); return 0; } static void -mbiencoder_dealloc(MultibyteIncrementalEncoderObject *self) +mbiencoder_dealloc(PyObject *op) { + MultibyteIncrementalEncoderObject *self = _MultibyteIncrementalEncoderObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); ERROR_DECREF(self->errors); From 9ed213b94a70beee6991802de7f165e0d91b1c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:23:39 +0100 Subject: [PATCH 4/9] fix UBSan failures for `MultibyteIncrementalDecoderObject` --- Modules/cjkcodecs/multibytecodec.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 0b420ed92bfe4f..98aae0a09adcd7 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1391,17 +1391,18 @@ mbidecoder_init(PyObject *self, PyObject *args, PyObject *kwds) } static int -mbidecoder_traverse(MultibyteIncrementalDecoderObject *self, - visitproc visit, void *arg) +mbidecoder_traverse(PyObject *op, visitproc visit, void *arg) { + MultibyteIncrementalDecoderObject *self = _MultibyteIncrementalDecoderObject_CAST(op); if (ERROR_ISCUSTOM(self->errors)) Py_VISIT(self->errors); return 0; } static void -mbidecoder_dealloc(MultibyteIncrementalDecoderObject *self) +mbidecoder_dealloc(PyObject *op) { + MultibyteIncrementalDecoderObject *self = _MultibyteIncrementalDecoderObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); ERROR_DECREF(self->errors); From 4bcb9b368e1a07bd12e4dbd0ca1b194442f5b4c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:24:28 +0100 Subject: [PATCH 5/9] fix UBSan failures for `MultibyteStreamReaderObject` --- Modules/cjkcodecs/multibytecodec.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 98aae0a09adcd7..cf50ed7b837ff4 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1708,9 +1708,9 @@ mbstreamreader_init(PyObject *self, PyObject *args, PyObject *kwds) } static int -mbstreamreader_traverse(MultibyteStreamReaderObject *self, - visitproc visit, void *arg) +mbstreamreader_traverse(PyObject *op, visitproc visit, void *arg) { + MultibyteStreamReaderObject *self = _MultibyteStreamReaderObject_CAST(op); if (ERROR_ISCUSTOM(self->errors)) Py_VISIT(self->errors); Py_VISIT(self->stream); @@ -1718,8 +1718,9 @@ mbstreamreader_traverse(MultibyteStreamReaderObject *self, } static void -mbstreamreader_dealloc(MultibyteStreamReaderObject *self) +mbstreamreader_dealloc(PyObject *op) { + MultibyteStreamReaderObject *self = _MultibyteStreamReaderObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); ERROR_DECREF(self->errors); From 0c6d52b154f3413643ae6cb0713c5b6fa9a918ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:25:47 +0100 Subject: [PATCH 6/9] fix UBSan failures for `MultibyteStreamWriterObject` --- Modules/cjkcodecs/multibytecodec.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index cf50ed7b837ff4..39c50eea302ad9 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -1932,9 +1932,9 @@ mbstreamwriter_init(PyObject *self, PyObject *args, PyObject *kwds) } static int -mbstreamwriter_traverse(MultibyteStreamWriterObject *self, - visitproc visit, void *arg) +mbstreamwriter_traverse(PyObject *op, visitproc visit, void *arg) { + MultibyteStreamWriterObject *self = _MultibyteStreamWriterObject_CAST(op); if (ERROR_ISCUSTOM(self->errors)) Py_VISIT(self->errors); Py_VISIT(self->stream); @@ -1942,8 +1942,9 @@ mbstreamwriter_traverse(MultibyteStreamWriterObject *self, } static void -mbstreamwriter_dealloc(MultibyteStreamWriterObject *self) +mbstreamwriter_dealloc(PyObject *op) { + MultibyteStreamWriterObject *self = _MultibyteStreamWriterObject_CAST(op); PyTypeObject *tp = Py_TYPE(self); PyObject_GC_UnTrack(self); ERROR_DECREF(self->errors); From 85b6e93793e314c8dcee08ab349ca70f4f93ac6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:26:32 +0100 Subject: [PATCH 7/9] suppress unused return values --- Modules/cjkcodecs/multibytecodec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 39c50eea302ad9..5b4df62c8ebd29 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -2050,7 +2050,7 @@ _multibytecodec_clear(PyObject *mod) static void _multibytecodec_free(void *mod) { - _multibytecodec_clear((PyObject *)mod); + (void)_multibytecodec_clear((PyObject *)mod); } #define CREATE_TYPE(module, type, spec) \ From eb6df00d710136fa218639ef3c7f1a62be2bab39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:28:45 +0100 Subject: [PATCH 8/9] fixup --- Modules/cjkcodecs/multibytecodec.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index ad6cc954e1f63a..a0e320c1c93eb2 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -86,7 +86,8 @@ typedef struct { _MultibyteStatefulCodec_HEAD } MultibyteStatefulCodecContext; -#define _MultibyteStatefulCodecContext_CAST(op) ((MultibyteStatefulCodecContext *)(op)) +#define _MultibyteStatefulCodecContext_CAST(op) \ + ((MultibyteStatefulCodecContext *)(op)) #define MAXENCPENDING 2 #define _MultibyteStatefulEncoder_HEAD \ From 97cd79b1a127b1594ab2ddf1bd19063733ec0e4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:31:09 +0100 Subject: [PATCH 9/9] Move cast macros to `.c` --- Modules/cjkcodecs/multibytecodec.c | 21 +++++++++++++++++++++ Modules/cjkcodecs/multibytecodec.h | 17 ----------------- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Modules/cjkcodecs/multibytecodec.c b/Modules/cjkcodecs/multibytecodec.c index 5b4df62c8ebd29..08b74740bda4bf 100644 --- a/Modules/cjkcodecs/multibytecodec.c +++ b/Modules/cjkcodecs/multibytecodec.c @@ -56,6 +56,27 @@ class _multibytecodec.MultibyteStreamWriter "MultibyteStreamWriterObject *" "cli /*[clinic end generated code: output=da39a3ee5e6b4b0d input=305a76dfdd24b99c]*/ #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 { PyObject *inobj; Py_ssize_t inpos, inlen; diff --git a/Modules/cjkcodecs/multibytecodec.h b/Modules/cjkcodecs/multibytecodec.h index a0e320c1c93eb2..5b85e2e3de316d 100644 --- a/Modules/cjkcodecs/multibytecodec.h +++ b/Modules/cjkcodecs/multibytecodec.h @@ -72,8 +72,6 @@ typedef struct { PyObject *cjk_module; } MultibyteCodecObject; -#define _MultibyteCodec_CAST(op) ((MultibyteCodec *)(op)) -#define _MultibyteCodecObject_CAST(op) ((MultibyteCodecObject *)(op)) #define MultibyteCodec_Check(state, op) Py_IS_TYPE((op), state->multibytecodec_type) #define _MultibyteStatefulCodec_HEAD \ @@ -81,19 +79,14 @@ typedef struct { const MultibyteCodec *codec; \ MultibyteCodec_State state; \ PyObject *errors; - typedef struct { _MultibyteStatefulCodec_HEAD } MultibyteStatefulCodecContext; -#define _MultibyteStatefulCodecContext_CAST(op) \ - ((MultibyteStatefulCodecContext *)(op)) - #define MAXENCPENDING 2 #define _MultibyteStatefulEncoder_HEAD \ _MultibyteStatefulCodec_HEAD \ PyObject *pending; - typedef struct { _MultibyteStatefulEncoder_HEAD } MultibyteStatefulEncoderContext; @@ -103,14 +96,10 @@ typedef struct { _MultibyteStatefulCodec_HEAD \ unsigned char pending[MAXDECPENDING]; \ Py_ssize_t pendingsize; - typedef struct { _MultibyteStatefulDecoder_HEAD } MultibyteStatefulDecoderContext; -#define _MultibyteStatefulEncoderContext_CAST(op) ((MultibyteStatefulEncoderContext *)(op)) -#define _MultibyteStatefulDecoderContext_CAST(op) ((MultibyteStatefulDecoderContext *)(op)) - typedef struct { _MultibyteStatefulEncoder_HEAD } MultibyteIncrementalEncoderObject; @@ -119,9 +108,6 @@ typedef struct { _MultibyteStatefulDecoder_HEAD } MultibyteIncrementalDecoderObject; -#define _MultibyteIncrementalEncoderObject_CAST(op) ((MultibyteIncrementalEncoderObject *)(op)) -#define _MultibyteIncrementalDecoderObject_CAST(op) ((MultibyteIncrementalDecoderObject *)(op)) - typedef struct { _MultibyteStatefulDecoder_HEAD PyObject *stream; @@ -132,9 +118,6 @@ typedef struct { PyObject *stream; } MultibyteStreamWriterObject; -#define _MultibyteStreamReaderObject_CAST(op) ((MultibyteStreamReaderObject *)(op)) -#define _MultibyteStreamWriterObject_CAST(op) ((MultibyteStreamWriterObject *)(op)) - /* positive values for illegal sequences */ #define MBERR_TOOSMALL (-1) /* insufficient output buffer space */ #define MBERR_TOOFEW (-2) /* incomplete input buffer */