Merge branch 'pull-request/2664'

* pull-request/2664:
  Fix unittest for minimal length in random string
  Add support for webp in imagecreatefromstring
This commit is contained in:
Christoph M. Becker 2017-08-07 23:56:31 +02:00
commit 791410ab66
10 changed files with 88 additions and 14 deletions

3
NEWS
View File

@ -12,6 +12,9 @@ PHP NEWS
. Fixed bug #74125 (Fixed finding CURL on systems with multiarch support).
(cebe)
- GD:
. Added support for WebP in imagecreatefromstring() (Andreas Treichel, cmb).
- LDAP:
. Added ldap_exop_refresh helper for EXOP REFRESH operation with dds overlay.
(Come)

View File

@ -133,7 +133,7 @@ static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS);
static gdImagePtr _php_image_create_from_string (zval *Data, char *tn, gdImagePtr (*ioctx_func_p)());
static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)());
static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)());
static int _php_image_type(char data[8]);
static int _php_image_type(char data[12]);
static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type);
static void _php_image_bw_convert(gdImagePtr im_org, gdIOCtx *out, int threshold);
@ -2224,7 +2224,7 @@ static int _php_ctx_getmbi(gdIOCtx *ctx)
*/
static const char php_sig_gd2[3] = {'g', 'd', '2'};
static int _php_image_type (char data[8])
static int _php_image_type (char data[12])
{
/* Based on ext/standard/image.c */
@ -2232,18 +2232,18 @@ static int _php_image_type (char data[8])
return -1;
}
if (!memcmp(data, php_sig_gd2, 3)) {
if (!memcmp(data, php_sig_gd2, sizeof(php_sig_gd2))) {
return PHP_GDIMG_TYPE_GD2;
} else if (!memcmp(data, php_sig_jpg, 3)) {
} else if (!memcmp(data, php_sig_jpg, sizeof(php_sig_jpg))) {
return PHP_GDIMG_TYPE_JPG;
} else if (!memcmp(data, php_sig_png, 3)) {
if (!memcmp(data, php_sig_png, 8)) {
return PHP_GDIMG_TYPE_PNG;
}
} else if (!memcmp(data, php_sig_gif, 3)) {
} else if (!memcmp(data, php_sig_png, sizeof(php_sig_png))) {
return PHP_GDIMG_TYPE_PNG;
} else if (!memcmp(data, php_sig_gif, sizeof(php_sig_gif))) {
return PHP_GDIMG_TYPE_GIF;
} else if (!memcmp(data, php_sig_bmp, sizeof(php_sig_bmp))) {
return PHP_GDIMG_TYPE_BMP;
} else if(!memcmp(data, php_sig_riff, sizeof(php_sig_riff)) && !memcmp(data + sizeof(php_sig_riff) + sizeof(uint32_t), php_sig_webp, sizeof(php_sig_webp))) {
return PHP_GDIMG_TYPE_WEBP;
}
else {
gdIOCtx *io_ctx;
@ -2294,19 +2294,19 @@ PHP_FUNCTION(imagecreatefromstring)
zval *data;
gdImagePtr im;
int imtype;
char sig[8];
char sig[12];
if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &data) == FAILURE) {
return;
}
convert_to_string_ex(data);
if (Z_STRLEN_P(data) < 8) {
if (Z_STRLEN_P(data) < sizeof(sig)) {
php_error_docref(NULL, E_WARNING, "Empty string or invalid image");
RETURN_FALSE;
}
memcpy(sig, Z_STRVAL_P(data), 8);
memcpy(sig, Z_STRVAL_P(data), sizeof(sig));
imtype = _php_image_type(sig);
@ -2345,6 +2345,15 @@ PHP_FUNCTION(imagecreatefromstring)
im = _php_image_create_from_string(data, "BMP", gdImageCreateFromBmpCtx);
break;
case PHP_GDIMG_TYPE_WEBP:
#ifdef HAVE_GD_WEBP
im = _php_image_create_from_string(data, "WEBP", gdImageCreateFromWebpCtx);
break;
#else
php_error_docref(NULL, E_WARNING, "No WEBP support in this PHP build");
RETURN_FALSE;
#endif
default:
php_error_docref(NULL, E_WARNING, "Data is not in a recognized format");
RETURN_FALSE;

View File

@ -62,6 +62,8 @@ PHPAPI extern const char php_sig_gif[3];
PHPAPI extern const char php_sig_jpg[3];
PHPAPI extern const char php_sig_png[8];
PHPAPI extern const char php_sig_bmp[2];
PHPAPI extern const char php_sig_riff[4];
PHPAPI extern const char php_sig_webp[4];
extern zend_module_entry gd_module_entry;
#define phpext_gd_ptr &gd_module_entry

View File

@ -52,8 +52,8 @@ unlink($dir . '/p.png');
//empty string
$im = imagecreatefromstring('');
//random string > 8
$im = imagecreatefromstring(' asdf jklp');
//random string > 12
$im = imagecreatefromstring(' asdf jklp foo');
?>
--EXPECTF--
createfromstring truecolor png: ok

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 B

View File

@ -0,0 +1,20 @@
--TEST--
imagecreatefromstring() - GIF format
--SKIPIF--
<?php
if (!extension_loaded('gd')) die('skip ext/gd required');
if (!(imagetypes() & IMG_GIF)) die('skip GIF support required');
?>
--FILE--
<?php
// create an image from a GIF string representation
$im = imagecreatefromstring(file_get_contents(__DIR__ . '/imagecreatefromstring.gif'));
var_dump(imagesx($im));
var_dump(imagesy($im));
?>
===DONE===
--EXPECT--
int(10)
int(10)
===DONE===

View File

@ -0,0 +1,20 @@
--TEST--
imagecreatefromstring() - PNG format
--SKIPIF--
<?php
if (!extension_loaded('gd')) die('skip ext/gd required');
if (!(imagetypes() & IMG_PNG)) die('skip PNG support required');
?>
--FILE--
<?php
// create an image from a PNG string representation
$im = imagecreatefromstring(file_get_contents(__DIR__ . '/imagecreatefromstring.gif'));
var_dump(imagesx($im));
var_dump(imagesy($im));
?>
===DONE===
--EXPECT--
int(10)
int(10)
===DONE===

View File

@ -0,0 +1,20 @@
--TEST--
imagecreatefromstring() - WEBP format
--SKIPIF--
<?php
if (!extension_loaded('gd')) die('skip ext/gd required');
if (!(imagetypes() & IMG_WEBP)) die('skip WEBP support required');
?>
--FILE--
<?php
// create an image from a WEBP string representation
$im = imagecreatefromstring(file_get_contents(__DIR__ . '/imagecreatefromstring.webp'));
var_dump(imagesx($im));
var_dump(imagesy($im));
?>
===DONE===
--EXPECT--
int(10)
int(10)
===DONE===