summaryrefslogtreecommitdiff
path: root/ext/standard/php_var.h
diff options
context:
space:
mode:
authorMichael Wallner <mike@php.net>2011-10-19 10:09:24 +0000
committerMichael Wallner <mike@php.net>2011-10-19 10:09:24 +0000
commitb6921369b5c18f8ef95adb8b7fe93fd2d9a7df6b (patch)
tree8b7728a5c811c8562927c5b2d899d925009a4e4a /ext/standard/php_var.h
parentf2ce9b406bfd81708c77e51a8f63a7b4a1a9ac25 (diff)
downloadphp-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.h46
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)