From 7584e3e69144fb2117fbb7580ae7796b4c4fa515 Mon Sep 17 00:00:00 2001 From: Andy Postnikov Date: Thu, 22 Jul 2021 00:59:05 +0300 Subject: [PATCH] Backport libgd commit Source - https://github.com/libgd/libgd/commit/f6a111c632fcf76dd3a42d750f18d2ed7bf8a5f1 Related to https://github.com/php/php-src/pull/5127#issuecomment-884032991 --- ext/gd/libgd/gd_avif.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/ext/gd/libgd/gd_avif.c b/ext/gd/libgd/gd_avif.c index 01bcbf14abdb8..93c4ad94882f8 100644 --- a/ext/gd/libgd/gd_avif.c +++ b/ext/gd/libgd/gd_avif.c @@ -142,7 +142,7 @@ static avifBool isAvifSrgbImage(avifImage *avifIm) { */ static avifBool isAvifError(avifResult result, const char *msg) { if (result != AVIF_RESULT_OK) { - gd_error("avif error - %s: %s", msg, avifResultToString(result)); + gd_error("avif error - %s: %s\n", msg, avifResultToString(result)); return AVIF_TRUE; } @@ -168,13 +168,18 @@ static avifResult readFromCtx(avifIO *io, uint32_t readFlags, uint64_t offset, s void *dataBuf = NULL; gdIOCtx *ctx = (gdIOCtx *) io->data; + // readFlags is unsupported + if (readFlags != 0) { + return AVIF_RESULT_IO_ERROR; + } + // TODO: if we set sizeHint, this will be more efficient. - if (offset > LONG_MAX || size < 0) + if (offset > INT_MAX || size > INT_MAX) return AVIF_RESULT_IO_ERROR; // Try to seek offset bytes forward. If we pass the end of the buffer, throw an error. - if (!ctx->seek(ctx, offset)) + if (!ctx->seek(ctx, (int) offset)) return AVIF_RESULT_IO_ERROR; dataBuf = avifAlloc(size); @@ -185,7 +190,7 @@ static avifResult readFromCtx(avifIO *io, uint32_t readFlags, uint64_t offset, s // Read the number of bytes requested. // If getBuf() returns a negative value, that means there was an error. - int charsRead = ctx->getBuf(ctx, dataBuf, size); + int charsRead = ctx->getBuf(ctx, dataBuf, (int) size); if (charsRead < 0) { avifFree(dataBuf); return AVIF_RESULT_IO_ERROR; @@ -330,7 +335,7 @@ gdImagePtr gdImageCreateFromAvifPtr(int size, void *data) */ gdImagePtr gdImageCreateFromAvifCtx (gdIOCtx *ctx) { - int x, y; + uint32_t x, y; gdImage *im = NULL; avifResult result; avifIO *io; @@ -465,7 +470,7 @@ void gdImageAvifCtx(gdImagePtr im, gdIOCtx *outfile, int quality, int speed) uint32_t val; uint8_t *p; - int x, y; + uint32_t x, y; if (im == NULL) return;