@@ -235,6 +235,14 @@ do { \
235
235
return err; \
236
236
} \
237
237
} while (0)
238
+ #define CHECK_VALID_OR_RELEASE (err , buffer ) \
239
+ do { \
240
+ if (self->map_handle == NULL) { \
241
+ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \
242
+ PyBuffer_Release(&(buffer)); \
243
+ return (err); \
244
+ } \
245
+ } while (0)
238
246
#endif /* MS_WINDOWS */
239
247
240
248
#ifdef UNIX
@@ -245,6 +253,14 @@ do { \
245
253
return err; \
246
254
} \
247
255
} while (0)
256
+ #define CHECK_VALID_OR_RELEASE (err , buffer ) \
257
+ do { \
258
+ if (self->data == NULL) { \
259
+ PyErr_SetString(PyExc_ValueError, "mmap closed or invalid"); \
260
+ PyBuffer_Release(&(buffer)); \
261
+ return (err); \
262
+ } \
263
+ } while (0)
248
264
#endif /* UNIX */
249
265
250
266
static PyObject *
@@ -334,7 +350,7 @@ mmap_gfind(mmap_object *self,
334
350
end = self -> size ;
335
351
336
352
Py_ssize_t res ;
337
- CHECK_VALID (NULL );
353
+ CHECK_VALID_OR_RELEASE (NULL , view );
338
354
if (reverse ) {
339
355
res = _PyBytes_ReverseFind (
340
356
self -> data + start , end - start ,
@@ -411,7 +427,7 @@ mmap_write_method(mmap_object *self,
411
427
return NULL ;
412
428
}
413
429
414
- CHECK_VALID (NULL );
430
+ CHECK_VALID_OR_RELEASE (NULL , data );
415
431
memcpy (& self -> data [self -> pos ], data .buf , data .len );
416
432
self -> pos += data .len ;
417
433
PyBuffer_Release (& data );
@@ -1097,7 +1113,7 @@ mmap_ass_subscript(mmap_object *self, PyObject *item, PyObject *value)
1097
1113
return -1 ;
1098
1114
}
1099
1115
1100
- CHECK_VALID (-1 );
1116
+ CHECK_VALID_OR_RELEASE (-1 , vbuf );
1101
1117
if (slicelen == 0 ) {
1102
1118
}
1103
1119
else if (step == 1 ) {
0 commit comments