Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b47e31d

Browse files
authored
Merge pull request #17468 from QuLogic/v3.2.x-cpp-leaks
FIX: leaks in C++ code on v3.2.x
2 parents 36d4576 + 8e13db1 commit b47e31d

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

src/_image_wrapper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ _get_transform_mesh(PyObject *py_affine, npy_intp *dims)
8585
PyObject *output_mesh =
8686
PyObject_CallMethod(
8787
py_inverse, (char *)"transform", (char *)"O",
88-
(char *)input_mesh.pyobj(), NULL);
88+
(char *)input_mesh.pyobj_steal(), NULL);
8989

9090
Py_DECREF(py_inverse);
9191

src/_png.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,11 +139,6 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
139139
numpy::array_view<unsigned char, 3> buffer;
140140
PyObject *filein;
141141
PyObject *metadata = NULL;
142-
PyObject *meta_key, *meta_val;
143-
png_text *text;
144-
Py_ssize_t pos = 0;
145-
int meta_pos = 0;
146-
Py_ssize_t meta_size;
147142
double dpi = 0;
148143
int compression = 6;
149144
int filter = -1;
@@ -274,15 +269,22 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
274269
PyErr_SetString(PyExc_TypeError, "metadata must be a dict or None");
275270
goto exit;
276271
}
277-
meta_size = PyDict_Size(metadata);
278-
text = new png_text[meta_size];
272+
273+
Py_ssize_t meta_size = PyDict_Size(metadata);
274+
png_text *text = new png_text[meta_size];
275+
PyObject *meta_key, *meta_val;
276+
Py_ssize_t pos = 0;
277+
int meta_pos = 0;
278+
std::vector<PyObject*> temp_strs;
279+
temp_strs.reserve(meta_size);
279280

280281
while (PyDict_Next(metadata, &pos, &meta_key, &meta_val)) {
281282
text[meta_pos].compression = PNG_TEXT_COMPRESSION_NONE;
282283
if (PyUnicode_Check(meta_key)) {
283284
PyObject *temp_key = PyUnicode_AsEncodedString(meta_key, "latin_1", "strict");
284285
if (temp_key != NULL) {
285286
text[meta_pos].key = PyBytes_AsString(temp_key);
287+
temp_strs.push_back(temp_key);
286288
}
287289
} else if (PyBytes_Check(meta_key)) {
288290
text[meta_pos].key = PyBytes_AsString(meta_key);
@@ -295,6 +297,7 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
295297
PyObject *temp_val = PyUnicode_AsEncodedString(meta_val, "latin_1", "strict");
296298
if (temp_val != NULL) {
297299
text[meta_pos].text = PyBytes_AsString(temp_val);
300+
temp_strs.push_back(temp_val);
298301
}
299302
} else if (PyBytes_Check(meta_val)) {
300303
text[meta_pos].text = PyBytes_AsString(meta_val);
@@ -307,6 +310,10 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
307310
meta_pos++;
308311
}
309312
png_set_text(png_ptr, info_ptr, text, meta_size);
313+
for (std::vector<PyObject*>::iterator it = temp_strs.begin();
314+
it != temp_strs.end(); ++it) {
315+
Py_DECREF(*it);
316+
}
310317
delete[] text;
311318
}
312319
#endif
@@ -339,8 +346,12 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
339346
png_write_end(png_ptr, info_ptr);
340347

341348
exit:
342-
if (png_ptr && info_ptr) {
343-
png_destroy_write_struct(&png_ptr, &info_ptr);
349+
if (png_ptr) {
350+
if (info_ptr) {
351+
png_destroy_write_struct(&png_ptr, &info_ptr);
352+
} else {
353+
png_destroy_write_struct(&png_ptr, NULL);
354+
}
344355
}
345356
if (PyErr_Occurred()) {
346357
Py_XDECREF(buff.str);

0 commit comments

Comments
 (0)