From 11a0d975974e55be3fefd4282eaa9a6558b3e72c Mon Sep 17 00:00:00 2001 From: marko1616 Date: Wed, 28 Aug 2024 00:50:28 +0800 Subject: [PATCH 1/3] Fix NULL ptr in _memory_release --- Objects/memoryobject.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 498a37c1a3d869..b4211143778377 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1102,6 +1102,10 @@ PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char orde static int _memory_release(PyMemoryViewObject *self) { + /* this could be NULL if there is a PickleBuffer in cyclic references */ + if(self->mbuf == NULL) + return 0; + if (self->flags & _Py_MEMORYVIEW_RELEASED) return 0; From 2c8af2afa2c37893f8693a268b9b458e65a75526 Mon Sep 17 00:00:00 2001 From: marko1616 Date: Wed, 28 Aug 2024 01:46:53 +0800 Subject: [PATCH 2/3] Change implementation --- Objects/memoryobject.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index b4211143778377..752b83fcaf9620 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1102,10 +1102,6 @@ PyBuffer_ToContiguous(void *buf, const Py_buffer *src, Py_ssize_t len, char orde static int _memory_release(PyMemoryViewObject *self) { - /* this could be NULL if there is a PickleBuffer in cyclic references */ - if(self->mbuf == NULL) - return 0; - if (self->flags & _Py_MEMORYVIEW_RELEASED) return 0; @@ -1168,8 +1164,8 @@ static int memory_clear(PyObject *_self) { PyMemoryViewObject *self = (PyMemoryViewObject *)_self; - (void)_memory_release(self); - Py_CLEAR(self->mbuf); + if(_memory_release(self) == 0) + Py_CLEAR(self->mbuf); return 0; } From 7fe3839a57f8fa2e916997c92492ab54f6d0fb6e Mon Sep 17 00:00:00 2001 From: marko1616 <45327989+marko1616@users.noreply.github.com> Date: Thu, 29 Aug 2024 00:58:12 +0800 Subject: [PATCH 3/3] Logging this case Co-authored-by: Victor Stinner --- Objects/memoryobject.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 752b83fcaf9620..adc7cb25a26157 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -1164,8 +1164,12 @@ static int memory_clear(PyObject *_self) { PyMemoryViewObject *self = (PyMemoryViewObject *)_self; - if(_memory_release(self) == 0) + if(_memory_release(self) == 0) { Py_CLEAR(self->mbuf); + } + else { + PyErr_FormatUnraisable("Exception ignored in memoryview clear"); + } return 0; }