diff options
author | Michael Wallner <mike@php.net> | 2011-10-19 10:09:24 +0000 |
---|---|---|
committer | Michael Wallner <mike@php.net> | 2011-10-19 10:09:24 +0000 |
commit | b6921369b5c18f8ef95adb8b7fe93fd2d9a7df6b (patch) | |
tree | 8b7728a5c811c8562927c5b2d899d925009a4e4a /ext/standard/php_var.h | |
parent | f2ce9b406bfd81708c77e51a8f63a7b4a1a9ac25 (diff) | |
download | php-git-b6921369b5c18f8ef95adb8b7fe93fd2d9a7df6b.tar.gz |
Fix Bug #55801 Behavior of unserialize has changed:
(un)serialize in __wakeup/__sleep now use clean var_hashes
Diffstat (limited to 'ext/standard/php_var.h')
-rw-r--r-- | ext/standard/php_var.h | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/ext/standard/php_var.h b/ext/standard/php_var.h index 70054fce25..4f0d57fa0d 100644 --- a/ext/standard/php_var.h +++ b/ext/standard/php_var.h @@ -12,7 +12,7 @@ | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ - | Author: Jani Lehtimäki <jkl@njet.net> | + | Author: Jani Lehtimäki <jkl@njet.net> | +----------------------------------------------------------------------+ */ @@ -54,52 +54,62 @@ PHPAPI int php_var_unserialize(zval **rval, const unsigned char **p, const unsig #define PHP_VAR_SERIALIZE_INIT(var_hash_ptr) \ do { \ - if (BG(serialize).level) { \ - (var_hash_ptr) = BG(serialize).var_hash; \ - ++BG(serialize).level; \ - } else { \ + /* fprintf(stderr, "SERIALIZE_INIT == lock: %u, level: %u\n", BG(serialize_lock), BG(serialize).level); */ \ + if (BG(serialize_lock) || !BG(serialize).level) { \ ALLOC_HASHTABLE(var_hash_ptr); \ zend_hash_init((var_hash_ptr), 10, NULL, NULL, 0); \ - BG(serialize).var_hash = (var_hash_ptr); \ - BG(serialize).level = 1; \ + if (!BG(serialize_lock)) { \ + BG(serialize).var_hash = (var_hash_ptr); \ + BG(serialize).level = 1; \ + } \ + } else { \ + (var_hash_ptr) = BG(serialize).var_hash; \ + ++BG(serialize).level; \ } \ } while(0) #define PHP_VAR_SERIALIZE_DESTROY(var_hash_ptr) \ do { \ - if (BG(serialize).level) { \ + /* fprintf(stderr, "SERIALIZE_DESTROY == lock: %u, level: %u\n", BG(serialize_lock), BG(serialize).level); */ \ + if (BG(serialize_lock) || !BG(serialize).level) { \ + zend_hash_destroy((var_hash_ptr)); \ + FREE_HASHTABLE(var_hash_ptr); \ + } else { \ if (!--BG(serialize).level) { \ zend_hash_destroy(BG(serialize).var_hash); \ FREE_HASHTABLE(BG(serialize).var_hash); \ BG(serialize).var_hash = NULL; \ } \ - } else { \ - zend_hash_destroy((var_hash_ptr)); \ } \ } while (0) #define PHP_VAR_UNSERIALIZE_INIT(var_hash_ptr) \ do { \ - if (BG(unserialize).level) { \ + /* fprintf(stderr, "UNSERIALIZE_INIT == lock: %u, level: %u\n", BG(serialize_lock), BG(unserialize).level); */ \ + if (BG(serialize_lock) || !BG(unserialize).level) { \ + (var_hash_ptr) = ecalloc(1, sizeof(struct php_unserialize_data)); \ + if (!BG(serialize_lock)) { \ + BG(unserialize).var_hash = (var_hash_ptr); \ + BG(unserialize).level = 1; \ + } \ + } else { \ (var_hash_ptr) = BG(unserialize).var_hash; \ ++BG(unserialize).level; \ - } else { \ - (var_hash_ptr) = ecalloc(1, sizeof(struct php_unserialize_data)); \ - BG(unserialize).var_hash = (var_hash_ptr); \ - BG(unserialize).level = 1; \ } \ } while (0) #define PHP_VAR_UNSERIALIZE_DESTROY(var_hash_ptr) \ do { \ - if (BG(unserialize).level) { \ + /* fprintf(stderr, "UNSERIALIZE_DESTROY == lock: %u, level: %u\n", BG(serialize_lock), BG(unserialize).level); */ \ + if (BG(serialize_lock) || !BG(unserialize).level) { \ + var_destroy(&(var_hash_ptr)); \ + efree(var_hash_ptr); \ + } else { \ if (!--BG(unserialize).level) { \ var_destroy(&(var_hash_ptr)); \ efree((var_hash_ptr)); \ BG(unserialize).var_hash = NULL; \ } \ - } else { \ - var_destroy(&(var_hash_ptr)); \ } \ } while (0) |