diff options
-rw-r--r-- | Zend/zend_API.c | 4 | ||||
-rw-r--r-- | Zend/zend_hash.c | 4 | ||||
-rw-r--r-- | ext/gd/gd.c | 500 | ||||
-rw-r--r-- | ext/gd/gd_ctx.c | 28 | ||||
-rw-r--r-- | ext/iconv/iconv.c | 2 | ||||
-rw-r--r-- | ext/pdo_mysql/tests/config.inc | 2 | ||||
-rw-r--r-- | ext/pdo_sqlite/sqlite_driver.c | 4 | ||||
-rw-r--r-- | ext/phar/phar.c | 18 | ||||
-rw-r--r-- | ext/phar/phar_object.c | 28 | ||||
-rw-r--r-- | ext/phar/tar.c | 2 | ||||
-rw-r--r-- | ext/phar/util.c | 31 | ||||
-rw-r--r-- | ext/session/mod_files.c | 2 | ||||
-rw-r--r-- | ext/spl/spl_directory.c | 5 | ||||
-rw-r--r-- | ext/xmlrpc/libxmlrpc/xmlrpc.c | 2 | ||||
-rw-r--r-- | ext/xmlrpc/xmlrpc-epi-php.c | 767 |
15 files changed, 650 insertions, 749 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f944de9df3..6ef4c0b467 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2883,11 +2883,11 @@ static int zend_is_callable_check_func(int check_flags, zval *callable, zend_fca /* Skip leading \ */ if (Z_STRVAL_P(callable)[0] == '\\') { - lmname = do_alloca(Z_STRLEN_P(callable) - 1, use_heap); + lmname = do_alloca(Z_STRLEN_P(callable), use_heap); lmname_len = Z_STRLEN_P(callable) - 1; zend_str_tolower_copy(lmname, Z_STRVAL_P(callable) + 1, lmname_len); } else { - lmname = do_alloca(Z_STRLEN_P(callable), use_heap); + lmname = do_alloca(Z_STRLEN_P(callable) + 1, use_heap); lmname_len = Z_STRLEN_P(callable); zend_str_tolower_copy(lmname, Z_STRVAL_P(callable), lmname_len); } diff --git a/Zend/zend_hash.c b/Zend/zend_hash.c index 3ffdf6ef76..41805a2f92 100644 --- a/Zend/zend_hash.c +++ b/Zend/zend_hash.c @@ -675,6 +675,10 @@ ZEND_API int zend_hash_str_del(HashTable *ht, const char *str, int len) IS_CONSISTENT(ht); + if (ht->u.flags & HASH_FLAG_PACKED) { + return FAILURE; + } + h = zend_inline_hash_func(str, len); nIndex = h & ht->nTableMask; diff --git a/ext/gd/gd.c b/ext/gd/gd.c index 33416a23d9..f4245b93fd 100644 --- a/ext/gd/gd.c +++ b/ext/gd/gd.c @@ -64,8 +64,8 @@ static int le_gd, le_gd_font; #if HAVE_LIBT1 #include <t1lib.h> static int le_ps_font, le_ps_enc; -static void php_free_ps_font(zend_rsrc_list_entry *rsrc TSRMLS_DC); -static void php_free_ps_enc(zend_rsrc_list_entry *rsrc TSRMLS_DC); +static void php_free_ps_font(zend_resource *rsrc TSRMLS_DC); +static void php_free_ps_enc(zend_resource *rsrc TSRMLS_DC); #endif #include <gd.h> @@ -135,7 +135,7 @@ static void php_image_filter_smooth(INTERNAL_FUNCTION_PARAMETERS); static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS); /* End Section filters declarations */ -static gdImagePtr _php_image_create_from_string (zval **Data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC); +static gdImagePtr _php_image_create_from_string (zval *Data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC); 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]); @@ -1072,7 +1072,7 @@ PHP_INI_END() /* {{{ php_free_gd_image */ -static void php_free_gd_image(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void php_free_gd_image(zend_resource *rsrc TSRMLS_DC) { gdImageDestroy((gdImagePtr) rsrc->ptr); } @@ -1080,7 +1080,7 @@ static void php_free_gd_image(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ php_free_gd_font */ -static void php_free_gd_font(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void php_free_gd_font(zend_resource *rsrc TSRMLS_DC) { gdFontPtr fp = (gdFontPtr) rsrc->ptr; @@ -1419,9 +1419,10 @@ PHP_GD_API int phpi_get_le_gd(void) Load a new font */ PHP_FUNCTION(imageloadfont) { + zval *ind; char *file; int file_name, hdr_size = sizeof(gdFont) - sizeof(char *); - int ind, body_size, n = 0, b, i, body_size_check; + int body_size, n = 0, b, i, body_size_check; gdFontPtr font; php_stream *stream; @@ -1508,13 +1509,13 @@ PHP_FUNCTION(imageloadfont) } php_stream_close(stream); + ind = zend_list_insert(font, le_gd_font TSRMLS_CC); + /* Adding 5 to the font index so we will never have font indices * that overlap with the old fonts (with indices 1-5). The first * list index given out is always 1. */ - ind = 5 + zend_list_insert(font, le_gd_font TSRMLS_CC); - - RETURN_LONG(ind); + RETURN_LONG(Z_RES_HANDLE_P(ind) + 5); } /* }}} */ @@ -1522,40 +1523,30 @@ PHP_FUNCTION(imageloadfont) Set the line drawing styles for use with imageline and IMG_COLOR_STYLED. */ PHP_FUNCTION(imagesetstyle) { - zval *IM, *styles; + zval *IM, *styles, *item; gdImagePtr im; - int * stylearr; - int index; - HashPosition pos; + int *stylearr; + int index = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &IM, &styles) == FAILURE) { return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); /* copy the style values in the stylearr */ stylearr = safe_emalloc(sizeof(int), zend_hash_num_elements(HASH_OF(styles)), 0); - zend_hash_internal_pointer_reset_ex(HASH_OF(styles), &pos); - - for (index = 0;; zend_hash_move_forward_ex(HASH_OF(styles), &pos)) { - zval ** item; - - if (zend_hash_get_current_data_ex(HASH_OF(styles), (void **) &item, &pos) == FAILURE) { - break; - } - - if (Z_TYPE_PP(item) != IS_LONG) { + ZEND_HASH_FOREACH_VAL(HASH_OF(styles), item) { + if (Z_TYPE_P(item) != IS_LONG) { zval lval; - lval = **item; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, item); convert_to_long(&lval); stylearr[index++] = Z_LVAL(lval); } else { - stylearr[index++] = Z_LVAL_PP(item); + stylearr[index++] = Z_LVAL_P(item); } - } + } ZEND_HASH_FOREACH_END(); gdImageSetStyle(im, stylearr, index); @@ -1602,7 +1593,7 @@ PHP_FUNCTION(imageistruecolor) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_BOOL(im->trueColor); } @@ -1621,7 +1612,7 @@ PHP_FUNCTION(imagetruecolortopalette) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (ncolors <= 0) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Number of colors has to be greater than zero"); @@ -1633,8 +1624,6 @@ PHP_FUNCTION(imagetruecolortopalette) } /* }}} */ - - /* {{{ proto void imagetruecolortopalette(resource im, bool ditherFlag, int colorsWanted) Convert a true colour image to a palette based image with a number of colours, optionally using dithering. */ PHP_FUNCTION(imagepalettetotruecolor) @@ -1646,7 +1635,7 @@ PHP_FUNCTION(imagepalettetotruecolor) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (gdImagePaletteToTrueColor(im) == 0) { RETURN_FALSE; @@ -1668,8 +1657,8 @@ PHP_FUNCTION(imagecolormatch) return; } - ZEND_FETCH_RESOURCE(im1, gdImagePtr, &IM1, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(im2, gdImagePtr, &IM2, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im1, gdImagePtr, IM1, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im2, gdImagePtr, IM2, -1, "Image", le_gd); result = gdImageColorMatch(im1, im2); switch (result) { @@ -1707,7 +1696,7 @@ PHP_FUNCTION(imagesetthickness) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageSetThickness(im, thick); @@ -1727,7 +1716,7 @@ PHP_FUNCTION(imagefilledellipse) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageFilledEllipse(im, cx, cy, w, h, color); @@ -1748,7 +1737,7 @@ PHP_FUNCTION(imagefilledarc) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); e = E; if (e < 0) { @@ -1778,7 +1767,7 @@ PHP_FUNCTION(imagealphablending) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageAlphaBlending(im, blend); RETURN_TRUE; @@ -1797,7 +1786,7 @@ PHP_FUNCTION(imagesavealpha) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageSaveAlpha(im, save); RETURN_TRUE; @@ -1816,7 +1805,7 @@ PHP_FUNCTION(imagelayereffect) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageAlphaBlending(im, effect); RETURN_TRUE; @@ -1836,7 +1825,7 @@ PHP_FUNCTION(imagecolorallocatealpha) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); ct = gdImageColorAllocateAlpha(im, red, green, blue, alpha); if (ct < 0) { RETURN_FALSE; @@ -1857,7 +1846,7 @@ PHP_FUNCTION(imagecolorresolvealpha) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorResolveAlpha(im, red, green, blue, alpha)); } @@ -1875,7 +1864,7 @@ PHP_FUNCTION(imagecolorclosestalpha) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorClosestAlpha(im, red, green, blue, alpha)); } @@ -1893,7 +1882,7 @@ PHP_FUNCTION(imagecolorexactalpha) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorExactAlpha(im, red, green, blue, alpha)); } @@ -1912,8 +1901,8 @@ PHP_FUNCTION(imagecopyresampled) return; } - ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); srcX = SX; srcY = SY; @@ -2094,7 +2083,7 @@ PHP_FUNCTION(imagerotate) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); im_dst = gdImageRotateInterpolated(im_src, (const float)degrees, color); @@ -2117,8 +2106,8 @@ PHP_FUNCTION(imagesettile) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(tile, gdImagePtr, &TILE, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(tile, gdImagePtr, TILE, -1, "Image", le_gd); gdImageSetTile(im, tile); @@ -2137,8 +2126,8 @@ PHP_FUNCTION(imagesetbrush) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(tile, gdImagePtr, &TILE, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(tile, gdImagePtr, TILE, -1, "Image", le_gd); gdImageSetBrush(im, tile); @@ -2257,12 +2246,12 @@ static int _php_image_type (char data[8]) /* {{{ _php_image_create_from_string */ -gdImagePtr _php_image_create_from_string(zval **data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC) +gdImagePtr _php_image_create_from_string(zval *data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC) { gdImagePtr im; gdIOCtx *io_ctx; - io_ctx = gdNewDynamicCtxEx(Z_STRLEN_PP(data), Z_STRVAL_PP(data), 0); + io_ctx = gdNewDynamicCtxEx(Z_STRLEN_P(data), Z_STRVAL_P(data), 0); if (!io_ctx) { return NULL; @@ -2285,22 +2274,22 @@ gdImagePtr _php_image_create_from_string(zval **data, char *tn, gdImagePtr (*ioc Create a new image from the image stream in the string */ PHP_FUNCTION(imagecreatefromstring) { - zval **data; + zval *data; gdImagePtr im; int imtype; char sig[8]; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &data) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &data) == FAILURE) { return; } convert_to_string_ex(data); - if (Z_STRLEN_PP(data) < 8) { + if (Z_STRLEN_P(data) < 8) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty string or invalid image"); RETURN_FALSE; } - memcpy(sig, Z_STRVAL_PP(data), 8); + memcpy(sig, Z_STRVAL_P(data), 8); imtype = _php_image_type(sig); @@ -2359,7 +2348,9 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, gdImagePtr im = NULL; php_stream *stream; FILE * fp = NULL; +#ifdef HAVE_GD_JPG long ignore_warning; +#endif if (image_type == PHP_GDIMG_TYPE_GD2PART) { if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sllll", &file, &file_len, &srcx, &srcy, &width, &height) == FAILURE) { @@ -2389,20 +2380,22 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, } else if (ioctx_func_p) { /* we can create an io context */ gdIOCtx* io_ctx; - size_t buff_size; - char *buff; + zend_string *buff; + char *pstr; - /* needs to be malloc (persistent) - GD will free() it later */ - buff_size = php_stream_copy_to_mem(stream, &buff, PHP_STREAM_COPY_ALL, 1); + buff = php_stream_copy_to_mem(stream, PHP_STREAM_COPY_ALL, 0); - if (!buff_size) { + if (!buff) { php_error_docref(NULL TSRMLS_CC, E_WARNING,"Cannot read image data"); goto out_err; } - io_ctx = gdNewDynamicCtxEx(buff_size, buff, 0); + /* needs to be malloc (persistent) - GD will free() it later */ + pstr = pestrndup(buff->val, buff->len, 1); + io_ctx = gdNewDynamicCtxEx(buff->len, pstr, 0); if (!io_ctx) { - pefree(buff, 1); + pefree(pstr, 1); + STR_RELEASE(buff); php_error_docref(NULL TSRMLS_CC, E_WARNING,"Cannot allocate GD IO context"); goto out_err; } @@ -2413,7 +2406,8 @@ static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, im = (*ioctx_func_p)(io_ctx); } io_ctx->gd_free(io_ctx); - pefree(buff, 1); + pefree(pstr, 1); + STR_RELEASE(buff); } else if (php_stream_can_cast(stream, PHP_STREAM_AS_STDIO)) { /* try and force the stream to be FILE* */ @@ -2572,7 +2566,7 @@ static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &imgind, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, imgind, -1, "Image", le_gd); if (argc > 1) { fn = file; @@ -2786,9 +2780,9 @@ PHP_FUNCTION(imagedestroy) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); - zend_list_delete(Z_LVAL_P(IM)); + zend_list_close(Z_RES_P(IM)); RETURN_TRUE; } @@ -2808,7 +2802,7 @@ PHP_FUNCTION(imagecolorallocate) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); ct = gdImageColorAllocate(im, red, green, blue); if (ct < 0) { @@ -2829,8 +2823,8 @@ PHP_FUNCTION(imagepalettecopy) return; } - ZEND_FETCH_RESOURCE(dst, gdImagePtr, &dstim, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(src, gdImagePtr, &srcim, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(dst, gdImagePtr, dstim, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(src, gdImagePtr, srcim, -1, "Image", le_gd); gdImagePaletteCopy(dst, src); } @@ -2848,7 +2842,7 @@ PHP_FUNCTION(imagecolorat) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (gdImageTrueColor(im)) { if (im->tpixels && gdImageBoundsSafe(im, x, y)) { @@ -2880,7 +2874,7 @@ PHP_FUNCTION(imagecolorclosest) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorClosest(im, red, green, blue)); } @@ -2898,7 +2892,7 @@ PHP_FUNCTION(imagecolorclosesthwb) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorClosestHWB(im, red, green, blue)); } @@ -2917,7 +2911,7 @@ PHP_FUNCTION(imagecolordeallocate) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); /* We can return right away for a truecolor image as deallocating colours is meaningless here */ if (gdImageTrueColor(im)) { @@ -2948,7 +2942,7 @@ PHP_FUNCTION(imagecolorresolve) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorResolve(im, red, green, blue)); } @@ -2966,7 +2960,7 @@ PHP_FUNCTION(imagecolorexact) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorExact(im, red, green, blue)); } @@ -2985,7 +2979,7 @@ PHP_FUNCTION(imagecolorset) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); col = color; @@ -3013,7 +3007,7 @@ PHP_FUNCTION(imagecolorsforindex) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); col = index; @@ -3044,7 +3038,7 @@ PHP_FUNCTION(imagegammacorrect) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (gdImageTrueColor(im)) { int x, y, c; @@ -3086,7 +3080,7 @@ PHP_FUNCTION(imagesetpixel) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageSetPixel(im, x, y, col); RETURN_TRUE; } @@ -3104,7 +3098,7 @@ PHP_FUNCTION(imageline) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); #ifdef HAVE_GD_BUNDLED if (im->antialias) { @@ -3130,7 +3124,7 @@ PHP_FUNCTION(imagedashedline) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageDashedLine(im, x1, y1, x2, y2, col); RETURN_TRUE; } @@ -3148,7 +3142,7 @@ PHP_FUNCTION(imagerectangle) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageRectangle(im, x1, y1, x2, y2, col); RETURN_TRUE; } @@ -3166,7 +3160,7 @@ PHP_FUNCTION(imagefilledrectangle) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageFilledRectangle(im, x1, y1, x2, y2, col); RETURN_TRUE; } @@ -3185,7 +3179,7 @@ PHP_FUNCTION(imagearc) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); e = E; if (e < 0) { @@ -3214,7 +3208,7 @@ PHP_FUNCTION(imageellipse) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageEllipse(im, cx, cy, w, h, color); RETURN_TRUE; @@ -3233,7 +3227,7 @@ PHP_FUNCTION(imagefilltoborder) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageFillToBorder(im, x, y, border, col); RETURN_TRUE; } @@ -3251,7 +3245,7 @@ PHP_FUNCTION(imagefill) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageFill(im, x, y, col); RETURN_TRUE; } @@ -3268,7 +3262,7 @@ PHP_FUNCTION(imagecolorstotal) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageColorsTotal(im)); } @@ -3287,7 +3281,7 @@ PHP_FUNCTION(imagecolortransparent) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (argc > 1) { gdImageColorTransparent(im, COL); @@ -3310,7 +3304,7 @@ PHP_FUNCTION(imageinterlace) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (argc > 1) { gdImageInterlace(im, INT); @@ -3328,7 +3322,7 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled) { zval *IM, *POINTS; long NPOINTS, COL; - zval **var = NULL; + zval *var = NULL; gdImagePtr im; gdPointPtr points; int npoints, col, nelem, i; @@ -3337,7 +3331,7 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); npoints = NPOINTS; col = COL; @@ -3359,26 +3353,24 @@ static void php_imagepolygon(INTERNAL_FUNCTION_PARAMETERS, int filled) points = (gdPointPtr) safe_emalloc(npoints, sizeof(gdPoint), 0); for (i = 0; i < npoints; i++) { - if (zend_hash_index_find(Z_ARRVAL_P(POINTS), (i * 2), (void **) &var) == SUCCESS) { - if (Z_TYPE_PP(var) != IS_LONG) { + if ((var = zend_hash_index_find(Z_ARRVAL_P(POINTS), (i * 2))) != NULL) { + if (Z_TYPE_P(var) != IS_LONG) { zval lval; - lval = **var; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, var); convert_to_long(&lval); points[i].x = Z_LVAL(lval); } else { - points[i].x = Z_LVAL_PP(var); + points[i].x = Z_LVAL_P(var); } } - if (zend_hash_index_find(Z_ARRVAL_P(POINTS), (i * 2) + 1, (void **) &var) == SUCCESS) { - if (Z_TYPE_PP(var) != IS_LONG) { + if ((var = zend_hash_index_find(Z_ARRVAL_P(POINTS), (i * 2) + 1)) != NULL) { + if (Z_TYPE_P(var) != IS_LONG) { zval lval; - lval = **var; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, var); convert_to_long(&lval); points[i].y = Z_LVAL(lval); } else { - points[i].y = Z_LVAL_PP(var); + points[i].y = Z_LVAL_P(var); } } } @@ -3415,34 +3407,36 @@ PHP_FUNCTION(imagefilledpolygon) static gdFontPtr php_find_gd_font(int size TSRMLS_DC) { gdFontPtr font; - int ind_type; switch (size) { case 1: - font = gdFontTiny; - break; + font = gdFontTiny; + break; case 2: - font = gdFontSmall; - break; + font = gdFontSmall; + break; case 3: - font = gdFontMediumBold; - break; + font = gdFontMediumBold; + break; case 4: - font = gdFontLarge; - break; + font = gdFontLarge; + break; case 5: - font = gdFontGiant; - break; - default: - font = zend_list_find(size - 5, &ind_type); - if (!font || ind_type != le_gd_font) { - if (size < 1) { - font = gdFontTiny; - } else { - font = gdFontGiant; - } + font = gdFontGiant; + break; + default: { + zval *zv = zend_hash_index_find(&EG(regular_list), size - 5); + if (!zv || (Z_RES_P(zv))->type != le_gd_font) { + if (size < 1) { + font = gdFontTiny; + } else { + font = gdFontGiant; + } + } else { + font = (gdFontPtr)Z_RES_P(zv)->ptr; } - break; + } + break; } return font; @@ -3530,7 +3524,7 @@ static void php_imagechar(INTERNAL_FUNCTION_PARAMETERS, int mode) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); col = COL; @@ -3621,8 +3615,8 @@ PHP_FUNCTION(imagecopy) return; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "Image", le_gd); srcX = SX; srcY = SY; @@ -3649,8 +3643,8 @@ PHP_FUNCTION(imagecopymerge) return; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "Image", le_gd); srcX = SX; srcY = SY; @@ -3678,8 +3672,8 @@ PHP_FUNCTION(imagecopymergegray) return; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "Image", le_gd); srcX = SX; srcY = SY; @@ -3707,8 +3701,8 @@ PHP_FUNCTION(imagecopyresized) return; } - ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, &DIM, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_dst, gdImagePtr, DIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); srcX = SX; srcY = SY; @@ -3740,7 +3734,7 @@ PHP_FUNCTION(imagesx) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageSX(im)); } @@ -3757,7 +3751,7 @@ PHP_FUNCTION(imagesy) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); RETURN_LONG(gdImageSY(im)); } @@ -3830,37 +3824,28 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int } 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 angle to radians */ angle = angle * (M_PI/180); if (extended && EXT) { /* parse extended info */ - HashPosition pos; + zval *item; + zend_string *key; + ulong num_key; /* walk the assoc array */ - 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) { + ZEND_HASH_FOREACH_KEY_VAL(HASH_OF(EXT), num_key, key, item) { + if (key == NULL) { continue; } - - if (zend_hash_get_current_data_ex(HASH_OF(EXT), (void **) &item, &pos) == FAILURE) { - continue; - } - - if (strcmp("linespacing", key) == 0) { + if (strcmp("linespacing", key->val) == 0) { convert_to_double_ex(item); strex.flags |= gdFTEX_LINESPACE; - strex.linespacing = Z_DVAL_PP(item); + strex.linespacing = Z_DVAL_P(item); } - - } while (zend_hash_move_forward_ex(HASH_OF(EXT), &pos) == SUCCESS); + } ZEND_HASH_FOREACH_END(); } #ifdef VIRTUAL_DIR @@ -3903,9 +3888,9 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int mode, int /* {{{ php_free_ps_font */ -static void php_free_ps_font(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void php_free_ps_font(zend_resource *rsrc TSRMLS_DC) { - int *font = (int *) rsrc->ptr; + int *font = (int *)rsrc->ptr; T1_DeleteFont(*font); efree(font); @@ -3914,9 +3899,9 @@ static void php_free_ps_font(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ php_free_ps_enc */ -static void php_free_ps_enc(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void php_free_ps_enc(zend_resource *rsrc TSRMLS_DC) { - char **enc = (char **) rsrc->ptr; + char **enc = (char **)rsrc->ptr; T1_DeleteEncoding(enc); } @@ -4025,7 +4010,7 @@ PHP_FUNCTION(imagepsfreefont) return; } - ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font); + ZEND_FETCH_RESOURCE(f_ind, int *, fnt, -1, "Type 1 font", le_ps_font); zend_list_delete(Z_LVAL_P(fnt)); RETURN_TRUE; } @@ -4043,7 +4028,7 @@ PHP_FUNCTION(imagepsencodefont) return; } - ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font); + ZEND_FETCH_RESOURCE(f_ind, int *, fnt, -1, "Type 1 font", le_ps_font); if ((enc_vector = T1_LoadEncoding(enc)) == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't load encoding vector from %s", enc); @@ -4075,7 +4060,7 @@ PHP_FUNCTION(imagepsextendfont) return; } - ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font); + ZEND_FETCH_RESOURCE(f_ind, int *, fnt, -1, "Type 1 font", le_ps_font); T1_DeleteAllSizes(*f_ind); @@ -4104,7 +4089,7 @@ PHP_FUNCTION(imagepsslantfont) return; } - ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font); + ZEND_FETCH_RESOURCE(f_ind, int *, fnt, -1, "Type 1 font", le_ps_font); if (T1_SlantFont(*f_ind, slt) != 0) { RETURN_FALSE; @@ -4145,8 +4130,8 @@ PHP_FUNCTION(imagepstext) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(bg_img, gdImagePtr, &img, -1, "Image", le_gd); - ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font); + ZEND_FETCH_RESOURCE(bg_img, gdImagePtr, img, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(f_ind, int *, fnt, -1, "Type 1 font", le_ps_font); /* Ensure that the provided colors are valid */ if (_fg < 0 || (!gdImageTrueColor(bg_img) && _fg > gdImageColorsTotal(bg_img))) { @@ -4286,7 +4271,7 @@ PHP_FUNCTION(imagepsbbox) per_char = add_width || angle ? 1 : 0; } - ZEND_FETCH_RESOURCE(f_ind, int *, &fnt, -1, "Type 1 font", le_ps_font); + ZEND_FETCH_RESOURCE(f_ind, int *, fnt, -1, "Type 1 font", le_ps_font); #define max(a, b) (a > b ? a : b) #define min(a, b) (a < b ? a : b) @@ -4451,7 +4436,9 @@ static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type ) int int_threshold; int x, y; float x_ratio, y_ratio; +#ifdef HAVE_GD_JPG long ignore_warning; +#endif if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "pplll", &f_org, &f_org_len, &f_dest, &f_dest_len, &height, &width, &threshold) == FAILURE) { return; @@ -4617,7 +4604,7 @@ static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type ) if (zend_parse_parameters(1 TSRMLS_CC, "r", &SIM) == FAILURE) { \ RETURN_FALSE; \ } \ - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); \ + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); \ if (im_src == NULL) { \ RETURN_FALSE; \ } @@ -4654,7 +4641,7 @@ static void php_image_filter_brightness(INTERNAL_FUNCTION_PARAMETERS) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); if (im_src == NULL) { RETURN_FALSE; @@ -4677,7 +4664,7 @@ static void php_image_filter_contrast(INTERNAL_FUNCTION_PARAMETERS) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); if (im_src == NULL) { RETURN_FALSE; @@ -4701,7 +4688,7 @@ static void php_image_filter_colorize(INTERNAL_FUNCTION_PARAMETERS) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); if (im_src == NULL) { RETURN_FALSE; @@ -4780,7 +4767,7 @@ static void php_image_filter_smooth(INTERNAL_FUNCTION_PARAMETERS) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); if (im_src == NULL) { RETURN_FALSE; @@ -4804,7 +4791,7 @@ static void php_image_filter_pixelate(INTERNAL_FUNCTION_PARAMETERS) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (im == NULL) { RETURN_FALSE; @@ -4858,7 +4845,7 @@ PHP_FUNCTION(imagefilter) PHP_FUNCTION(imageconvolution) { zval *SIM, *hash_matrix; - zval **var = NULL, **var2 = NULL; + zval *var = NULL, *var2 = NULL; gdImagePtr im_src = NULL; double div, offset; int nelem, i, j, res; @@ -4868,7 +4855,7 @@ PHP_FUNCTION(imageconvolution) RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); nelem = zend_hash_num_elements(Z_ARRVAL_P(hash_matrix)); if (nelem != 3) { @@ -4877,22 +4864,21 @@ PHP_FUNCTION(imageconvolution) } for (i=0; i<3; i++) { - if (zend_hash_index_find(Z_ARRVAL_P(hash_matrix), (i), (void **) &var) == SUCCESS && Z_TYPE_PP(var) == IS_ARRAY) { - if (Z_TYPE_PP(var) != IS_ARRAY || zend_hash_num_elements(Z_ARRVAL_PP(var)) != 3 ) { + if ((var = zend_hash_index_find(Z_ARRVAL_P(hash_matrix), (i))) != NULL && Z_TYPE_P(var) == IS_ARRAY) { + if (zend_hash_num_elements(Z_ARRVAL_P(var)) != 3 ) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must have 3x3 array"); RETURN_FALSE; } for (j=0; j<3; j++) { - if (zend_hash_index_find(Z_ARRVAL_PP(var), (j), (void **) &var2) == SUCCESS) { - if (Z_TYPE_PP(var2) != IS_DOUBLE) { + if ((var2 = zend_hash_index_find(Z_ARRVAL_P(var), (j))) != NULL) { + if (Z_TYPE_P(var2) != IS_DOUBLE) { zval dval; - dval = **var2; - zval_copy_ctor(&dval); + ZVAL_COPY(&dval, var2); convert_to_double(&dval); matrix[i][j] = (float)Z_DVAL(dval); } else { - matrix[i][j] = (float)Z_DVAL_PP(var2); + matrix[i][j] = (float)Z_DVAL_P(var2); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "You must have a 3x3 matrix"); @@ -4924,7 +4910,7 @@ PHP_FUNCTION(imageflip) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); switch (mode) { case GD_FLIP_VERTICAL: @@ -4961,7 +4947,7 @@ PHP_FUNCTION(imageantialias) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); gdImageAntialias(im, alias); RETURN_TRUE; } @@ -4977,68 +4963,64 @@ PHP_FUNCTION(imagecrop) gdImagePtr im_crop; gdRect rect; zval *z_rect; - zval **tmp; + zval *tmp; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &IM, &z_rect) == FAILURE) { return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); - if (zend_hash_find(HASH_OF(z_rect), "x", sizeof("x"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "x", sizeof("x") -1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.x = Z_LVAL(lval); } else { - rect.x = Z_LVAL_PP(tmp); + rect.x = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing x position"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(z_rect), "y", sizeof("x"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "y", sizeof("y") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.y = Z_LVAL(lval); } else { - rect.y = Z_LVAL_PP(tmp); + rect.y = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing y position"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(z_rect), "width", sizeof("width"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "width", sizeof("width") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.width = Z_LVAL(lval); } else { - rect.width = Z_LVAL_PP(tmp); + rect.width = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing width"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(z_rect), "height", sizeof("height"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "height", sizeof("height") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.height = Z_LVAL(lval); } else { - rect.height = Z_LVAL_PP(tmp); + rect.height = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing height"); @@ -5070,7 +5052,7 @@ PHP_FUNCTION(imagecropauto) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); switch (mode) { case -1: @@ -5121,7 +5103,7 @@ PHP_FUNCTION(imagescale) new_width = tmp_w; new_height = tmp_h; - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (gdImageSetInterpolationMethod(im, method)) { im_scaled = gdImageScale(im, new_width, new_height); @@ -5146,16 +5128,16 @@ PHP_FUNCTION(imageaffine) gdRectPtr pRect = NULL; zval *z_rect = NULL; zval *z_affine; - zval **tmp; + zval *tmp; double affine[6]; int i, nelems; - zval **zval_affine_elem = NULL; + zval *zval_affine_elem = NULL; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra|a", &IM, &z_affine, &z_rect) == FAILURE) { return; } - ZEND_FETCH_RESOURCE(src, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(src, gdImagePtr, IM, -1, "Image", le_gd); if ((nelems = zend_hash_num_elements(Z_ARRVAL_P(z_affine))) != 6) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Affine array must have six elements"); @@ -5163,19 +5145,18 @@ PHP_FUNCTION(imageaffine) } for (i = 0; i < nelems; i++) { - if (zend_hash_index_find(Z_ARRVAL_P(z_affine), i, (void **) &zval_affine_elem) == SUCCESS) { - switch (Z_TYPE_PP(zval_affine_elem)) { + if ((zval_affine_elem = zend_hash_index_find(Z_ARRVAL_P(z_affine), i)) != NULL) { + switch (Z_TYPE_P(zval_affine_elem)) { case IS_LONG: - affine[i] = Z_LVAL_PP(zval_affine_elem); + affine[i] = Z_LVAL_P(zval_affine_elem); break; case IS_DOUBLE: - affine[i] = Z_DVAL_PP(zval_affine_elem); + affine[i] = Z_DVAL_P(zval_affine_elem); break; case IS_STRING: { zval dval; - dval = **zval_affine_elem; - zval_copy_ctor(&dval); + ZVAL_COPY(&dval, zval_affine_elem); convert_to_double(&dval); affine[i] = Z_DVAL(dval); } @@ -5188,60 +5169,56 @@ PHP_FUNCTION(imageaffine) } if (z_rect != NULL) { - if (zend_hash_find(HASH_OF(z_rect), "x", sizeof("x"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "x", sizeof("x") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.x = Z_LVAL(lval); } else { - rect.x = Z_LVAL_PP(tmp); + rect.x = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing x position"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(z_rect), "y", sizeof("x"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "y", sizeof("y") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.y = Z_LVAL(lval); } else { - rect.y = Z_LVAL_PP(tmp); + rect.y = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing y position"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(z_rect), "width", sizeof("width"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "width", sizeof("width") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.width = Z_LVAL(lval); } else { - rect.width = Z_LVAL_PP(tmp); + rect.width = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing width"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(z_rect), "height", sizeof("height"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_LONG) { + if ((tmp = zend_hash_str_find(HASH_OF(z_rect), "height", sizeof("height") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_LONG) { zval lval; - lval = **tmp; - zval_copy_ctor(&lval); + ZVAL_COPY(&lval, tmp); convert_to_long(&lval); rect.height = Z_LVAL(lval); } else { - rect.height = Z_LVAL_PP(tmp); + rect.height = Z_LVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing height"); @@ -5275,7 +5252,7 @@ PHP_FUNCTION(imageaffinematrixget) double affine[6]; long type; zval *options; - zval **tmp; + zval *tmp; int res = GD_FALSE, i; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|z", &type, &options) == FAILURE) { @@ -5290,30 +5267,28 @@ PHP_FUNCTION(imageaffinematrixget) php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array expected as options"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(options), "x", sizeof("x"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_DOUBLE) { + if ((tmp = zend_hash_str_find(HASH_OF(options), "x", sizeof("x") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_DOUBLE) { zval dval; - dval = **tmp; - zval_copy_ctor(&dval); + ZVAL_COPY(&dval, tmp); convert_to_double(&dval); x = Z_DVAL(dval); } else { - x = Z_DVAL_PP(tmp); + x = Z_DVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing x position"); RETURN_FALSE; } - if (zend_hash_find(HASH_OF(options), "y", sizeof("y"), (void **)&tmp) != FAILURE) { - if (Z_TYPE_PP(tmp) != IS_DOUBLE) { + if ((tmp = zend_hash_str_find(HASH_OF(options), "y", sizeof("y") - 1)) != NULL) { + if (Z_TYPE_P(tmp) != IS_DOUBLE) { zval dval; - dval = **tmp; - zval_copy_ctor(&dval); + ZVAL_COPY(&dval, tmp); convert_to_double(&dval); y = Z_DVAL(dval); } else { - y = Z_DVAL_PP(tmp); + y = Z_DVAL_P(tmp); } } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Missing y position"); @@ -5333,7 +5308,7 @@ PHP_FUNCTION(imageaffinematrixget) case GD_AFFINE_SHEAR_VERTICAL: { double angle; - convert_to_double_ex(&options); + convert_to_double_ex(options); angle = Z_DVAL_P(options); if (type == GD_AFFINE_SHEAR_HORIZONTAL) { @@ -5359,8 +5334,7 @@ PHP_FUNCTION(imageaffinematrixget) add_index_double(return_value, i, affine[i]); } } -} - +} /* }}} */ /* {{{ proto array imageaffineconcat(array m1, array m2) Concat two matrices (as in doing many ops in one go) */ @@ -5370,7 +5344,7 @@ PHP_FUNCTION(imageaffinematrixconcat) double m2[6]; double mr[6]; - zval **tmp; + zval *tmp; zval *z_m1; zval *z_m2; int i, nelems; @@ -5385,19 +5359,18 @@ PHP_FUNCTION(imageaffinematrixconcat) } for (i = 0; i < 6; i++) { - if (zend_hash_index_find(Z_ARRVAL_P(z_m1), i, (void **) &tmp) == SUCCESS) { - switch (Z_TYPE_PP(tmp)) { + if ((tmp = zend_hash_index_find(Z_ARRVAL_P(z_m1), i)) != NULL) { + switch (Z_TYPE_P(tmp)) { case IS_LONG: - m1[i] = Z_LVAL_PP(tmp); + m1[i] = Z_LVAL_P(tmp); break; case IS_DOUBLE: - m1[i] = Z_DVAL_PP(tmp); + m1[i] = Z_DVAL_P(tmp); break; case IS_STRING: { zval dval; - dval = **tmp; - zval_copy_ctor(&dval); + ZVAL_COPY(&dval, tmp); convert_to_double(&dval); m1[i] = Z_DVAL(dval); } @@ -5407,19 +5380,18 @@ PHP_FUNCTION(imageaffinematrixconcat) RETURN_FALSE; } } - if (zend_hash_index_find(Z_ARRVAL_P(z_m2), i, (void **) &tmp) == SUCCESS) { - switch (Z_TYPE_PP(tmp)) { + if ((tmp = zend_hash_index_find(Z_ARRVAL_P(z_m2), i)) != NULL) { + switch (Z_TYPE_P(tmp)) { case IS_LONG: - m2[i] = Z_LVAL_PP(tmp); + m2[i] = Z_LVAL_P(tmp); break; case IS_DOUBLE: - m2[i] = Z_DVAL_PP(tmp); + m2[i] = Z_DVAL_P(tmp); break; case IS_STRING: { zval dval; - dval = **tmp; - zval_copy_ctor(&dval); + ZVAL_COPY(&dval, tmp); convert_to_double(&dval); m2[i] = Z_DVAL(dval); } @@ -5439,7 +5411,7 @@ PHP_FUNCTION(imageaffinematrixconcat) for (i = 0; i < 6; i++) { add_index_double(return_value, i, mr[i]); } -} +} /* }}} */ /* {{{ proto resource imagesetinterpolation(resource im, [, method]]) Set the default interpolation method, passing -1 or 0 sets it to the libgd default (bilinear). */ @@ -5453,7 +5425,7 @@ PHP_FUNCTION(imagesetinterpolation) return; } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &IM, -1, "Image", le_gd); + ZEND_FETCH_RESOURCE(im, gdImagePtr, IM, -1, "Image", le_gd); if (method == -1) { method = GD_BILINEAR_FIXED; diff --git a/ext/gd/gd_ctx.c b/ext/gd/gd_ctx.c index 59eff80443..4f97af846a 100644 --- a/ext/gd/gd_ctx.c +++ b/ext/gd/gd_ctx.c @@ -22,7 +22,7 @@ #define CTX_PUTC(c,ctx) ctx->putC(ctx, c) -static void _php_image_output_putc(struct gdIOCtx *ctx, int c) +static void _php_image_output_putc(struct gdIOCtx *ctx, int c) /* {{{ */ { /* without the following downcast, the write will fail * (i.e., will write a zero byte) for all @@ -31,36 +31,36 @@ static void _php_image_output_putc(struct gdIOCtx *ctx, int c) unsigned char ch = (unsigned char) c; TSRMLS_FETCH(); php_write(&ch, 1 TSRMLS_CC); -} +} /* }}} */ -static int _php_image_output_putbuf(struct gdIOCtx *ctx, const void* buf, int l) +static int _php_image_output_putbuf(struct gdIOCtx *ctx, const void* buf, int l) /* {{{ */ { TSRMLS_FETCH(); return php_write((void *)buf, l TSRMLS_CC); -} +} /* }}} */ -static void _php_image_output_ctxfree(struct gdIOCtx *ctx) +static void _php_image_output_ctxfree(struct gdIOCtx *ctx) /* {{{ */ { if(ctx) { efree(ctx); } -} +} /* }}} */ -static void _php_image_stream_putc(struct gdIOCtx *ctx, int c) { +static void _php_image_stream_putc(struct gdIOCtx *ctx, int c) /* {{{ */ { char ch = (char) c; php_stream * stream = (php_stream *)ctx->data; TSRMLS_FETCH(); php_stream_write(stream, &ch, 1); -} +} /* }}} */ -static int _php_image_stream_putbuf(struct gdIOCtx *ctx, const void* buf, int l) +static int _php_image_stream_putbuf(struct gdIOCtx *ctx, const void* buf, int l) /* {{{ */ { php_stream * stream = (php_stream *)ctx->data; TSRMLS_FETCH(); return php_stream_write(stream, (void *)buf, l); -} +} /* }}} */ -static void _php_image_stream_ctxfree(struct gdIOCtx *ctx) +static void _php_image_stream_ctxfree(struct gdIOCtx *ctx) /* {{{ */ { TSRMLS_FETCH(); @@ -71,7 +71,7 @@ static void _php_image_stream_ctxfree(struct gdIOCtx *ctx) if(ctx) { efree(ctx); } -} +} /* }}} */ /* {{{ _php_image_output_ctx */ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()) @@ -108,7 +108,7 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, } } - ZEND_FETCH_RESOURCE(im, gdImagePtr, &imgind, -1, "Image", phpi_get_le_gd()); + ZEND_FETCH_RESOURCE(im, gdImagePtr, imgind, -1, "Image", phpi_get_le_gd()); if (argc >= 3) { q = quality; /* or colorindex for foreground of BW images (defaults to black) */ @@ -119,7 +119,7 @@ static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, if (argc > 1 && to_zval != NULL) { if (Z_TYPE_P(to_zval) == IS_RESOURCE) { - php_stream_from_zval_no_verify(stream, &to_zval); + php_stream_from_zval_no_verify(stream, to_zval); if (stream == NULL) { RETURN_FALSE; } diff --git a/ext/iconv/iconv.c b/ext/iconv/iconv.c index 28677421d8..39c5b314a8 100644 --- a/ext/iconv/iconv.c +++ b/ext/iconv/iconv.c @@ -449,7 +449,7 @@ static int php_iconv_output_handler(void **nothing, php_output_context *output_c if (output_context->in.used) { zend_string *out; output_context->out.free = 1; - _php_iconv_show_error(php_iconv_string(output_context->in.data, output_context->in.used, &out, get_output_encoding(TSRMLS_C), get_internal_encoding(TSRMLS_C)), get_output_encoding(TSRMLS_C), get_internal_encoding(TSRMLS_C)); + _php_iconv_show_error(php_iconv_string(output_context->in.data, output_context->in.used, &out, get_output_encoding(TSRMLS_C), get_internal_encoding(TSRMLS_C)), get_output_encoding(TSRMLS_C), get_internal_encoding(TSRMLS_C) TSRMLS_CC); if (out) { output_context->out.data = estrndup(out->val, out->len); output_context->out.used = out->len; diff --git a/ext/pdo_mysql/tests/config.inc b/ext/pdo_mysql/tests/config.inc index 21f33a2d59..f5ea020b78 100644 --- a/ext/pdo_mysql/tests/config.inc +++ b/ext/pdo_mysql/tests/config.inc @@ -10,7 +10,7 @@ if (false !== getenv('PDO_MYSQL_TEST_DSN')) { $config['ENV']['PDOTEST_ATTR'] = getenv('PDO_MYSQL_TEST_ATTR'); } } else { - $config['ENV']['PDOTEST_DSN'] = 'mysql:host=127.0.0.1;port=3308;dbname=test'; + $config['ENV']['PDOTEST_DSN'] = 'mysql:host=localhost;dbname=test'; $config['ENV']['PDOTEST_USER'] = 'root'; $config['ENV']['PDOTEST_PASS'] = ''; } diff --git a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c index ebb16d9920..9b47af562c 100644 --- a/ext/pdo_sqlite/sqlite_driver.c +++ b/ext/pdo_sqlite/sqlite_driver.c @@ -533,7 +533,7 @@ static PHP_METHOD(SQLite, sqliteCreateFunction) RETURN_FALSE; } - dbh = Z_PDO_DBH_P(getThis() TSRMLS_CC); + dbh = Z_PDO_DBH_P(getThis()); PDO_CONSTRUCT_CHECK; if (!zend_is_callable(callback, 0, &cbname TSRMLS_CC)) { @@ -603,7 +603,7 @@ static PHP_METHOD(SQLite, sqliteCreateAggregate) RETURN_FALSE; } - dbh = Z_PDO_DBH_P(getThis() TSRMLS_CC); + dbh = Z_PDO_DBH_P(getThis()); PDO_CONSTRUCT_CHECK; if (!zend_is_callable(step_callback, 0, &cbname TSRMLS_CC)) { diff --git a/ext/phar/phar.c b/ext/phar/phar.c index 72c9518ba8..62b08cc642 100644 --- a/ext/phar/phar.c +++ b/ext/phar/phar.c @@ -50,7 +50,7 @@ ZEND_INI_MH(phar_ini_modify_handler) /* {{{ */ { zend_bool old, ini; - if (entry->name_length == 14) { + if (entry->name_length == sizeof("phar.readonly")-1) { old = PHAR_G(readonly_orig); } else { old = PHAR_G(require_hash_orig); @@ -376,9 +376,8 @@ static void destroy_phar_data(zval *zv) /* {{{ */ /** * destructor for the manifest hash, frees each file's entry */ -void destroy_phar_manifest_entry(zval *zv) /* {{{ */ +void destroy_phar_manifest_entry_int(phar_entry_info *entry) /* {{{ */ { - phar_entry_info *entry = (phar_entry_info *)Z_PTR_P(zv); TSRMLS_FETCH(); if (entry->cfp) { @@ -422,7 +421,13 @@ void destroy_phar_manifest_entry(zval *zv) /* {{{ */ pefree(entry->tmp, entry->is_persistent); entry->tmp = 0; } +} +/* }}} */ +void destroy_phar_manifest_entry(zval *zv) /* {{{ */ +{ + phar_entry_info *entry = Z_PTR_P(zv); + destroy_phar_manifest_entry_int(entry); pefree(entry, entry->is_persistent); } /* }}} */ @@ -441,7 +446,7 @@ int phar_entry_delref(phar_entry_data *idata TSRMLS_DC) /* {{{ */ } /* if phar_get_or_create_entry_data returns a sub-directory, we have to free it */ if (idata->internal_file->is_temp_dir) { - destroy_phar_manifest_entry((void *)idata->internal_file); + destroy_phar_manifest_entry_int(idata->internal_file); efree(idata->internal_file); } } @@ -2296,7 +2301,6 @@ int phar_split_fname(const char *filename, int filename_len, char **arch, int *a int phar_open_executed_filename(char *alias, int alias_len, char **error TSRMLS_DC) /* {{{ */ { char *fname; -//??? zval *halt_constant; php_stream *fp; int fname_len; char *actual = NULL; @@ -3015,8 +3019,8 @@ int phar_flush(phar_archive_data *phar, char *user_stub, long len, int convert, phar_set_32(entry_buffer+20, entry->metadata_str.s ? entry->metadata_str.s->len : 0); if (sizeof(entry_buffer) != php_stream_write(newfile, entry_buffer, sizeof(entry_buffer)) - || !entry->metadata_str.s - || entry->metadata_str.s->len != php_stream_write(newfile, entry->metadata_str.s->val, entry->metadata_str.s->len)) { + || (entry->metadata_str.s && + entry->metadata_str.s->len != php_stream_write(newfile, entry->metadata_str.s->val, entry->metadata_str.s->len))) { if (closeoldfile) { php_stream_close(oldfile); } diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c index 1fc62e9413..978b036c67 100644 --- a/ext/phar/phar_object.c +++ b/ext/phar/phar_object.c @@ -1429,7 +1429,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ if (!value) { /* failure in get_current_data */ - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned no value", ce->name); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned no value", ce->name->val); return ZEND_HASH_APPLY_STOP; } @@ -1440,7 +1440,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ php_stream_from_zval_no_verify(fp, value); if (!fp) { - zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Iterator %v returned an invalid stream handle", ce->name); + zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Iterator %v returned an invalid stream handle", ce->name->val); return ZEND_HASH_APPLY_STOP; } @@ -1454,7 +1454,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ if (Z_TYPE(key) != IS_STRING) { zval_dtor(&key); - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name->val); return ZEND_HASH_APPLY_STOP; } @@ -1464,7 +1464,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ save = str_key; zval_dtor(&key); } else { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name->val); return ZEND_HASH_APPLY_STOP; } @@ -1478,7 +1478,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ spl_filesystem_object *intern = (spl_filesystem_object*)((char*)Z_OBJ_P(value) - Z_OBJ_P(value)->handlers->offset); if (!base_len) { - zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Iterator %v returns an SplFileInfo object, so base directory must be specified", ce->name); + zend_throw_exception_ex(spl_ce_BadMethodCallException, 0 TSRMLS_CC, "Iterator %v returns an SplFileInfo object, so base directory must be specified", ce->name->val); return ZEND_HASH_APPLY_STOP; } @@ -1522,7 +1522,7 @@ static int phar_build(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ } /* fall-through */ default: - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid value (must return a string)", ce->name); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid value (must return a string)", ce->name->val); return ZEND_HASH_APPLY_STOP; } @@ -1562,7 +1562,7 @@ phar_spl_fileinfo: } } else { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a path \"%s\" that is not in the base directory \"%s\"", ce->name, fname, base); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a path \"%s\" that is not in the base directory \"%s\"", ce->name->val, fname, base); if (save) { efree(save); @@ -1582,7 +1582,7 @@ phar_spl_fileinfo: if (Z_TYPE(key) != IS_STRING) { zval_dtor(&key); - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name->val); return ZEND_HASH_APPLY_STOP; } @@ -1592,13 +1592,13 @@ phar_spl_fileinfo: save = str_key; zval_dtor(&key); } else { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned an invalid key (must return a string)", ce->name->val); return ZEND_HASH_APPLY_STOP; } } #if PHP_API_VERSION < 20100412 if (PG(safe_mode) && (!php_checkuid(fname, NULL, CHECKUID_ALLOW_ONLY_FILE))) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a path \"%s\" that safe mode prevents opening", ce->name, fname); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a path \"%s\" that safe mode prevents opening", ce->name->val, fname); if (save) { efree(save); @@ -1613,7 +1613,7 @@ phar_spl_fileinfo: #endif if (php_check_open_basedir(fname TSRMLS_CC)) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a path \"%s\" that open_basedir prevents opening", ce->name, fname); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a path \"%s\" that open_basedir prevents opening", ce->name->val, fname); if (save) { efree(save); @@ -1630,7 +1630,7 @@ phar_spl_fileinfo: fp = php_stream_open_wrapper(fname, "rb", STREAM_MUST_SEEK|0, &opened); if (!fp) { - zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a file that could not be opened \"%s\"", ce->name, fname); + zend_throw_exception_ex(spl_ce_UnexpectedValueException, 0 TSRMLS_CC, "Iterator %v returned a file that could not be opened \"%s\"", ce->name->val, fname); if (save) { efree(save); @@ -2246,7 +2246,7 @@ static zend_object *phar_convert_to_other(phar_archive_data *source, int convert phar->alias = source->alias; if (Z_TYPE(source->metadata) != IS_UNDEF) { - zval_copy_ctor(&phar->metadata); + ZVAL_DUP(&phar->metadata, &source->metadata); phar->metadata_len = 0; } @@ -2876,7 +2876,7 @@ PHP_METHOD(Phar, setStub) zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "phar \"%s\" is persistent, unable to copy on write", phar_obj->archive->fname); return; } - phar_flush(phar_obj->archive, (char *) &zstub, len, 0, &error TSRMLS_CC); + phar_flush(phar_obj->archive, (char *) zstub, len, 0, &error TSRMLS_CC); if (error) { zend_throw_exception_ex(phar_ce_PharException, 0 TSRMLS_CC, "%s", error); efree(error); diff --git a/ext/phar/tar.c b/ext/phar/tar.c index 861ae23409..6d210cbf5d 100644 --- a/ext/phar/tar.c +++ b/ext/phar/tar.c @@ -180,7 +180,6 @@ static int phar_tar_process_metadata(phar_entry_info *entry, php_stream *fp TSRM if (entry->filename_len == sizeof(".phar/.metadata.bin")-1 && !memcmp(entry->filename, ".phar/.metadata.bin", sizeof(".phar/.metadata.bin")-1)) { entry->phar->metadata = entry->metadata; ZVAL_UNDEF(&entry->metadata); -// ??? len ??? } else if (entry->filename_len >= sizeof(".phar/.metadata/") + sizeof("/.metadata.bin") - 1 && NULL != (mentry = zend_hash_str_find_ptr(&(entry->phar->manifest), entry->filename + sizeof(".phar/.metadata/") - 1, entry->filename_len - (sizeof("/.metadata.bin") - 1 + sizeof(".phar/.metadata/") - 1)))) { /* transfer this metadata to the entry it refers */ mentry->metadata = entry->metadata; @@ -878,7 +877,6 @@ static int phar_tar_setupmetadata(zval *zv, void *argument TSRMLS_DC) /* {{{ */ return phar_tar_setmetadata(&entry->phar->metadata, entry, error TSRMLS_CC); } /* search for the file this metadata entry references */ -//??? len ??? if (entry->filename_len >= sizeof(".phar/.metadata/") + sizeof("/.metadata.bin") - 1 && !zend_hash_str_exists(&(entry->phar->manifest), entry->filename + sizeof(".phar/.metadata/") - 1, entry->filename_len - (sizeof("/.metadata.bin") - 1 + sizeof(".phar/.metadata/") - 1))) { /* this is orphaned metadata, erase it */ return ZEND_HASH_APPLY_REMOVE; diff --git a/ext/phar/util.c b/ext/phar/util.c index 85f5f6566b..1368853d66 100644 --- a/ext/phar/util.c +++ b/ext/phar/util.c @@ -227,7 +227,7 @@ int phar_mount_entry(phar_archive_data *phar, char *filename, int filename_len, if (ssb.sb.st_mode & S_IFDIR) { entry.is_dir = 1; - if (NULL != zend_hash_str_add_ptr(&phar->mounted_dirs, entry.filename, path_len, entry.filename)) { + if (NULL == zend_hash_str_add_ptr(&phar->mounted_dirs, entry.filename, path_len, entry.filename)) { /* directory already mounted */ efree(entry.tmp); efree(entry.filename); @@ -1393,11 +1393,18 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, zend_fcall_info fci; zend_fcall_info_cache fcc; zval retval, zp[3], openssl; + zend_string *str; ZVAL_STRINGL(&openssl, is_sign ? "openssl_sign" : "openssl_verify", is_sign ? sizeof("openssl_sign")-1 : sizeof("openssl_verify")-1); ZVAL_STRINGL(&zp[1], *signature, *signature_len); ZVAL_STRINGL(&zp[2], key, key_len); - ZVAL_STR(&zp[0], php_stream_copy_to_mem(fp, (size_t) end, 0)); + php_stream_rewind(fp); + str = php_stream_copy_to_mem(fp, (size_t) end, 0); + if (str) { + ZVAL_STR(&zp[0], str); + } else { + ZVAL_EMPTY_STRING(&zp[0]); + } if (end != Z_STRLEN(zp[0])) { zval_dtor(&zp[0]); @@ -1446,7 +1453,7 @@ static int phar_call_openssl_signverify(int is_sign, php_stream *fp, off_t end, Z_DELREF(zp[2]); zval_dtor(&zp[0]); - zval_dtor(&zp[1]); + zval_dtor(&zp[2]); switch (Z_TYPE(retval)) { default: @@ -1964,6 +1971,14 @@ static int phar_update_cached_entry(zval *data, void *argument) /* {{{ */ } /* }}} */ +static void phar_manifest_copy_ctor(zval *zv) /* {{{ */ +{ + phar_entry_info *info = emalloc(sizeof(phar_entry_info)); + memcpy(info, Z_PTR_P(zv), sizeof(phar_entry_info)); + Z_PTR_P(zv) = info; +} +/* }}} */ + static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ { phar_archive_data *phar; @@ -1999,8 +2014,7 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ zend_hash_init(&newmanifest, sizeof(phar_entry_info), zend_get_hash_value, destroy_phar_manifest_entry, 0); -//??? zend_hash_copy(&newmanifest, &(*pphar)->manifest, NULL, NULL, sizeof(phar_entry_info)); - zend_hash_copy(&newmanifest, &(*pphar)->manifest, NULL); + zend_hash_copy(&newmanifest, &(*pphar)->manifest, phar_manifest_copy_ctor); zend_hash_apply_with_argument(&newmanifest, phar_update_cached_entry, (void *)phar TSRMLS_CC); phar->manifest = newmanifest; zend_hash_init(&phar->mounted_dirs, sizeof(char *), @@ -2021,13 +2035,16 @@ static void phar_copy_cached_phar(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ int phar_copy_on_write(phar_archive_data **pphar TSRMLS_DC) /* {{{ */ { + zval zv, *pzv; phar_archive_data *newpphar; - if (NULL == (newpphar = zend_hash_str_add_ptr(&(PHAR_GLOBALS->phar_fname_map), (*pphar)->fname, (*pphar)->fname_len, *pphar))) { + ZVAL_PTR(&zv, *pphar); + if (NULL == (pzv = zend_hash_str_add(&(PHAR_GLOBALS->phar_fname_map), (*pphar)->fname, (*pphar)->fname_len, &zv))) { return FAILURE; } - phar_copy_cached_phar(&newpphar TSRMLS_CC); + phar_copy_cached_phar(&Z_PTR_P(pzv) TSRMLS_CC); + newpphar = Z_PTR_P(pzv); /* invalidate phar cache */ PHAR_G(last_phar) = NULL; PHAR_G(last_phar_name) = PHAR_G(last_alias) = NULL; diff --git a/ext/session/mod_files.c b/ext/session/mod_files.c index 3e577bc28a..dd9361b34e 100644 --- a/ext/session/mod_files.c +++ b/ext/session/mod_files.c @@ -475,7 +475,7 @@ PS_CREATE_SID_FUNC(files) PS_FILES_DATA; do { - sid = php_session_create_id((void**)&data TSRMLS_C); + sid = php_session_create_id((void**)&data TSRMLS_CC); /* Check collision */ if (data && ps_files_key_exists(data, sid? sid->val : NULL TSRMLS_CC) == SUCCESS) { if (sid) { diff --git a/ext/spl/spl_directory.c b/ext/spl/spl_directory.c index 8cc7ec0b6d..ca7baf2226 100644 --- a/ext/spl/spl_directory.c +++ b/ext/spl/spl_directory.c @@ -386,7 +386,7 @@ void spl_filesystem_info_set_filename(spl_filesystem_object *intern, char *path, intern->file_name = use_copy ? estrndup(path, len) : path; intern->file_name_len = len; - while (IS_SLASH_AT(intern->file_name, intern->file_name_len-1) && intern->file_name_len > 1) { + while (intern->file_name_len > 1 && IS_SLASH_AT(intern->file_name, intern->file_name_len-1)) { intern->file_name[intern->file_name_len-1] = 0; intern->file_name_len--; } @@ -1881,6 +1881,9 @@ static int spl_filesystem_object_cast(zval *readobj, zval *writeobj, int type TS } return SUCCESS; } + } else if (type == _IS_BOOL) { + ZVAL_TRUE(writeobj); + return SUCCESS; } if (readobj == writeobj) { zval_dtor(readobj); diff --git a/ext/xmlrpc/libxmlrpc/xmlrpc.c b/ext/xmlrpc/libxmlrpc/xmlrpc.c index ce70c2afd9..0f77ae2451 100644 --- a/ext/xmlrpc/libxmlrpc/xmlrpc.c +++ b/ext/xmlrpc/libxmlrpc/xmlrpc.c @@ -2394,7 +2394,7 @@ void XMLRPC_ServerDestroy(XMLRPC_SERVER server) { my_free(sm); sm = Q_Next(&server->methodlist); } - if(server->xIntrospection) { + if (server->xIntrospection) { XMLRPC_CleanupValue(server->xIntrospection); } diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 3fb2ba6bb6..ea0d3c27ec 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -184,8 +184,8 @@ ZEND_GET_MODULE(xmlrpc) /* per server data */ typedef struct _xmlrpc_server_data { - zval* method_map; - zval* introspection_map; + zval method_map; + zval introspection_map; XMLRPC_SERVER server_ptr; } xmlrpc_server_data; @@ -199,10 +199,10 @@ typedef struct _php_output_options { /* data passed to C callback */ typedef struct _xmlrpc_callback_data { - zval* xmlrpc_method; - zval* php_function; - zval* caller_params; - zval* return_data; + zval xmlrpc_method; + zval php_function; + zval caller_params; + zval return_data; xmlrpc_server_data* server; char php_executed; } xmlrpc_callback_data; @@ -251,10 +251,10 @@ typedef struct _xmlrpc_callback_data { /*********************** * forward declarations * ***********************/ -XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue); +XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval* newvalue); static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data); int sset_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE type); -zval* decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval* method_name_out); +void decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval* method_name_out, zval *retval); const char* xmlrpc_type_as_str(XMLRPC_VALUE_TYPE type, XMLRPC_VECTOR_TYPE vtype); XMLRPC_VALUE_TYPE xmlrpc_str_as_type(const char* str); XMLRPC_VECTOR_TYPE xmlrpc_str_as_vector_type(const char* str); @@ -269,11 +269,8 @@ static void destroy_server_data(xmlrpc_server_data *server TSRMLS_DC) if (server) { XMLRPC_ServerDestroy(server->server_ptr); - zval_dtor(server->method_map); - FREE_ZVAL(server->method_map); - - zval_dtor(server->introspection_map); - FREE_ZVAL(server->introspection_map); + zval_ptr_dtor(&server->method_map); + zval_ptr_dtor(&server->introspection_map); efree(server); } @@ -281,7 +278,7 @@ static void destroy_server_data(xmlrpc_server_data *server TSRMLS_DC) /* called when server is being destructed. either when xmlrpc_server_destroy * is called, or when request ends. */ -static void xmlrpc_server_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC) +static void xmlrpc_server_destructor(zend_resource *rsrc TSRMLS_DC) { if (rsrc && rsrc->ptr) { destroy_server_data((xmlrpc_server_data*) rsrc->ptr TSRMLS_CC); @@ -338,28 +335,23 @@ static int add_stringl(zval* list, char* id, char* string, uint length) { #endif -static int add_zval(zval* list, const char* id, zval** val) +static void add_zval(zval* list, const char* id, zval* val) { if (list && val) { if (id) { int id_len = strlen(id); if (!(id_len > 1 && id[0] == '0') && is_numeric_string((char *)id, id_len, NULL, NULL, 0) == IS_LONG) { long index = strtol(id, NULL, 0); - return zend_hash_index_update(Z_ARRVAL_P(list), index, (void *) val, sizeof(zval **), NULL); + zend_hash_index_update(Z_ARRVAL_P(list), index, val); } else { - return zend_hash_update(Z_ARRVAL_P(list), (char*) id, strlen(id) + 1, (void *) val, sizeof(zval **), NULL); + zend_hash_str_update(Z_ARRVAL_P(list), (char*)id, strlen(id), val); } } else { - return zend_hash_next_index_insert(Z_ARRVAL_P(list), (void *) val, sizeof(zval **), NULL); + zend_hash_next_index_insert(Z_ARRVAL_P(list), val); } } - /* what is the correct return on error? */ - return 0; } -#define my_zend_hash_get_current_key(ht, my_key, num_index) zend_hash_get_current_key(ht, my_key, num_index, 0) - - /************************* * input / output options * *************************/ @@ -369,7 +361,6 @@ static int add_zval(zval* list, const char* id, zval** val) static void set_output_options(php_output_options* options, zval* output_opts) { if (options) { - /* defaults */ options->b_php_out = 0; options->b_auto_version = 1; @@ -379,92 +370,86 @@ static void set_output_options(php_output_options* options, zval* output_opts) options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping | xml_elem_non_ascii_escaping | xml_elem_non_print_escaping; if (output_opts && Z_TYPE_P(output_opts) == IS_ARRAY) { - zval** val; + zval* val; /* type of output (xml/php) */ - if (zend_hash_find(Z_ARRVAL_P(output_opts), OUTPUT_TYPE_KEY, OUTPUT_TYPE_KEY_LEN + 1, (void**) &val) == SUCCESS) { - if (Z_TYPE_PP(val) == IS_STRING) { - if (!strcmp(Z_STRVAL_PP(val), OUTPUT_TYPE_VALUE_PHP)) { + if ((val = zend_hash_str_find(Z_ARRVAL_P(output_opts), OUTPUT_TYPE_KEY, OUTPUT_TYPE_KEY_LEN)) != NULL) { + if (Z_TYPE_P(val) == IS_STRING) { + if (!strcmp(Z_STRVAL_P(val), OUTPUT_TYPE_VALUE_PHP)) { options->b_php_out = 1; - } else if (!strcmp(Z_STRVAL_PP(val), OUTPUT_TYPE_VALUE_XML)) { + } else if (!strcmp(Z_STRVAL_P(val), OUTPUT_TYPE_VALUE_XML)) { options->b_php_out = 0; } } } /* verbosity of generated xml */ - if (zend_hash_find(Z_ARRVAL_P(output_opts), VERBOSITY_KEY, VERBOSITY_KEY_LEN + 1, (void**) &val) == SUCCESS) { - if (Z_TYPE_PP(val) == IS_STRING) { - if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_NO_WHITE_SPACE)) { + if ((val = zend_hash_str_find(Z_ARRVAL_P(output_opts), VERBOSITY_KEY, VERBOSITY_KEY_LEN)) != NULL) { + if (Z_TYPE_P(val) == IS_STRING) { + if (!strcmp(Z_STRVAL_P(val), VERBOSITY_VALUE_NO_WHITE_SPACE)) { options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_no_white_space; - } else if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_NEWLINES_ONLY)) { + } else if (!strcmp(Z_STRVAL_P(val), VERBOSITY_VALUE_NEWLINES_ONLY)) { options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_newlines_only; - } else if (!strcmp(Z_STRVAL_PP(val), VERBOSITY_VALUE_PRETTY)) { + } else if (!strcmp(Z_STRVAL_P(val), VERBOSITY_VALUE_PRETTY)) { options->xmlrpc_out.xml_elem_opts.verbosity = xml_elem_pretty; } } } /* version of xml to output */ - if (zend_hash_find(Z_ARRVAL_P(output_opts), VERSION_KEY, VERSION_KEY_LEN + 1, (void**) &val) == SUCCESS) { - if (Z_TYPE_PP(val) == IS_STRING) { + if ((val = zend_hash_str_find(Z_ARRVAL_P(output_opts), VERSION_KEY, VERSION_KEY_LEN)) != NULL) { + if (Z_TYPE_P(val) == IS_STRING) { options->b_auto_version = 0; - if (!strcmp(Z_STRVAL_PP(val), VERSION_VALUE_XMLRPC)) { + if (!strcmp(Z_STRVAL_P(val), VERSION_VALUE_XMLRPC)) { options->xmlrpc_out.version = xmlrpc_version_1_0; - } else if (!strcmp(Z_STRVAL_PP(val), VERSION_VALUE_SIMPLE)) { + } else if (!strcmp(Z_STRVAL_P(val), VERSION_VALUE_SIMPLE)) { options->xmlrpc_out.version = xmlrpc_version_simple; - } else if (!strcmp((*val)->value.str.val, VERSION_VALUE_SOAP11)) { - options->xmlrpc_out.version = xmlrpc_version_soap_1_1; + } else if (!strcmp(Z_STRVAL_P(val), VERSION_VALUE_SOAP11)) { + options->xmlrpc_out.version = xmlrpc_version_soap_1_1; } else { /* if(!strcmp((*val)->value.str.val, VERSION_VALUE_AUTO)) { */ - options->b_auto_version = 1; + options->b_auto_version = 1; } } - } - /* encoding code set */ - if (zend_hash_find(Z_ARRVAL_P(output_opts), ENCODING_KEY, ENCODING_KEY_LEN + 1, (void**)&val) == SUCCESS) { - if (Z_TYPE_PP(val) == IS_STRING) { - options->xmlrpc_out.xml_elem_opts.encoding = estrdup(Z_STRVAL_PP(val)); + /* encoding code set */ + if ((val = zend_hash_str_find(Z_ARRVAL_P(output_opts), ENCODING_KEY, ENCODING_KEY_LEN)) != NULL) { + if (Z_TYPE_P(val) == IS_STRING) { + options->xmlrpc_out.xml_elem_opts.encoding = estrdup(Z_STRVAL_P(val)); + } } - } - /* escaping options */ - if (zend_hash_find(Z_ARRVAL_P(output_opts), ESCAPING_KEY, ESCAPING_KEY_LEN + 1, (void**)&val) == SUCCESS) { - /* multiple values allowed. check if array */ - if (Z_TYPE_PP(val) == IS_ARRAY) { - zval** iter_val; + /* escaping options */ + if ((val = zend_hash_str_find(Z_ARRVAL_P(output_opts), ESCAPING_KEY, ESCAPING_KEY_LEN)) != NULL) { + /* multiple values allowed. check if array */ + if (Z_TYPE_P(val) == IS_ARRAY) { + zval* iter_val; - zend_hash_internal_pointer_reset(Z_ARRVAL_PP(val)); - options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_no_escaping; + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_no_escaping; - while (1) { - if (zend_hash_get_current_data(Z_ARRVAL_PP(val), (void**)&iter_val) == SUCCESS) { - if (Z_TYPE_PP(iter_val) == IS_STRING && Z_STRVAL_PP(iter_val)) { - if (!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_CDATA)) { + ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(val), iter_val) { + if (Z_TYPE_P(iter_val) == IS_STRING && Z_STRVAL_P(iter_val)) { + if (!strcmp(Z_STRVAL_P(iter_val), ESCAPING_VALUE_CDATA)) { options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_cdata_escaping; - } else if (!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_ASCII)) { + } else if (!strcmp(Z_STRVAL_P(iter_val), ESCAPING_VALUE_NON_ASCII)) { options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_ascii_escaping; - } else if (!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_NON_PRINT)) { + } else if (!strcmp(Z_STRVAL_P(iter_val), ESCAPING_VALUE_NON_PRINT)) { options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_non_print_escaping; - } else if (!strcmp(Z_STRVAL_PP(iter_val), ESCAPING_VALUE_MARKUP)) { + } else if (!strcmp(Z_STRVAL_P(iter_val), ESCAPING_VALUE_MARKUP)) { options->xmlrpc_out.xml_elem_opts.escaping |= xml_elem_markup_escaping; } } - } else { - break; + } ZEND_HASH_FOREACH_END(); + /* else, check for single value */ + } else if (Z_TYPE_P(val) == IS_STRING) { + if (!strcmp(Z_STRVAL_P(val), ESCAPING_VALUE_CDATA)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_cdata_escaping; + } else if (!strcmp(Z_STRVAL_P(val), ESCAPING_VALUE_NON_ASCII)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_ascii_escaping; + } else if (!strcmp(Z_STRVAL_P(val), ESCAPING_VALUE_NON_PRINT)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_print_escaping; + } else if (!strcmp(Z_STRVAL_P(val), ESCAPING_VALUE_MARKUP)) { + options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping; } - zend_hash_move_forward(Z_ARRVAL_PP(val)); - } - /* else, check for single value */ - } else if (Z_TYPE_PP(val) == IS_STRING) { - if (!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_CDATA)) { - options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_cdata_escaping; - } else if (!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_NON_ASCII)) { - options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_ascii_escaping; - } else if (!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_NON_PRINT)) { - options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_non_print_escaping; - } else if (!strcmp(Z_STRVAL_PP(val), ESCAPING_VALUE_MARKUP)) { - options->xmlrpc_out.xml_elem_opts.escaping = xml_elem_markup_escaping; } } } @@ -486,13 +471,10 @@ static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) { int bArray = 0, bStruct = 0, bMixed = 0; unsigned long num_index, last_num = 0; - char* my_key; + zend_string* my_key; - zend_hash_internal_pointer_reset(ht); - while (1) { - int res = my_zend_hash_get_current_key(ht, &my_key, &num_index); - - if (res == HASH_KEY_IS_LONG) { + ZEND_HASH_FOREACH_KEY(ht, num_index, my_key) { + if (my_key == NULL) { if (bStruct) { bMixed = 1; break; @@ -502,17 +484,14 @@ static XMLRPC_VECTOR_TYPE determine_vector_type (HashTable *ht) } bArray = 1; last_num = num_index; - } else if (res == HASH_KEY_NON_EXISTENT) { - break; - } else if (res == HASH_KEY_IS_STRING) { + } else { if (bArray) { bMixed = 1; break; } bStruct = 1; } - zend_hash_move_forward(ht); - } + } ZEND_HASH_FOREACH_END(); return bMixed ? xmlrpc_vector_mixed : (bStruct ? xmlrpc_vector_struct : xmlrpc_vector_array); } @@ -522,94 +501,84 @@ static XMLRPC_VALUE PHP_to_XMLRPC_worker (const char* key, zval* in_val, int dep XMLRPC_VALUE xReturn = NULL; if (in_val) { - zval* val = NULL; + zval val; + ZVAL_UNDEF(&val); XMLRPC_VALUE_TYPE type = get_zval_xmlrpc_type(in_val, &val); - if (val) { + if (!Z_ISUNDEF(val)) { switch (type) { case xmlrpc_base64: - if (Z_TYPE_P(val) == IS_NULL) { + if (Z_TYPE(val) == IS_NULL) { xReturn = XMLRPC_CreateValueEmpty(); XMLRPC_SetValueID(xReturn, key, 0); } else { - xReturn = XMLRPC_CreateValueBase64(key, Z_STRVAL_P(val), Z_STRLEN_P(val)); + xReturn = XMLRPC_CreateValueBase64(key, Z_STRVAL(val), Z_STRLEN(val)); } break; case xmlrpc_datetime: - convert_to_string(val); - xReturn = XMLRPC_CreateValueDateTime_ISO8601(key, Z_STRVAL_P(val)); + convert_to_string(&val); + xReturn = XMLRPC_CreateValueDateTime_ISO8601(key, Z_STRVAL(val)); break; case xmlrpc_boolean: - convert_to_boolean(val); - xReturn = XMLRPC_CreateValueBoolean(key, Z_TYPE_P(val) == IS_TRUE); + convert_to_boolean(&val); + xReturn = XMLRPC_CreateValueBoolean(key, Z_TYPE(val) == IS_TRUE); break; case xmlrpc_int: - convert_to_long(val); - xReturn = XMLRPC_CreateValueInt(key, Z_LVAL_P(val)); + convert_to_long(&val); + xReturn = XMLRPC_CreateValueInt(key, Z_LVAL(val)); break; case xmlrpc_double: - convert_to_double(val); - xReturn = XMLRPC_CreateValueDouble(key, Z_DVAL_P(val)); + convert_to_double(&val); + xReturn = XMLRPC_CreateValueDouble(key, Z_DVAL(val)); break; case xmlrpc_string: - convert_to_string(val); - xReturn = XMLRPC_CreateValueString(key, Z_STRVAL_P(val), Z_STRLEN_P(val)); + convert_to_string(&val); + xReturn = XMLRPC_CreateValueString(key, Z_STRVAL(val), Z_STRLEN(val)); break; case xmlrpc_vector: { unsigned long num_index; - zval** pIter; - char* my_key; + zval* pIter; + zend_string* my_key; HashTable *ht = NULL; - zval *val_arr; + zval val_arr; XMLRPC_VECTOR_TYPE vtype; - ht = HASH_OF(val); - if (ht && ht->nApplyCount > 1) { + ht = HASH_OF(&val); + if (ht && ht->u.v.nApplyCount > 1) { php_error_docref(NULL TSRMLS_CC, E_ERROR, "XML-RPC doesn't support circular references"); return NULL; } - MAKE_STD_ZVAL(val_arr); - MAKE_COPY_ZVAL(&val, val_arr); - convert_to_array(val_arr); + ZVAL_COPY(&val_arr, &val); + convert_to_array(&val_arr); - vtype = determine_vector_type(Z_ARRVAL_P(val_arr)); + vtype = determine_vector_type(Z_ARRVAL(val_arr)); xReturn = XMLRPC_CreateVector(key, vtype); - zend_hash_internal_pointer_reset(Z_ARRVAL_P(val_arr)); - while(zend_hash_get_current_data(Z_ARRVAL_P(val_arr), (void**)&pIter) == SUCCESS) { - int res = my_zend_hash_get_current_key(Z_ARRVAL_P(val_arr), &my_key, &num_index); - - switch (res) { - case HASH_KEY_NON_EXISTENT: - break; - case HASH_KEY_IS_STRING: - case HASH_KEY_IS_LONG: - ht = HASH_OF(*pIter); - if (ht) { - ht->nApplyCount++; - } - if (res == HASH_KEY_IS_LONG) { - char *num_str = NULL; - - if (vtype != xmlrpc_vector_array) { - spprintf(&num_str, 0, "%ld", num_index); - } - XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(num_str, *pIter, depth++ TSRMLS_CC)); - if (num_str) { - efree(num_str); - } - } else { - XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(my_key, *pIter, depth++ TSRMLS_CC)); - } - if (ht) { - ht->nApplyCount--; - } - break; + ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL(val_arr), num_index, my_key, pIter) { + ht = HASH_OF(pIter); + if (ht) { + ht->u.v.nApplyCount++; } - zend_hash_move_forward(Z_ARRVAL_P(val_arr)); - } + if (my_key == NULL) { + char *num_str = NULL; + + if (vtype != xmlrpc_vector_array) { + spprintf(&num_str, 0, "%ld", num_index); + } + + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(num_str, pIter, depth++ TSRMLS_CC)); + if (num_str) { + efree(num_str); + } + } else { + XMLRPC_AddValueToVector(xReturn, PHP_to_XMLRPC_worker(my_key->val, pIter, depth++ TSRMLS_CC)); + } + if (ht) { + ht->u.v.nApplyCount--; + } + } ZEND_HASH_FOREACH_END(); zval_ptr_dtor(&val_arr); } break; @@ -627,51 +596,39 @@ static XMLRPC_VALUE PHP_to_XMLRPC(zval* root_val TSRMLS_DC) } /* recursively convert xmlrpc values into php values */ -static zval* XMLRPC_to_PHP(XMLRPC_VALUE el) +static void XMLRPC_to_PHP(XMLRPC_VALUE el, zval *elem) { - zval* elem = NULL; const char* pStr; if (el) { XMLRPC_VALUE_TYPE type = XMLRPC_GetValueType(el); - MAKE_STD_ZVAL(elem); /* init. very important. spent a frustrating day finding this out. */ - - switch(type) { + switch (type) { case xmlrpc_empty: - Z_TYPE_P(elem) = IS_NULL; + ZVAL_NULL(elem); break; case xmlrpc_string: pStr = XMLRPC_GetValueString(el); if (pStr) { - Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); - Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem)); - Z_TYPE_P(elem) = IS_STRING; + ZVAL_STRINGL(elem, pStr, XMLRPC_GetValueStringLen(el)); } break; case xmlrpc_int: - Z_LVAL_P(elem) = XMLRPC_GetValueInt(el); - Z_TYPE_P(elem) = IS_LONG; + ZVAL_LONG(elem, XMLRPC_GetValueInt(el)); break; case xmlrpc_boolean: - Z_LVAL_P(elem) = XMLRPC_GetValueBoolean(el); - Z_TYPE_P(elem) = IS_BOOL; + ZVAL_BOOL(elem, XMLRPC_GetValueBoolean(el)); break; case xmlrpc_double: - Z_DVAL_P(elem) = XMLRPC_GetValueDouble(el); - Z_TYPE_P(elem) = IS_DOUBLE; + ZVAL_DOUBLE(elem, XMLRPC_GetValueDouble(el)); break; case xmlrpc_datetime: - Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); - Z_STRVAL_P(elem) = estrndup(XMLRPC_GetValueDateTime_ISO8601(el), Z_STRLEN_P(elem)); - Z_TYPE_P(elem) = IS_STRING; + ZVAL_STRINGL(elem, XMLRPC_GetValueDateTime_ISO8601(el), XMLRPC_GetValueStringLen(el)); break; case xmlrpc_base64: pStr = XMLRPC_GetValueBase64(el); if (pStr) { - Z_STRLEN_P(elem) = XMLRPC_GetValueStringLen(el); - Z_STRVAL_P(elem) = estrndup(pStr, Z_STRLEN_P(elem)); - Z_TYPE_P(elem) = IS_STRING; + ZVAL_STRINGL(elem, pStr, XMLRPC_GetValueStringLen(el)); } break; case xmlrpc_vector: @@ -680,8 +637,10 @@ static zval* XMLRPC_to_PHP(XMLRPC_VALUE el) XMLRPC_VALUE xIter = XMLRPC_VectorRewind(el); while( xIter ) { - zval *val = XMLRPC_to_PHP(xIter); - if (val) { + zval val; + ZVAL_UNDEF(&val); + XMLRPC_to_PHP(xIter, &val); + if (!Z_ISUNDEF(val)) { add_zval(elem, XMLRPC_GetValueID(xIter), &val); } xIter = XMLRPC_VectorNext(el); @@ -693,7 +652,6 @@ static zval* XMLRPC_to_PHP(XMLRPC_VALUE el) } set_zval_xmlrpc_type(elem, type); } - return elem; } /* {{{ proto string xmlrpc_encode_request(string method, mixed params [, array output_options]) @@ -713,7 +671,7 @@ PHP_FUNCTION(xmlrpc_encode_request) set_output_options(&out, out_opts ? out_opts : 0); - if (return_value_used) { + if (USED_RET()) { xRequest = XMLRPC_RequestNew(); if (xRequest) { @@ -730,7 +688,7 @@ PHP_FUNCTION(xmlrpc_encode_request) outBuf = XMLRPC_REQUEST_ToXML(xRequest, 0); if (outBuf) { - RETVAL_STRING(outBuf, 1); + RETVAL_STRING(outBuf); free(outBuf); } XMLRPC_RequestFree(xRequest, 1); @@ -748,23 +706,23 @@ PHP_FUNCTION(xmlrpc_encode_request) PHP_FUNCTION(xmlrpc_encode) { XMLRPC_VALUE xOut = NULL; - zval **arg1; + zval *arg1; char *outBuf; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg1) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &arg1) == FAILURE) { return; } - if (return_value_used) { + if (USED_RET()) { /* convert native php type to xmlrpc type */ - xOut = PHP_to_XMLRPC(*arg1 TSRMLS_CC); + xOut = PHP_to_XMLRPC(arg1 TSRMLS_CC); /* generate raw xml from xmlrpc data */ outBuf = XMLRPC_VALUE_ToXML(xOut, 0); if (xOut) { if (outBuf) { - RETVAL_STRING(outBuf, 1); + RETVAL_STRING(outBuf); free(outBuf); } /* cleanup */ @@ -774,9 +732,8 @@ PHP_FUNCTION(xmlrpc_encode) } /* }}} */ -zval* decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval* method_name_out) /* {{{ */ +void decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval* method_name_out, zval *retval) /* {{{ */ { - zval* retval = NULL; XMLRPC_REQUEST response; STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS opts = {{0}}; const char *method_name; @@ -785,20 +742,19 @@ zval* decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zva /* generate XMLRPC_REQUEST from raw xml */ response = XMLRPC_REQUEST_FromXML(xml_in, xml_in_len, &opts); if (response) { + ZVAL_NULL(retval); /* convert xmlrpc data to native php types */ - retval = XMLRPC_to_PHP(XMLRPC_RequestGetData(response)); + XMLRPC_to_PHP(XMLRPC_RequestGetData(response), retval); if (XMLRPC_RequestGetRequestType(response) == xmlrpc_request_call) { if (method_name_out) { method_name = XMLRPC_RequestGetMethodName(response); if (method_name) { - zval_dtor(method_name_out); - Z_TYPE_P(method_name_out) = IS_STRING; - Z_STRVAL_P(method_name_out) = estrdup(method_name); - Z_STRLEN_P(method_name_out) = strlen(Z_STRVAL_P(method_name_out)); - } else if (retval) { - zval_ptr_dtor(&retval); - retval = NULL; + zval_ptr_dtor(method_name_out); + ZVAL_STRING(method_name_out, method_name); + } else { + zval_ptr_dtor(retval); + ZVAL_NULL(retval); } } } @@ -806,7 +762,6 @@ zval* decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zva /* dust, sweep, and mop */ XMLRPC_RequestFree(response, 1); } - return retval; } /* }}} */ @@ -815,20 +770,17 @@ zval* decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zva PHP_FUNCTION(xmlrpc_decode_request) { char *xml, *encoding = NULL; - zval **method; + zval *method; int xml_len, encoding_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sZ|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { return; } + ZVAL_DEREF(method); - if (return_value_used) { - zval* retval = decode_request_worker(xml, xml_len, encoding_len ? encoding : NULL, *method); - if (retval) { - *return_value = *retval; - FREE_ZVAL(retval); - } + if (USED_RET()) { + decode_request_worker(xml, xml_len, encoding_len ? encoding : NULL, method, return_value); } } /* }}} */ @@ -844,12 +796,8 @@ PHP_FUNCTION(xmlrpc_decode) return; } - if (return_value_used) { - zval* retval = decode_request_worker(arg1, arg1_len, arg2_len ? arg2 : NULL, NULL); - if (retval) { - *return_value = *retval; - FREE_ZVAL(retval); - } + if (USED_RET()) { + decode_request_worker(arg1, arg1_len, arg2_len ? arg2 : NULL, NULL, return_value); } } /* }}} */ @@ -866,24 +814,18 @@ PHP_FUNCTION(xmlrpc_server_create) return; } - if (return_value_used) { - zval *method_map, *introspection_map; + if (USED_RET()) { xmlrpc_server_data *server = emalloc(sizeof(xmlrpc_server_data)); - MAKE_STD_ZVAL(method_map); - MAKE_STD_ZVAL(introspection_map); - - array_init(method_map); - array_init(introspection_map); /* allocate server data. free'd in destroy_server_data() */ - server->method_map = method_map; - server->introspection_map = introspection_map; + array_init(&server->method_map); + array_init(&server->introspection_map); server->server_ptr = XMLRPC_ServerCreate(); XMLRPC_ServerRegisterIntrospectionCallback(server->server_ptr, php_xmlrpc_introspection_callback); /* store for later use */ - ZEND_REGISTER_RESOURCE(return_value,server, le_xmlrpc_server); + ZEND_REGISTER_RESOURCE(return_value, server, le_xmlrpc_server); } } /* }}} */ @@ -893,23 +835,22 @@ PHP_FUNCTION(xmlrpc_server_create) PHP_FUNCTION(xmlrpc_server_destroy) { zval *arg1; - int bSuccess = FAILURE, type; + int bSuccess = FAILURE; xmlrpc_server_data *server; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &arg1) == FAILURE) { return; } - server = zend_list_find(Z_LVAL_P(arg1), &type); - - if (server && type == le_xmlrpc_server) { - bSuccess = zend_list_delete(Z_LVAL_P(arg1)); + ZEND_FETCH_RESOURCE(server, xmlrpc_server_data*, arg1, -1, "xmlrpc server", le_xmlrpc_server); + if (server) { + bSuccess = zend_list_close(Z_RES_P(arg1)); /* called by hashtable destructor * destroy_server_data(server); */ } - RETVAL_LONG(bSuccess == SUCCESS); + RETURN_BOOL(bSuccess == SUCCESS); } /* }}} */ @@ -919,42 +860,38 @@ PHP_FUNCTION(xmlrpc_server_destroy) static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRequest, void* data) /* {{{ */ { xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; - zval** php_function; - zval* xmlrpc_params; - zval* callback_params[3]; + zval* php_function; + zval xmlrpc_params; + zval callback_params[3]; TSRMLS_FETCH(); - zval_dtor(pData->xmlrpc_method); - zval_dtor(pData->return_data); + zval_ptr_dtor(&pData->xmlrpc_method); + zval_ptr_dtor(&pData->return_data); /* convert xmlrpc to native php types */ - ZVAL_STRING(pData->xmlrpc_method, XMLRPC_RequestGetMethodName(xRequest), 1); - xmlrpc_params = XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest)); + ZVAL_STRING(&pData->xmlrpc_method, XMLRPC_RequestGetMethodName(xRequest)); + XMLRPC_to_PHP(XMLRPC_RequestGetData(xRequest), &xmlrpc_params); /* check if the called method has been previous registered */ - if(zend_hash_find(Z_ARRVAL_P(pData->server->method_map), - Z_STRVAL_P(pData->xmlrpc_method), - Z_STRLEN_P(pData->xmlrpc_method) + 1, - (void**)&php_function) == SUCCESS) { - - pData->php_function = *php_function; + if ((php_function = zend_hash_find(Z_ARRVAL(pData->server->method_map), Z_STR(pData->xmlrpc_method))) != NULL) { + ZVAL_COPY_VALUE(&pData->php_function, php_function); } /* setup data hoojum */ - callback_params[0] = pData->xmlrpc_method; - callback_params[1] = xmlrpc_params; - callback_params[2] = pData->caller_params; + ZVAL_COPY_VALUE(&callback_params[0], &pData->xmlrpc_method); + ZVAL_COPY_VALUE(&callback_params[1], &xmlrpc_params); + ZVAL_COPY_VALUE(&callback_params[2], &pData->caller_params); /* Use same C function for all methods */ /* php func prototype: function user_func($method_name, $xmlrpc_params, $user_params) */ - call_user_function(CG(function_table), NULL, pData->php_function, pData->return_data, 3, callback_params TSRMLS_CC); + call_user_function(CG(function_table), NULL, &pData->php_function, &pData->return_data, 3, callback_params TSRMLS_CC); pData->php_executed = 1; zval_ptr_dtor(&xmlrpc_params); - return PHP_to_XMLRPC(pData->return_data TSRMLS_CC); + return PHP_to_XMLRPC(&pData->return_data TSRMLS_CC); } /* }}} */ @@ -963,61 +900,54 @@ static XMLRPC_VALUE php_xmlrpc_callback(XMLRPC_SERVER server, XMLRPC_REQUEST xRe */ static void php_xmlrpc_introspection_callback(XMLRPC_SERVER server, void* data) /* {{{ */ { - zval retval, **php_function; - zval *callback_params[1]; - char *php_function_name; + zval retval, *php_function; + zval callback_params[1]; + zend_string *php_function_name; xmlrpc_callback_data* pData = (xmlrpc_callback_data*)data; TSRMLS_FETCH(); /* setup data hoojum */ - callback_params[0] = pData->caller_params; - - /* loop through and call all registered callbacks */ - zend_hash_internal_pointer_reset(Z_ARRVAL_P(pData->server->introspection_map)); - while (1) { - if (zend_hash_get_current_data(Z_ARRVAL_P(pData->server->introspection_map), (void**)&php_function) == SUCCESS) { - if (zend_is_callable(*php_function, 0, &php_function_name TSRMLS_CC)) { - /* php func prototype: function string user_func($user_params) */ - if (call_user_function(CG(function_table), NULL, *php_function, &retval, 1, callback_params TSRMLS_CC) == SUCCESS) { - XMLRPC_VALUE xData; - STRUCT_XMLRPC_ERROR err = {0}; - - /* return value should be a string */ - convert_to_string(&retval); - - xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL(retval), &err); - - if (xData) { - if (!XMLRPC_ServerAddIntrospectionData(server, xData)) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s(), improper element structure", php_function_name); - } - XMLRPC_CleanupValue(xData); - } else { - /* could not create description */ - if (err.xml_elem_error.parser_code) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to add introspection data returned from %s()", - err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error, php_function_name); - } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", php_function_name); - } + ZVAL_COPY_VALUE(&callback_params[0], &pData->caller_params); + + ZEND_HASH_FOREACH_VAL(Z_ARRVAL(pData->server->introspection_map), php_function) { + if (zend_is_callable(php_function, 0, &php_function_name TSRMLS_CC)) { + /* php func prototype: function string user_func($user_params) */ + if (call_user_function(CG(function_table), NULL, php_function, &retval, 1, callback_params TSRMLS_CC) == SUCCESS) { + XMLRPC_VALUE xData; + STRUCT_XMLRPC_ERROR err = {0}; + + /* return value should be a string */ + convert_to_string(&retval); + + xData = XMLRPC_IntrospectionCreateDescription(Z_STRVAL(retval), &err); + + if (xData) { + if (!XMLRPC_ServerAddIntrospectionData(server, xData)) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s(), improper element structure", php_function_name->val); } - zval_dtor(&retval); + XMLRPC_CleanupValue(xData); } else { - /* user func failed */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user introspection callback: %s()", php_function_name); + /* could not create description */ + if (err.xml_elem_error.parser_code) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "xml parse error: [line %ld, column %ld, message: %s] Unable to add introspection data returned from %s()", + err.xml_elem_error.column, err.xml_elem_error.line, err.xml_elem_error.parser_error, php_function_name->val); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to add introspection data returned from %s()", php_function_name->val); + } } + zval_ptr_dtor(&retval); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid callback '%s' passed", php_function_name); + /* user func failed */ + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Error calling user introspection callback: %s()", php_function_name->val); } - efree(php_function_name); } else { - break; + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid callback '%s' passed", php_function_name->val); } - zend_hash_move_forward(Z_ARRVAL_P(pData->server->introspection_map)); - } + STR_RELEASE(php_function_name); + } ZEND_HASH_FOREACH_END(); /* so we don't call the same callbacks ever again */ - zend_hash_clean(Z_ARRVAL_P(pData->server->introspection_map)); + zend_hash_clean(Z_ARRVAL(pData->server->introspection_map)); } /* }}} */ @@ -1027,32 +957,29 @@ PHP_FUNCTION(xmlrpc_server_register_method) { char *method_key; int method_key_len; - zval *handle, *method_name_save, **method_name; - int type; + zval *handle, *method_name; xmlrpc_server_data* server; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsZ", &handle, &method_key, &method_key_len, &method_name) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz", &handle, &method_key, &method_key_len, &method_name) == FAILURE) { return; } - server = zend_list_find(Z_LVAL_P(handle), &type); + ZEND_FETCH_RESOURCE(server, xmlrpc_server_data*, handle, -1, "xmlrpc server", le_xmlrpc_server); - if (type == le_xmlrpc_server) { - /* register with C engine. every method just calls our standard callback, - * and it then dispatches to php as necessary - */ - if (XMLRPC_ServerRegisterMethod(server->server_ptr, method_key, php_xmlrpc_callback)) { - /* save for later use */ - ALLOC_ZVAL(method_name_save); - MAKE_COPY_ZVAL(method_name, method_name_save); - - /* register our php method */ - add_zval(server->method_map, method_key, &method_name_save); + /* register with C engine. every method just calls our standard callback, + * and it then dispatches to php as necessary + */ + if (XMLRPC_ServerRegisterMethod(server->server_ptr, method_key, php_xmlrpc_callback)) { + /* save for later use */ - RETURN_BOOL(1); + if (Z_REFCOUNTED_P(method_name)) { + Z_ADDREF_P(method_name); } + /* register our php method */ + add_zval(&server->method_map, method_key, method_name); + + RETURN_TRUE; } - RETURN_BOOL(0); } /* }}} */ @@ -1060,27 +987,22 @@ PHP_FUNCTION(xmlrpc_server_register_method) Register a PHP function to generate documentation */ PHP_FUNCTION(xmlrpc_server_register_introspection_callback) { - zval **method_name, *handle, *method_name_save; - int type; + zval *method_name, *handle; xmlrpc_server_data* server; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rZ", &handle, &method_name) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz", &handle, &method_name) == FAILURE) { return; } - server = zend_list_find(Z_LVAL_P(handle), &type); + ZEND_FETCH_RESOURCE(server, xmlrpc_server_data*, handle, -1, "xmlrpc server", le_xmlrpc_server); - if (type == le_xmlrpc_server) { - /* save for later use */ - ALLOC_ZVAL(method_name_save); - MAKE_COPY_ZVAL(method_name, method_name_save); - - /* register our php method */ - add_zval(server->introspection_map, NULL, &method_name_save); - - RETURN_BOOL(1); + if (Z_REFCOUNTED_P(method_name)) { + Z_ADDREF_P(method_name); } - RETURN_BOOL(0); + /* register our php method */ + add_zval(&server->introspection_map, NULL, method_name); + + RETURN_TRUE; } /* }}} */ @@ -1090,17 +1012,17 @@ PHP_FUNCTION(xmlrpc_server_register_introspection_callback) Parses XML requests and call methods */ PHP_FUNCTION(xmlrpc_server_call_method) { - xmlrpc_callback_data data = {0}; XMLRPC_REQUEST xRequest; + xmlrpc_callback_data data; STRUCT_XMLRPC_REQUEST_INPUT_OPTIONS input_opts; xmlrpc_server_data* server; - zval **caller_params, *handle, *output_opts = NULL; + zval *caller_params, *handle, *output_opts = NULL; char *rawxml; - int rawxml_len, type; + int rawxml_len; php_output_options out; - int argc =ZEND_NUM_ARGS(); + int argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsZ|a", &handle, &rawxml, &rawxml_len, &caller_params, &output_opts) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsz|a", &handle, &rawxml, &rawxml_len, &caller_params, &output_opts) != SUCCESS) { return; } /* user output options */ @@ -1110,87 +1032,80 @@ PHP_FUNCTION(xmlrpc_server_call_method) set_output_options(&out, output_opts); } - server = zend_list_find(Z_LVAL_P(handle), &type); + ZEND_FETCH_RESOURCE(server, xmlrpc_server_data*, handle, -1, "xmlrpc server", le_xmlrpc_server); - if (type == le_xmlrpc_server) { - /* HACK: use output encoding for now */ - input_opts.xml_elem_opts.encoding = utf8_get_encoding_id_from_string(out.xmlrpc_out.xml_elem_opts.encoding); + /* HACK: use output encoding for now */ + input_opts.xml_elem_opts.encoding = utf8_get_encoding_id_from_string(out.xmlrpc_out.xml_elem_opts.encoding); - /* generate an XMLRPC_REQUEST from the raw xml input */ - xRequest = XMLRPC_REQUEST_FromXML(rawxml, rawxml_len, &input_opts); + /* generate an XMLRPC_REQUEST from the raw xml input */ + xRequest = XMLRPC_REQUEST_FromXML(rawxml, rawxml_len, &input_opts); - if (xRequest) { - const char* methodname = XMLRPC_RequestGetMethodName(xRequest); - XMLRPC_VALUE xAnswer = NULL; - MAKE_STD_ZVAL(data.xmlrpc_method); /* init. very important. spent a frustrating day finding this out. */ - MAKE_STD_ZVAL(data.return_data); - Z_TYPE_P(data.return_data) = IS_NULL; /* in case value is never init'd, we don't dtor to think it is a string or something */ - Z_TYPE_P(data.xmlrpc_method) = IS_NULL; - - /* setup some data to pass to the callback function */ - data.caller_params = *caller_params; - data.php_executed = 0; - data.server = server; - - /* We could just call the php method directly ourselves at this point, but we do this - * with a C callback in case the xmlrpc library ever implements some cool usage stats, - * or somesuch. - */ - xAnswer = XMLRPC_ServerCallMethod(server->server_ptr, xRequest, &data); - if (xAnswer && out.b_php_out) { - zval_dtor(data.return_data); - FREE_ZVAL(data.return_data); - data.return_data = XMLRPC_to_PHP(xAnswer); - } else if (data.php_executed && !out.b_php_out && !xAnswer) { - xAnswer = PHP_to_XMLRPC(data.return_data TSRMLS_CC); - } + if (xRequest) { + const char* methodname = XMLRPC_RequestGetMethodName(xRequest); + XMLRPC_VALUE xAnswer = NULL; + ZVAL_NULL(&data.xmlrpc_method); /* init. very important. spent a frustrating day finding this out. */ + ZVAL_NULL(&data.return_data); + ZVAL_NULL(&data.return_data); /* in case value is never init'd, we don't dtor to think it is a string or something */ + ZVAL_NULL(&data.xmlrpc_method); - /* should we return data as xml? */ - if (!out.b_php_out) { - XMLRPC_REQUEST xResponse = XMLRPC_RequestNew(); - if (xResponse) { - char *outBuf = 0; - int buf_len = 0; - - /* automagically determine output serialization type from request type */ - if (out.b_auto_version) { - XMLRPC_REQUEST_OUTPUT_OPTIONS opts = XMLRPC_RequestGetOutputOptions(xRequest); - if (opts) { - out.xmlrpc_out.version = opts->version; - } - } - /* set some required request hoojum */ - XMLRPC_RequestSetOutputOptions(xResponse, &out.xmlrpc_out); - XMLRPC_RequestSetRequestType(xResponse, xmlrpc_request_response); - XMLRPC_RequestSetData(xResponse, xAnswer); - XMLRPC_RequestSetMethodName(xResponse, methodname); - - /* generate xml */ - outBuf = XMLRPC_REQUEST_ToXML(xResponse, &buf_len); - if (outBuf) { - RETVAL_STRINGL(outBuf, buf_len, 1); - free(outBuf); + /* setup some data to pass to the callback function */ + ZVAL_COPY_VALUE(&data.caller_params, caller_params); + data.php_executed = 0; + data.server = server; + + /* We could just call the php method directly ourselves at this point, but we do this + * with a C callback in case the xmlrpc library ever implements some cool usage stats, + * or somesuch. + */ + xAnswer = XMLRPC_ServerCallMethod(server->server_ptr, xRequest, &data); + if (xAnswer && out.b_php_out) { + XMLRPC_to_PHP(xAnswer, &data.return_data); + } else if (data.php_executed && !out.b_php_out && !xAnswer) { + xAnswer = PHP_to_XMLRPC(&data.return_data TSRMLS_CC); + } + + /* should we return data as xml? */ + if (!out.b_php_out) { + XMLRPC_REQUEST xResponse = XMLRPC_RequestNew(); + if (xResponse) { + char *outBuf = 0; + int buf_len = 0; + + /* automagically determine output serialization type from request type */ + if (out.b_auto_version) { + XMLRPC_REQUEST_OUTPUT_OPTIONS opts = XMLRPC_RequestGetOutputOptions(xRequest); + if (opts) { + out.xmlrpc_out.version = opts->version; } - /* cleanup after ourselves. what a sty! */ - XMLRPC_RequestFree(xResponse, 0); } - } else { /* or as native php types? */ - *return_value = *data.return_data; - zval_copy_ctor(return_value); + /* set some required request hoojum */ + XMLRPC_RequestSetOutputOptions(xResponse, &out.xmlrpc_out); + XMLRPC_RequestSetRequestType(xResponse, xmlrpc_request_response); + XMLRPC_RequestSetData(xResponse, xAnswer); + XMLRPC_RequestSetMethodName(xResponse, methodname); + + /* generate xml */ + outBuf = XMLRPC_REQUEST_ToXML(xResponse, &buf_len); + if (outBuf) { + RETVAL_STRINGL(outBuf, buf_len); + free(outBuf); + } + /* cleanup after ourselves. what a sty! */ + XMLRPC_RequestFree(xResponse, 0); } + } else { /* or as native php types? */ + ZVAL_COPY(return_value, &data.return_data); + } - /* cleanup after ourselves. what a sty! */ - zval_ptr_dtor(&data.xmlrpc_method); - - zval_dtor(data.return_data); - FREE_ZVAL(data.return_data); - - if (xAnswer) { - XMLRPC_CleanupValue(xAnswer); - } + /* cleanup after ourselves. what a sty! */ + zval_ptr_dtor(&data.xmlrpc_method); + zval_ptr_dtor(&data.return_data); - XMLRPC_RequestFree(xRequest, 1); + if (xAnswer) { + XMLRPC_CleanupValue(xAnswer); } + + XMLRPC_RequestFree(xRequest, 1); } } /* }}} */ @@ -1200,22 +1115,19 @@ PHP_FUNCTION(xmlrpc_server_call_method) PHP_FUNCTION(xmlrpc_server_add_introspection_data) { zval *handle, *desc; - int type; xmlrpc_server_data* server; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ra", &handle, &desc) == FAILURE) { return; } - server = zend_list_find(Z_LVAL_P(handle), &type); + ZEND_FETCH_RESOURCE(server, xmlrpc_server_data*, handle, -1, "xmlrpc server", le_xmlrpc_server); - if (type == le_xmlrpc_server) { - XMLRPC_VALUE xDesc = PHP_to_XMLRPC(desc TSRMLS_CC); - if (xDesc) { - int retval = XMLRPC_ServerAddIntrospectionData(server->server_ptr, xDesc); - XMLRPC_CleanupValue(xDesc); - RETURN_LONG(retval); - } + XMLRPC_VALUE xDesc = PHP_to_XMLRPC(desc TSRMLS_CC); + if (xDesc) { + int retval = XMLRPC_ServerAddIntrospectionData(server->server_ptr, xDesc); + XMLRPC_CleanupValue(xDesc); + RETURN_LONG(retval); } RETURN_LONG(0); } @@ -1225,7 +1137,6 @@ PHP_FUNCTION(xmlrpc_server_add_introspection_data) Decodes XML into a list of method descriptions */ PHP_FUNCTION(xmlrpc_parse_method_descriptions) { - zval *retval; char *arg1; int arg1_len; @@ -1233,15 +1144,11 @@ PHP_FUNCTION(xmlrpc_parse_method_descriptions) return; } - if (return_value_used) { + if (USED_RET()) { STRUCT_XMLRPC_ERROR err = {0}; XMLRPC_VALUE xVal = XMLRPC_IntrospectionCreateDescription(arg1, &err); if (xVal) { - retval = XMLRPC_to_PHP(xVal); - - if (retval) { - RETVAL_ZVAL(retval, 1, 1); - } + XMLRPC_to_PHP(xVal, return_value); /* dust, sweep, and mop */ XMLRPC_CleanupValue(xVal); } else { @@ -1355,29 +1262,22 @@ int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) /* {{{ */ if (Z_TYPE_P(value) == IS_STRING) { if (newtype == xmlrpc_base64 || newtype == xmlrpc_datetime) { const char* typestr = xmlrpc_type_as_str(newtype, xmlrpc_vector_none); - zval* type; + zval type; - MAKE_STD_ZVAL(type); - - Z_TYPE_P(type) = IS_STRING; - Z_STRVAL_P(type) = estrdup(typestr); - Z_STRLEN_P(type) = strlen(typestr); + ZVAL_STRING(&type, typestr); if (newtype == xmlrpc_datetime) { - XMLRPC_VALUE v = XMLRPC_CreateValueDateTime_ISO8601(NULL, value->value.str.val); + XMLRPC_VALUE v = XMLRPC_CreateValueDateTime_ISO8601(NULL, Z_STRVAL_P(value)); if (v) { time_t timestamp = (time_t) php_parse_date((char *)XMLRPC_GetValueDateTime_ISO8601(v), NULL); if (timestamp != -1) { - zval* ztimestamp; - - MAKE_STD_ZVAL(ztimestamp); + zval ztimestamp; - ztimestamp->type = IS_LONG; - ztimestamp->value.lval = timestamp; + ZVAL_LONG(&ztimestamp, timestamp); convert_to_object(value); - if (SUCCESS == zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL)) { - bSuccess = zend_hash_update(Z_OBJPROP_P(value), OBJECT_VALUE_TS_ATTR, sizeof(OBJECT_VALUE_TS_ATTR), (void *) &ztimestamp, sizeof(zval *), NULL); + if (zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1, &type)) { + bSuccess = zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_VALUE_TS_ATTR, sizeof(OBJECT_VALUE_TS_ATTR) - 1, &ztimestamp) != NULL; } } else { zval_ptr_dtor(&type); @@ -1388,7 +1288,7 @@ int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) /* {{{ */ } } else { convert_to_object(value); - bSuccess = zend_hash_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void *) &type, sizeof(zval *), NULL); + bSuccess = zend_hash_str_update(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1, &type) != NULL; } } } @@ -1398,7 +1298,7 @@ int set_zval_xmlrpc_type(zval* value, XMLRPC_VALUE_TYPE newtype) /* {{{ */ /* }}} */ /* return xmlrpc type of a php value */ -XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue) /* {{{ */ +XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval* newvalue) /* {{{ */ { XMLRPC_VALUE_TYPE type = xmlrpc_none; TSRMLS_FETCH(); @@ -1411,7 +1311,8 @@ XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue) /* {{{ */ #ifndef BOOL_AS_LONG /* Right thing to do, but it breaks some legacy code. */ - case IS_BOOL: + case IS_TRUE: + case IS_FALSE: type = xmlrpc_boolean; break; #else @@ -1435,12 +1336,12 @@ XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue) /* {{{ */ break; case IS_OBJECT: { - zval** attr; + zval* attr; type = xmlrpc_vector; - if (zend_hash_find(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR), (void**) &attr) == SUCCESS) { - if (Z_TYPE_PP(attr) == IS_STRING) { - type = xmlrpc_str_as_type(Z_STRVAL_PP(attr)); + if ((attr = zend_hash_str_find(Z_OBJPROP_P(value), OBJECT_TYPE_ATTR, sizeof(OBJECT_TYPE_ATTR) - 1)) != NULL) { + if (Z_TYPE_P(attr) == IS_STRING) { + type = xmlrpc_str_as_type(Z_STRVAL_P(attr)); } } break; @@ -1449,14 +1350,14 @@ XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue) /* {{{ */ /* if requested, return an unmolested (magic removed) copy of the value */ if (newvalue) { - zval** val; + zval* val; if ((type == xmlrpc_base64 && Z_TYPE_P(value) != IS_NULL) || type == xmlrpc_datetime) { - if (zend_hash_find(Z_OBJPROP_P(value), OBJECT_VALUE_ATTR, sizeof(OBJECT_VALUE_ATTR), (void**) &val) == SUCCESS) { - *newvalue = *val; + if ((val = zend_hash_str_find(Z_OBJPROP_P(value), OBJECT_VALUE_ATTR, sizeof(OBJECT_VALUE_ATTR) - 1)) != NULL) { + ZVAL_COPY_VALUE(newvalue, val); } } else { - *newvalue = value; + ZVAL_COPY_VALUE(newvalue, value); } } } @@ -1469,18 +1370,20 @@ XMLRPC_VALUE_TYPE get_zval_xmlrpc_type(zval* value, zval** newvalue) /* {{{ */ Sets xmlrpc type, base64 or datetime, for a PHP string value */ PHP_FUNCTION(xmlrpc_set_type) { - zval **arg; + zval *arg; char *type; int type_len; XMLRPC_VALUE_TYPE vtype; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Zs", &arg, &type, &type_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs", &arg, &type, &type_len) == FAILURE) { return; } + ZVAL_DEREF(arg); + vtype = xmlrpc_str_as_type(type); if (vtype != xmlrpc_none) { - if (set_zval_xmlrpc_type(*arg, vtype) == SUCCESS) { + if (set_zval_xmlrpc_type(arg, vtype) == SUCCESS) { RETURN_TRUE; } } else { @@ -1494,20 +1397,20 @@ PHP_FUNCTION(xmlrpc_set_type) Gets xmlrpc type for a PHP value. Especially useful for base64 and datetime strings */ PHP_FUNCTION(xmlrpc_get_type) { - zval **arg; + zval *arg; XMLRPC_VALUE_TYPE type; XMLRPC_VECTOR_TYPE vtype = xmlrpc_vector_none; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z", &arg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &arg) == FAILURE) { return; } - type = get_zval_xmlrpc_type(*arg, 0); + type = get_zval_xmlrpc_type(arg, 0); if (type == xmlrpc_vector) { - vtype = determine_vector_type((Z_TYPE_PP(arg) == IS_OBJECT) ? Z_OBJPROP_PP(arg) : Z_ARRVAL_PP(arg)); + vtype = determine_vector_type((Z_TYPE_P(arg) == IS_OBJECT) ? Z_OBJPROP_P(arg) : Z_ARRVAL_P(arg)); } - RETURN_STRING((char*) xmlrpc_type_as_str(type, vtype), 1); + RETURN_STRING((char*) xmlrpc_type_as_str(type, vtype)); } /* }}} */ @@ -1515,7 +1418,7 @@ PHP_FUNCTION(xmlrpc_get_type) Determines if an array value represents an XMLRPC fault. */ PHP_FUNCTION(xmlrpc_is_fault) { - zval *arg, **val; + zval *arg; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &arg) == FAILURE) { return; @@ -1527,8 +1430,8 @@ PHP_FUNCTION(xmlrpc_is_fault) * array, which is rather expensive, especially if it was * a big array. Thus, we resort to this not so clever hackery. */ - if (zend_hash_find(Z_ARRVAL_P(arg), FAULT_CODE, FAULT_CODE_LEN + 1, (void**) &val) == SUCCESS && - zend_hash_find(Z_ARRVAL_P(arg), FAULT_STRING, FAULT_STRING_LEN + 1, (void**) &val) == SUCCESS) { + if (zend_hash_str_exists(Z_ARRVAL_P(arg), FAULT_CODE, FAULT_CODE_LEN) && + zend_hash_str_exists(Z_ARRVAL_P(arg), FAULT_STRING, FAULT_STRING_LEN)) { RETURN_TRUE; } |