diff --git a/Zend/zend_API.h b/Zend/zend_API.h index a644de8e15134..418aa319c127e 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -536,6 +536,16 @@ ZEND_API const char *zend_get_type_by_const(int type); #define array_init(arg) ZVAL_ARR((arg), zend_new_array(0)) #define array_init_size(arg, size) ZVAL_ARR((arg), zend_new_array(size)) +#define array_init_packed(arg) \ + do { \ + array_init(arg); \ + zend_hash_real_init_packed(Z_ARRVAL_P(arg)); \ + } while (0) +#define array_init_packed_size(arg, size) \ + do { \ + array_init_size(arg, size); \ + zend_hash_real_init_packed(Z_ARRVAL_P(arg)); \ + } while (0) ZEND_API void object_init(zval *arg); ZEND_API zend_result object_init_ex(zval *arg, zend_class_entry *ce); ZEND_API zend_result object_init_with_constructor(zval *arg, zend_class_entry *class_type, uint32_t param_count, zval *params, HashTable *named_params); diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index b17159d46aabc..1e1ed717971a4 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -1063,17 +1063,19 @@ PHP_FUNCTION(openssl_x509_parse) add_assoc_string(return_value, "signatureTypeSN", (char*)OBJ_nid2sn(sig_nid)); add_assoc_string(return_value, "signatureTypeLN", (char*)OBJ_nid2ln(sig_nid)); add_assoc_long(return_value, "signatureTypeNID", sig_nid); - array_init(&subitem); + + int x509_count = X509_PURPOSE_get_count(); + array_init_size(&subitem, x509_count); /* NOTE: the purposes are added as integer keys - the keys match up to the X509_PURPOSE_SSL_XXX defines in x509v3.h */ - for (i = 0; i < X509_PURPOSE_get_count(); i++) { + for (i = 0; i < x509_count; i++) { int id, purpset; char * pname; X509_PURPOSE * purp; zval subsub; - array_init(&subsub); + array_init_packed_size(&subsub, 3); purp = X509_PURPOSE_get0(i); id = X509_PURPOSE_get_id(purp); @@ -4138,15 +4140,16 @@ PHP_FUNCTION(openssl_seal) ZEND_TRY_ASSIGN_REF_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); efree(buf); - ekeys = zend_try_array_init(ekeys); + ekeys = zend_try_array_init_size(ekeys, nkeys); if (!ekeys) { EVP_CIPHER_CTX_free(ctx); goto clean_exit; } + zend_hash_real_init_packed(Z_ARRVAL_P(ekeys)); for (i=0; issl_handle); if (chain && sk_X509_num(chain) > 0) { - int i; - array_init(&arr); + int i, num_chains = sk_X509_num(chain); + array_init_packed_size(&arr, num_chains); for (i = 0; i < sk_X509_num(chain); i++) { X509 *mycert = X509_dup(sk_X509_value(chain, i)); @@ -1761,7 +1761,7 @@ static int php_openssl_capture_peer_certs(php_stream *stream, object_init_ex(&zcert, php_openssl_certificate_ce); cert_object = Z_OPENSSL_CERTIFICATE_P(&zcert); cert_object->x509 = mycert; - add_next_index_zval(&arr, &zcert); + add_index_zval(&arr, i, &zcert); } } else {