mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
- Added some sanity checks by changing to the parameter parsing API
This commit is contained in:
parent
8d10b52ddf
commit
e82eb93cf2
1 changed files with 25 additions and 44 deletions
69
ext/gd/gd.c
69
ext/gd/gd.c
|
@ -3107,13 +3107,13 @@ PHP_FUNCTION(imagettftext)
|
|||
*/
|
||||
static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int extended)
|
||||
{
|
||||
zval **IM, **PTSIZE, **ANGLE, **X, **Y, **C, **FONTNAME, **COL, **EXT = NULL;
|
||||
zval *IM, *EXT = NULL;
|
||||
gdImagePtr im=NULL;
|
||||
int col, x, y, l=0, i, brect[8];
|
||||
int col = -1, x = -1, y = -1, str_len, fontname_len, i, brect[8];
|
||||
double ptsize, angle;
|
||||
unsigned char *str = NULL, *fontname = NULL;
|
||||
char *error = NULL;
|
||||
int argc;
|
||||
int argc = ZEND_NUM_ARGS();
|
||||
#if HAVE_GD_STRINGFTEX
|
||||
gdFTStringExtra strex = {0};
|
||||
#endif
|
||||
|
@ -3122,84 +3122,65 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int
|
|||
assert(!extended);
|
||||
#endif
|
||||
|
||||
argc = ZEND_NUM_ARGS();
|
||||
|
||||
if (mode == TTFTEXT_BBOX) {
|
||||
if (argc < 4 || argc > ((extended) ? 5 : 4) || zend_get_parameters_ex(argc, &PTSIZE, &ANGLE, &FONTNAME, &C, &EXT) == FAILURE) {
|
||||
if (argc < 4 || argc > ((extended) ? 5 : 4)) {
|
||||
ZEND_WRONG_PARAM_COUNT();
|
||||
} else if (zend_parse_parameters(argc TSRMLS_CC, "ddss|a", &ptsize, &angle, &fontname, &fontname_len, &str, &str_len, &EXT) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
} else {
|
||||
if (argc < 8 || argc > ((extended) ? 9 : 8) || zend_get_parameters_ex(argc, &IM, &PTSIZE, &ANGLE, &X, &Y, &COL, &FONTNAME, &C, &EXT) == FAILURE) {
|
||||
if (argc < 8 || argc > ((extended) ? 9 : 8)) {
|
||||
ZEND_WRONG_PARAM_COUNT();
|
||||
} else if (zend_parse_parameters(argc TSRMLS_CC, "rddlllss|a", &IM, &ptsize, &angle, &x, &y, &col, &fontname, &fontname_len, &str, &str_len, &EXT) == FAILURE) {
|
||||
RETURN_FALSE;
|
||||
}
|
||||
ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd);
|
||||
ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd);
|
||||
}
|
||||
|
||||
convert_to_double_ex(PTSIZE);
|
||||
convert_to_double_ex(ANGLE);
|
||||
convert_to_string_ex(FONTNAME);
|
||||
convert_to_string_ex(C);
|
||||
|
||||
if (mode == TTFTEXT_BBOX) {
|
||||
im = NULL;
|
||||
col = x = y = -1;
|
||||
} else {
|
||||
convert_to_long_ex(X);
|
||||
convert_to_long_ex(Y);
|
||||
convert_to_long_ex(COL);
|
||||
col = Z_LVAL_PP(COL);
|
||||
y = Z_LVAL_PP(Y);
|
||||
x = Z_LVAL_PP(X);
|
||||
}
|
||||
/* convert angle to radians */
|
||||
angle = angle * (M_PI/180);
|
||||
|
||||
#if HAVE_GD_STRINGFTEX
|
||||
if (extended && EXT) {
|
||||
/* parse extended info */
|
||||
|
||||
if (extended && EXT) { /* parse extended info */
|
||||
HashPosition pos;
|
||||
|
||||
convert_to_array_ex(EXT);
|
||||
|
||||
/* walk the assoc array */
|
||||
zend_hash_internal_pointer_reset_ex(HASH_OF(*EXT), &pos);
|
||||
zend_hash_internal_pointer_reset_ex(HASH_OF(EXT), &pos);
|
||||
do {
|
||||
zval ** item;
|
||||
char * key;
|
||||
ulong num_key;
|
||||
|
||||
if (zend_hash_get_current_key_ex(HASH_OF(*EXT), &key, NULL, &num_key, 0, &pos) != HASH_KEY_IS_STRING) {
|
||||
if (zend_hash_get_current_key_ex(HASH_OF(EXT), &key, NULL, &num_key, 0, &pos) != HASH_KEY_IS_STRING) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (zend_hash_get_current_data_ex(HASH_OF(*EXT), (void **) &item, &pos) == FAILURE) {
|
||||
if (zend_hash_get_current_data_ex(HASH_OF(EXT), (void **) &item, &pos) == FAILURE) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strcmp("linespacing", key) == 0) {
|
||||
|
||||
if (strcmp("linespacing", key) == 0) {
|
||||
convert_to_double_ex(item);
|
||||
strex.flags |= gdFTEX_LINESPACE;
|
||||
strex.linespacing = Z_DVAL_PP(item);
|
||||
}
|
||||
|
||||
} while (zend_hash_move_forward_ex(HASH_OF(*EXT), &pos) == SUCCESS);
|
||||
} while (zend_hash_move_forward_ex(HASH_OF(EXT), &pos) == SUCCESS);
|
||||
}
|
||||
#endif
|
||||
|
||||
ptsize = Z_DVAL_PP(PTSIZE);
|
||||
angle = Z_DVAL_PP(ANGLE) * (M_PI / 180); /* convert to radians */
|
||||
|
||||
str = (unsigned char *) Z_STRVAL_PP(C);
|
||||
l = strlen(str);
|
||||
|
||||
#ifdef VIRTUAL_DIR
|
||||
{
|
||||
char tmp_font_path[MAXPATHLEN];
|
||||
if (VCWD_REALPATH(Z_STRVAL_PP(FONTNAME), tmp_font_path)) {
|
||||
fontname = (unsigned char *) Z_STRVAL_PP(FONTNAME);
|
||||
|
||||
if (VCWD_REALPATH(fontname, tmp_font_path)) {
|
||||
fontname = (unsigned char *) fontname;
|
||||
} else {
|
||||
fontname = NULL;
|
||||
}
|
||||
}
|
||||
#else
|
||||
fontname = (unsigned char *) Z_STRVAL_PP(FONTNAME);
|
||||
fontname = (unsigned char *) fontname;
|
||||
#endif
|
||||
|
||||
#ifdef USE_GD_IMGSTRTTF
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue