@@ -139,11 +139,6 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
139
139
numpy::array_view<unsigned char , 3 > buffer;
140
140
PyObject *filein;
141
141
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;
147
142
double dpi = 0 ;
148
143
int compression = 6 ;
149
144
int filter = -1 ;
@@ -274,15 +269,22 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
274
269
PyErr_SetString (PyExc_TypeError, " metadata must be a dict or None" );
275
270
goto exit ;
276
271
}
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);
279
280
280
281
while (PyDict_Next (metadata, &pos, &meta_key, &meta_val)) {
281
282
text[meta_pos].compression = PNG_TEXT_COMPRESSION_NONE;
282
283
if (PyUnicode_Check (meta_key)) {
283
284
PyObject *temp_key = PyUnicode_AsEncodedString (meta_key, " latin_1" , " strict" );
284
285
if (temp_key != NULL ) {
285
286
text[meta_pos].key = PyBytes_AsString (temp_key);
287
+ temp_strs.push_back (temp_key);
286
288
}
287
289
} else if (PyBytes_Check (meta_key)) {
288
290
text[meta_pos].key = PyBytes_AsString (meta_key);
@@ -295,6 +297,7 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
295
297
PyObject *temp_val = PyUnicode_AsEncodedString (meta_val, " latin_1" , " strict" );
296
298
if (temp_val != NULL ) {
297
299
text[meta_pos].text = PyBytes_AsString (temp_val);
300
+ temp_strs.push_back (temp_val);
298
301
}
299
302
} else if (PyBytes_Check (meta_val)) {
300
303
text[meta_pos].text = PyBytes_AsString (meta_val);
@@ -307,6 +310,10 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
307
310
meta_pos++;
308
311
}
309
312
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
+ }
310
317
delete[] text;
311
318
}
312
319
#endif
@@ -339,8 +346,12 @@ static PyObject *Py_write_png(PyObject *self, PyObject *args, PyObject *kwds)
339
346
png_write_end (png_ptr, info_ptr);
340
347
341
348
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
+ }
344
355
}
345
356
if (PyErr_Occurred ()) {
346
357
Py_XDECREF (buff.str );
0 commit comments