]> granicus.if.org Git - php/commitdiff
replaced static gdPngJmpbufStruct, which is afraid of being shared with
authorTakeshi Abe <tabe@php.net>
Wed, 1 Apr 2009 16:05:17 +0000 (16:05 +0000)
committerTakeshi Abe <tabe@php.net>
Wed, 1 Apr 2009 16:05:17 +0000 (16:05 +0000)
several threads, by a couple of auto variables.

ext/gd/libgd/gd_png.c

index 296f93431019dddc006e47b8597505cbbe3cafbf..6eff1b1dbe6678510d54c196169c6e3db8bac39c 100644 (file)
@@ -41,14 +41,12 @@ const char * gdPngGetVersionString()
        return PNG_LIBPNG_VER_STRING;
 }
 
-#ifndef PNG_SETJMP_NOT_SUPPORTED
+#ifdef PNG_SETJMP_SUPPORTED
 typedef struct _jmpbuf_wrapper
 {
        jmp_buf jmpbuf;
 } jmpbuf_wrapper;
 
-static jmpbuf_wrapper gdPngJmpbufStruct;
-
 static void gdPngErrorHandler (png_structp png_ptr, png_const_charp msg)
 {
        jmpbuf_wrapper *jmpbuf_ptr;
@@ -117,6 +115,9 @@ gdImagePtr gdImageCreateFromPngPtr (int size, void *data)
 gdImagePtr gdImageCreateFromPngCtx (gdIOCtx * infile)
 {
        png_byte sig[8];
+#ifdef PNG_SETJMP_SUPPORTED
+       jmpbuf_wrapper jbw;
+#endif
        png_structp png_ptr;
        png_infop info_ptr;
        png_uint_32 width, height, rowbytes, w, h;
@@ -148,8 +149,8 @@ gdImagePtr gdImageCreateFromPngCtx (gdIOCtx * infile)
                return NULL;
        }
 
-#ifndef PNG_SETJMP_NOT_SUPPORTED
-       png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, &gdPngJmpbufStruct, gdPngErrorHandler, NULL);
+#ifdef PNG_SETJMP_SUPPORTED
+       png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, &jbw, gdPngErrorHandler, NULL);
 #else
        png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
 #endif
@@ -174,8 +175,8 @@ gdImagePtr gdImageCreateFromPngCtx (gdIOCtx * infile)
        /* setjmp() must be called in every non-callback function that calls a
         * PNG-reading libpng function
         */
-#ifndef PNG_SETJMP_NOT_SUPPORTED
-       if (setjmp(gdPngJmpbufStruct.jmpbuf)) {
+#ifdef PNG_SETJMP_SUPPORTED
+       if (setjmp(jbw.jmpbuf)) {
                php_gd_error("gd-png error: setjmp returns error condition");
                png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
 
@@ -198,8 +199,6 @@ gdImagePtr gdImageCreateFromPngCtx (gdIOCtx * infile)
        if (im == NULL) {
                php_gd_error("gd-png error: cannot allocate gdImage struct");
                png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
-               gdFree(image_data);
-               gdFree(row_pointers);
 
                return NULL;
        }
@@ -213,8 +212,8 @@ gdImagePtr gdImageCreateFromPngCtx (gdIOCtx * infile)
        /* setjmp() must be called in every non-callback function that calls a
         * PNG-reading libpng function
         */
-#ifndef PNG_SETJMP_NOT_SUPPORTED
-       if (setjmp(gdPngJmpbufStruct.jmpbuf)) {
+#ifdef PNG_SETJMP_SUPPORTED
+       if (setjmp(jbw.jmpbuf)) {
                php_gd_error("gd-png error: setjmp returns error condition");
                png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
                gdFree(image_data);
@@ -476,9 +475,10 @@ void gdImagePngCtxEx (gdImagePtr im, gdIOCtx * outfile, int level, int basefilte
        png_infop info_ptr;
        volatile int transparent = im->transparent;
        volatile int remap = FALSE;
+#ifdef PNG_SETJMP_SUPPORTED
+       jmpbuf_wrapper jbw;
 
-#ifndef PNG_SETJMP_NOT_SUPPORTED
-       png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, &gdPngJmpbufStruct, gdPngErrorHandler, NULL);
+       png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, &jbw, gdPngErrorHandler, NULL);
 #else
        png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
 #endif
@@ -495,8 +495,8 @@ void gdImagePngCtxEx (gdImagePtr im, gdIOCtx * outfile, int level, int basefilte
                return;
     }
 
-#ifndef PNG_SETJMP_NOT_SUPPORTED
-       if (setjmp (gdPngJmpbufStruct.jmpbuf)) {
+#ifdef PNG_SETJMP_SUPPORTED
+       if (setjmp(jbw.jmpbuf)) {
                php_gd_error("gd-png error: setjmp returns error condition");
                png_destroy_write_struct (&png_ptr, &info_ptr);