diff --git a/src/imageext.c b/src/imageext.c
index 80bce59..91c8edb 100644
--- a/src/imageext.c
+++ b/src/imageext.c
@@ -157,11 +157,15 @@ image_load_ext (PyObject* self, PyObject* arg)
#ifdef PNG_H
static int
-write_png (char *file_name, png_bytep *rows, int w, int h, int colortype,
+write_png (const char *file_name,
+ png_bytep *rows,
+ int w,
+ int h,
+ int colortype,
int bitdepth)
{
- png_structp png_ptr;
- png_infop info_ptr;
+ png_structp png_ptr = NULL;
+ png_infop info_ptr = NULL;
FILE *fp = NULL;
char *doing = "open for writing";
@@ -199,9 +203,20 @@ write_png (char *file_name, png_bytep *rows, int w, int h, int colortype,
doing = "closing file";
if(0 != fclose (fp))
goto fail;
+ png_destroy_write_struct(&png_ptr, &info_ptr);
return 0;
fail:
+ /*
+ * I don't see how to handle the case where png_ptr
+ * was allocated but info_ptr was not. However, those
+ * calls should only fail if memory is out and you are
+ * probably screwed regardless then. The resulting memory
+ * leak is the least of your concerns.
+ */
+ if( png_ptr && info_ptr ) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ }
SDL_SetError ("SavePNG: could not %s", doing);
return -1;
}