From f973151ea6f7a613ec6ef6976b9af5c9e37d1aad Mon Sep 17 00:00:00 2001 From: Eclips4 Date: Sat, 20 May 2023 20:51:37 +0300 Subject: [PATCH 1/5] gh-104698: Fix reference leak in mmapmodule.c --- Modules/mmapmodule.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 8e5a0bde889901..27711742286546 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -227,6 +227,14 @@ do { \ return err; \ } \ } while (0) +#define CHECK_VALID_AND_RELEASE(err, buffer) \ +do { \ + if (self->map_handle == NULL) { \ + PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ + PyBuffer_Release(&buffer); \ + return err; \ + } \ +} while (0) #endif /* MS_WINDOWS */ #ifdef UNIX @@ -237,6 +245,14 @@ do { \ return err; \ } \ } while (0) +#define CHECK_VALID_AND_RELEASE(err, buffer) \ +do { \ + if (self->data == NULL) { \ + PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ + PyBuffer_Release(&buffer); \ + return err; \ + } \ +} while (0) #endif /* UNIX */ static PyObject * @@ -326,7 +342,7 @@ mmap_gfind(mmap_object *self, end = self->size; Py_ssize_t res; - CHECK_VALID(NULL); + CHECK_VALID_AND_RELEASE(NULL, view); if (reverse) { res = _PyBytes_ReverseFind( self->data + start, end - start, @@ -403,7 +419,7 @@ mmap_write_method(mmap_object *self, return NULL; } - CHECK_VALID(NULL); + CHECK_VALID_AND_RELEASE(NULL, data); memcpy(&self->data[self->pos], data.buf, data.len); self->pos += data.len; PyBuffer_Release(&data); @@ -1087,7 +1103,7 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) return -1; } - CHECK_VALID(-1); + CHECK_VALID_AND_RELEASE(-1, vbuf); if (slicelen == 0) { } else if (step == 1) { From 42a4cb1591107735ac28f8c1068aa7e1129324d7 Mon Sep 17 00:00:00 2001 From: Eclips4 Date: Sat, 20 May 2023 21:05:58 +0300 Subject: [PATCH 2/5] Rename macro --- Modules/mmapmodule.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 27711742286546..bba303c63e2d17 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -227,7 +227,7 @@ do { \ return err; \ } \ } while (0) -#define CHECK_VALID_AND_RELEASE(err, buffer) \ +#define CHECK_VALID_OR_RELEASE(err, buffer) \ do { \ if (self->map_handle == NULL) { \ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ @@ -245,7 +245,7 @@ do { \ return err; \ } \ } while (0) -#define CHECK_VALID_AND_RELEASE(err, buffer) \ +#define CHECK_VALID_OR_RELEASE(err, buffer) \ do { \ if (self->data == NULL) { \ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ @@ -342,7 +342,7 @@ mmap_gfind(mmap_object *self, end = self->size; Py_ssize_t res; - CHECK_VALID_AND_RELEASE(NULL, view); + CHECK_VALID_OR_RELEASE(NULL, view); if (reverse) { res = _PyBytes_ReverseFind( self->data + start, end - start, @@ -419,7 +419,7 @@ mmap_write_method(mmap_object *self, return NULL; } - CHECK_VALID_AND_RELEASE(NULL, data); + CHECK_VALID_OR_RELEASE(NULL, data); memcpy(&self->data[self->pos], data.buf, data.len); self->pos += data.len; PyBuffer_Release(&data); @@ -1103,7 +1103,7 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value) return -1; } - CHECK_VALID_AND_RELEASE(-1, vbuf); + CHECK_VALID_OR_RELEASE(-1, vbuf); if (slicelen == 0) { } else if (step == 1) { From a4341c7d16512f4df16718e6f3ab59d5e9a7a7b6 Mon Sep 17 00:00:00 2001 From: Eclips4 Date: Sat, 20 May 2023 22:06:58 +0300 Subject: [PATCH 3/5] Adjust slash position in macro definition --- Modules/mmapmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index bba303c63e2d17..8ae2124f17281d 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -227,7 +227,7 @@ do { \ return err; \ } \ } while (0) -#define CHECK_VALID_OR_RELEASE(err, buffer) \ +#define CHECK_VALID_OR_RELEASE(err, buffer) \ do { \ if (self->map_handle == NULL) { \ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ @@ -245,7 +245,7 @@ do { \ return err; \ } \ } while (0) -#define CHECK_VALID_OR_RELEASE(err, buffer) \ +#define CHECK_VALID_OR_RELEASE(err, buffer) \ do { \ if (self->data == NULL) { \ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ From 1162ef011e0e14178f306f377fa428351821831c Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sat, 20 May 2023 16:48:23 -0700 Subject: [PATCH 4/5] Update Modules/mmapmodule.c --- Modules/mmapmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 8ae2124f17281d..4ce8bd229b2d67 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -231,8 +231,8 @@ do { \ do { \ if (self->map_handle == NULL) { \ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ - PyBuffer_Release(&buffer); \ - return err; \ + PyBuffer_Release(&(buffer)); \ + return (err); \ } \ } while (0) #endif /* MS_WINDOWS */ From 80cd03250f04de2f50029edd0e75105d181546e5 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Sat, 20 May 2023 16:48:30 -0700 Subject: [PATCH 5/5] Update Modules/mmapmodule.c --- Modules/mmapmodule.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c index 4ce8bd229b2d67..6bde9939eaa2ca 100644 --- a/Modules/mmapmodule.c +++ b/Modules/mmapmodule.c @@ -249,8 +249,8 @@ do { \ do { \ if (self->data == NULL) { \ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \ - PyBuffer_Release(&buffer); \ - return err; \ + PyBuffer_Release(&(buffer)); \ + return (err); \ } \ } while (0) #endif /* UNIX */