From: Dmitry Stogov Date: Mon, 25 Dec 2006 19:23:03 +0000 (+0000) Subject: Fixed bug #39825 (foreach produces memory error) X-Git-Tag: php-5.2.1RC2~81 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4480c5eb5d7adf4437237066ad9eda70d47979b6;p=php Fixed bug #39825 (foreach produces memory error) --- diff --git a/NEWS b/NEWS index c4cad1a166..e445de2c2e 100644 --- a/NEWS +++ b/NEWS @@ -35,6 +35,7 @@ PHP NEWS when trying to open "php://wrong"). (Tony) - Fixed bug #39832 (SOAP Server: parameter not matching the WSDL specified type are set to 0). (Dmitry) +- Fixed bug #39825 (foreach produces memory error). (Dmitry) - Fixed bug #39815 (SOAP double encoding is not locale-independent). (Dmitry) - Fixed bug #39685 (iconv() - undefined function). (Hannes) - Fixed bug #39596 (Creating Variant of type VT_ARRAY). (Rob) diff --git a/Zend/tests/bug39825.phpt b/Zend/tests/bug39825.phpt new file mode 100755 index 0000000000..791b329f71 --- /dev/null +++ b/Zend/tests/bug39825.phpt @@ -0,0 +1,13 @@ +--TEST-- +Bug #39825 (foreach produces memory error) +--FILE-- + 2, "foo" => "bar"); +$obj = (object)$array; +foreach ($obj as $name => $value) { + echo "$name -> $value\n"; +} +?> +--EXPECT-- +1 -> 2 +foo -> bar diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 978f1204a3..f0995f333c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3199,7 +3199,8 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY) key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); if (key_type != HASH_KEY_NON_EXISTANT && - zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS) { + (key_type == HASH_KEY_IS_LONG || + zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) { break; } zend_hash_move_forward(fe_ht); @@ -3258,8 +3259,10 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); zend_hash_move_forward(fe_ht); - } while (key_type == HASH_KEY_NON_EXISTANT || zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS); - if (use_key) { + } while (key_type == HASH_KEY_NON_EXISTANT || + (key_type != HASH_KEY_IS_LONG && + zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS)); + if (use_key && key_type != HASH_KEY_IS_LONG) { zend_unmangle_property_name(str_key, str_key_len-1, &class_name, &prop_name); str_key_len = strlen(prop_name); str_key = estrndup(prop_name, str_key_len); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0a8b321fad..27adf1e05f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -2248,7 +2248,8 @@ static int ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); if (key_type != HASH_KEY_NON_EXISTANT && - zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS) { + (key_type == HASH_KEY_IS_LONG || + zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) { break; } zend_hash_move_forward(fe_ht); @@ -4787,7 +4788,8 @@ static int ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); if (key_type != HASH_KEY_NON_EXISTANT && - zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS) { + (key_type == HASH_KEY_IS_LONG || + zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) { break; } zend_hash_move_forward(fe_ht); @@ -7916,7 +7918,8 @@ static int ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); if (key_type != HASH_KEY_NON_EXISTANT && - zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS) { + (key_type == HASH_KEY_IS_LONG || + zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) { break; } zend_hash_move_forward(fe_ht); @@ -7975,8 +7978,10 @@ static int ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); zend_hash_move_forward(fe_ht); - } while (key_type == HASH_KEY_NON_EXISTANT || zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS); - if (use_key) { + } while (key_type == HASH_KEY_NON_EXISTANT || + (key_type != HASH_KEY_IS_LONG && + zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) != SUCCESS)); + if (use_key && key_type != HASH_KEY_IS_LONG) { zend_unmangle_property_name(str_key, str_key_len-1, &class_name, &prop_name); str_key_len = strlen(prop_name); str_key = estrndup(prop_name, str_key_len); @@ -19969,7 +19974,8 @@ static int ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) key_type = zend_hash_get_current_key_ex(fe_ht, &str_key, &str_key_len, &int_key, 0, NULL); if (key_type != HASH_KEY_NON_EXISTANT && - zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS) { + (key_type == HASH_KEY_IS_LONG || + zend_check_property_access(zobj, str_key, str_key_len-1 TSRMLS_CC) == SUCCESS)) { break; } zend_hash_move_forward(fe_ht);