]> granicus.if.org Git - php/commitdiff
Sync with upstream
authorChristoph M. Becker <cmbecker69@gmx.de>
Sat, 19 Jan 2019 09:35:39 +0000 (10:35 +0100)
committerChristoph M. Becker <cmbecker69@gmx.de>
Sat, 19 Jan 2019 10:30:12 +0000 (11:30 +0100)
Even though libgd/libgd#492 is not a relevant bug fix for PHP, since
the binding doesn't use the `gdImage*Ptr()` functions at all, we're
porting the fix to stay in sync here.

ext/gd/libgd/gd_gif_out.c
ext/gd/libgd/gd_jpeg.c
ext/gd/libgd/gd_wbmp.c

index 1f2a6b936a36f5279dcbfac39e64af4852ddc1b2..2e1f38af70477f91277a55fcb7f955a5f3cc3cea 100644 (file)
@@ -97,12 +97,18 @@ static void cl_hash (register count_int chsize, GifCtx *ctx);
 static void char_init (GifCtx *ctx);
 static void char_out (int c, GifCtx *ctx);
 static void flush_char (GifCtx *ctx);
+
+static int _gdImageGifCtx(gdImagePtr im, gdIOCtxPtr out);
+
 void * gdImageGifPtr (gdImagePtr im, int *size)
 {
   void *rv;
   gdIOCtx *out = gdNewDynamicCtx (2048, NULL);
-  gdImageGifCtx (im, out);
-  rv = gdDPExtractData (out, size);
+       if (!_gdImageGifCtx(im, out)) {
+               rv = gdDPExtractData(out, size);
+       } else {
+               rv = NULL;
+       }
   out->gd_free (out);
   return rv;
 }
@@ -115,6 +121,12 @@ void gdImageGif (gdImagePtr im, FILE * outFile)
 }
 
 void gdImageGifCtx(gdImagePtr im, gdIOCtxPtr out)
+{
+       _gdImageGifCtx(im, out);
+}
+
+/* returns 0 on success, 1 on failure */
+static int _gdImageGifCtx(gdImagePtr im, gdIOCtxPtr out)
 {
        gdImagePtr pim = 0, tim = im;
        int interlace, BitsPerPixel;
@@ -125,7 +137,7 @@ void gdImageGifCtx(gdImagePtr im, gdIOCtxPtr out)
                        based temporary image. */
                pim = gdImageCreatePaletteFromTrueColor(im, 1, 256);
                if (!pim) {
-                       return;
+                       return 1;
                }
                tim = pim;
        }
@@ -138,6 +150,8 @@ void gdImageGifCtx(gdImagePtr im, gdIOCtxPtr out)
                /* Destroy palette based temporary image. */
                gdImageDestroy( pim);
        }
+
+    return 0;
 }
 
 static int
index 8cf71fcbc9ddab87a60c8b250aeb689f057dda60..ef46c4a22cf03e6583b90295b63b06405e4ae63e 100644 (file)
@@ -132,6 +132,7 @@ const char * gdJpegGetVersionString()
        }
 }
 
+static int _gdImageJpegCtx(gdImagePtr im, gdIOCtx *outfile, int quality);
 
 /*
  * Write IM to OUTFILE as a JFIF-formatted JPEG image, using quality
@@ -153,8 +154,11 @@ void *gdImageJpegPtr (gdImagePtr im, int *size, int quality)
 {
        void *rv;
        gdIOCtx *out = gdNewDynamicCtx (2048, NULL);
-       gdImageJpegCtx (im, out, quality);
-       rv = gdDPExtractData (out, size);
+       if (!_gdImageJpegCtx(im, out, quality)) {
+               rv = gdDPExtractData(out, size);
+       } else {
+               rv = NULL;
+       }
        out->gd_free (out);
 
        return rv;
@@ -163,6 +167,12 @@ void *gdImageJpegPtr (gdImagePtr im, int *size, int quality)
 void jpeg_gdIOCtx_dest (j_compress_ptr cinfo, gdIOCtx * outfile);
 
 void gdImageJpegCtx (gdImagePtr im, gdIOCtx * outfile, int quality)
+{
+       _gdImageJpegCtx(im, outfile, quality);
+}
+
+/* returns 0 on success, 1 on failure */
+static int _gdImageJpegCtx(gdImagePtr im, gdIOCtx *outfile, int quality)
 {
        struct jpeg_compress_struct cinfo;
        struct jpeg_error_mgr jerr;
@@ -184,7 +194,7 @@ void gdImageJpegCtx (gdImagePtr im, gdIOCtx * outfile, int quality)
                if (row) {
                        gdFree (row);
                }
-               return;
+               return 1;
        }
 
        cinfo.err->error_exit = fatal_jpeg_error;
@@ -277,6 +287,7 @@ void gdImageJpegCtx (gdImagePtr im, gdIOCtx * outfile, int quality)
        jpeg_finish_compress (&cinfo);
        jpeg_destroy_compress (&cinfo);
        gdFree (row);
+       return 0;
 }
 
 gdImagePtr gdImageCreateFromJpeg (FILE * inFile)
index 55ced3443deae48c55dd5102f8a022bd2604aba6..fd9edad2cafa85a2641d61c5e1b1ebc54f4c348f 100644 (file)
@@ -82,6 +82,7 @@ int gd_getin (void *in)
        return (gdGetC((gdIOCtx *) in));
 }
 
+static int _gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out);
 
 /*      gdImageWBMPCtx
    **  --------------
@@ -93,6 +94,12 @@ int gd_getin (void *in)
    **  out:    the stream where to write
  */
 void gdImageWBMPCtx (gdImagePtr image, int fg, gdIOCtx * out)
+{
+       _gdImageWBMPCtx(image, fg, out);
+}
+
+/* returns 0 on success, 1 on failure */
+static int _gdImageWBMPCtx(gdImagePtr image, int fg, gdIOCtx *out)
 {
        int x, y, pos;
        Wbmp *wbmp;
@@ -100,7 +107,7 @@ void gdImageWBMPCtx (gdImagePtr image, int fg, gdIOCtx * out)
        /* create the WBMP */
        if ((wbmp = createwbmp (gdImageSX (image), gdImageSY (image), WBMP_WHITE)) == NULL) {
                gd_error("Could not create WBMP");
-               return;
+               return 1;
        }
 
        /* fill up the WBMP structure */
@@ -116,7 +123,9 @@ void gdImageWBMPCtx (gdImagePtr image, int fg, gdIOCtx * out)
 
        /* write the WBMP to a gd file descriptor */
        if (writewbmp (wbmp, &gd_putout, out)) {
+               freewbmp(wbmp);
                gd_error("Could not save WBMP");
+               return 1;
        }
        /* des submitted this bugfix: gdFree the memory. */
        freewbmp(wbmp);
@@ -204,8 +213,11 @@ void * gdImageWBMPPtr (gdImagePtr im, int *size, int fg)
 {
        void *rv;
        gdIOCtx *out = gdNewDynamicCtx(2048, NULL);
-       gdImageWBMPCtx(im, fg, out);
-       rv = gdDPExtractData(out, size);
+       if (!_gdImageWBMPCtx(im, fg, out)) {
+               rv = gdDPExtractData(out, size);
+       } else {
+               rv = NULL;
+       }
        out->gd_free(out);
 
        return rv;