Fix #66590: imagewebp() doesn't pad to even length

The code in the bundled libgd uses libvpx and writes the riff manually. The
code generates the correct even size, but neglects the padding. It's possible
older versions of libwebp would decode this, but libwebp 0.4.0 does not.

Let's apply the patch supplied by one of the WebP developers.
This commit is contained in:
Christoph M. Becker 2015-07-19 17:32:53 +02:00
parent abc3598f47
commit 96e42403d5
2 changed files with 40 additions and 0 deletions

View File

@ -779,6 +779,19 @@ WebPResult WebPEncode(const uint8* Y,
(chunk_size >> 24) & 255 };
memcpy(*p_out, kRiffHeader, kRiffHeaderSize);
if (img_size_bytes & 1) { /* write a padding byte */
const int new_size = *p_out_size_bytes + 1;
unsigned char* p = (unsigned char*)realloc(*p_out, new_size);
if (p == NULL) {
free(*p_out);
*p_out = NULL;
*p_out_size_bytes = 0;
return webp_failure;
}
p[new_size - 1] = 0;
*p_out_size_bytes = new_size;
}
if (psnr) {
*psnr = WebPGetPSNR(Y, U, V, *p_out, *p_out_size_bytes);
}

View File

@ -0,0 +1,27 @@
--TEST--
Bug #66590 (imagewebp() doesn't pad to even length)
--SKIPIF--
<?php
if (!extension_loaded('gd')) die('skip gd extension not available');
if (!function_exists('imagewebp')) die('skip WebP support not available');
?>
--FILE--
<?php
$filename = __DIR__ . '/bug66590.webp';
$im = imagecreatetruecolor(75, 75);
$red = imagecolorallocate($im, 255, 0, 0);
imagefilledrectangle($im, 0, 0, 74, 74, $red);
imagewebp($im, $filename);
$stream = fopen($filename, 'rb');
fread($stream, 4); // skip "RIFF"
$length = fread($stream, 4);
fclose($stream);
$length = unpack('V', $length)[1] + 8;
var_dump($length === filesize($filename));
?>
--CLEAN--
<?php
@unlink(__DIR__ . '/bug66590.webp');
?>
--EXPECT--
bool(true)