[Python-checkins] gh-104698: Fix reference leak in mmapmodule.c (#104700)

pablogsal webhook-mailer at python.org
Sat May 20 20:20:03 EDT 2023


https://github.com/python/cpython/commit/99b641886a09252bbcf99a1d322fa8734f1ca30d
commit: 99b641886a09252bbcf99a1d322fa8734f1ca30d
branch: main
author: Kirill Podoprigora <kirill.bast9 at mail.ru>
committer: pablogsal <Pablogsal at gmail.com>
date: 2023-05-21T01:19:56+01:00
summary:

gh-104698: Fix reference leak in mmapmodule.c (#104700)

Co-authored-by: Jelle Zijlstra <jelle.zijlstra at gmail.com>

files:
M Modules/mmapmodule.c

diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index 8e5a0bde8899..6bde9939eaa2 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -227,6 +227,14 @@ do {                                                                    \
     return err;                                                         \
     }                                                                   \
 } while (0)
+#define CHECK_VALID_OR_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_OR_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_OR_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_OR_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_OR_RELEASE(-1, vbuf);
         if (slicelen == 0) {
         }
         else if (step == 1) {



More information about the Python-checkins mailing list