Commit ae1f0127 authored by Sergey Fedoseev's avatar Sergey Fedoseev Committed by Serhiy Storchaka

bpo-34395: Fix memory leaks caused by incautious usage of PyMem_Realloc(). (GH-8785)

parent 2ec530cd
...@@ -565,24 +565,23 @@ parse_save_field(ReaderObj *self) ...@@ -565,24 +565,23 @@ parse_save_field(ReaderObj *self)
static int static int
parse_grow_buff(ReaderObj *self) parse_grow_buff(ReaderObj *self)
{ {
if (self->field_size == 0) { unsigned field_size_new;
self->field_size = 4096; char *field_new;
if (self->field != NULL)
PyMem_Free(self->field); assert((unsigned)self->field_size <= INT_MAX);
self->field = PyMem_Malloc(self->field_size);
} field_size_new = self->field_size ? 2 * (unsigned)self->field_size : 4096;
else { if (field_size_new > INT_MAX) {
if (self->field_size > INT_MAX / 2) { PyErr_NoMemory();
PyErr_NoMemory(); return 0;
return 0;
}
self->field_size *= 2;
self->field = PyMem_Realloc(self->field, self->field_size);
} }
if (self->field == NULL) { field_new = (char *)PyMem_Realloc(self->field, field_size_new);
if (field_new == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
return 0; return 0;
} }
self->field = field_new;
self->field_size = (int)field_size_new;
return 1; return 1;
} }
...@@ -1088,31 +1087,24 @@ join_append_data(WriterObj *self, char *field, int quote_empty, ...@@ -1088,31 +1087,24 @@ join_append_data(WriterObj *self, char *field, int quote_empty,
static int static int
join_check_rec_size(WriterObj *self, int rec_len) join_check_rec_size(WriterObj *self, int rec_len)
{ {
unsigned rec_size_new;
char *rec_new;
if (rec_len < 0 || rec_len > INT_MAX - MEM_INCR) { assert(rec_len >= 0);
PyErr_NoMemory();
return 0;
}
if (rec_len > self->rec_size) { if (rec_len > self->rec_size) {
if (self->rec_size == 0) { rec_size_new = (unsigned)(rec_len / MEM_INCR + 1) * MEM_INCR;
self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR; if (rec_size_new > INT_MAX) {
if (self->rec != NULL) PyErr_NoMemory();
PyMem_Free(self->rec); return 0;
self->rec = PyMem_Malloc(self->rec_size);
}
else {
char *old_rec = self->rec;
self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR;
self->rec = PyMem_Realloc(self->rec, self->rec_size);
if (self->rec == NULL)
PyMem_Free(old_rec);
} }
if (self->rec == NULL) { rec_new = (char *)PyMem_Realloc(self->rec, rec_size_new);
if (rec_new == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
return 0; return 0;
} }
self->rec = rec_new;
self->rec_size = (int)rec_size_new;
} }
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment