]> granicus.if.org Git - php/commitdiff
MFH
authorStefan Esser <sesser@php.net>
Sat, 15 Jan 2005 18:45:00 +0000 (18:45 +0000)
committerStefan Esser <sesser@php.net>
Sat, 15 Jan 2005 18:45:00 +0000 (18:45 +0000)
TSRM/tsrm_virtual_cwd.c
ext/standard/php_var.h
ext/standard/var_unserializer.c
ext/standard/var_unserializer.re

index 7b15f92da052f2ea24d75c9256788794ac0baadc..3c8ba90d37fc92958a24ae7dc62f3972f00591af 100644 (file)
@@ -852,7 +852,7 @@ CWD_API FILE *virtual_popen(const char *command, const char *type TSRMLS_DC)
        dir_length = CWDG(cwd).cwd_length;
        dir = CWDG(cwd).cwd;
 
-       ptr = command_line = (char *) malloc(command_length + sizeof("cd '' ; ") + dir_length +1+1);
+       ptr = command_line = (char *) malloc(command_length + sizeof("cd '' ; ") + dir_length +extra+1+1);
        if (!command_line) {
                return NULL;
        }
index d6f569c2aad690596c499248da3f7b7b7b9ef0c3..5edb8152255b2c60f40bcb741daf22ade6dcd67e 100644 (file)
@@ -41,6 +41,7 @@ PHPAPI void php_debug_zval_dump(zval **struc, int level TSRMLS_DC);
 
 struct php_unserialize_data {
        void *first;
+       void *first_dtor;
 };
 
 typedef struct php_unserialize_data php_unserialize_data_t;
@@ -54,7 +55,8 @@ PHPAPI int php_var_unserialize(zval **rval, const unsigned char **p, const unsig
    zend_hash_destroy(&(var_hash))
 
 #define PHP_VAR_UNSERIALIZE_INIT(var_hash) \
-       (var_hash).first = 0
+       (var_hash).first = 0; \
+       (var_hash).first_dtor = 0
 #define PHP_VAR_UNSERIALIZE_DESTROY(var_hash) \
        var_destroy(&(var_hash))
 
index f2b56ae13aa313893413519270ff15d9b9090dfb..fe3728c205f2091ea596e5c60abc6419982def83 100644 (file)
@@ -56,6 +56,30 @@ static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval)
        var_hash->data[var_hash->used_slots++] = *rval;
 }
 
+static inline void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval)
+{
+       var_entries *var_hash = var_hashx->first_dtor, *prev = NULL;
+
+       while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
+               prev = var_hash;
+               var_hash = var_hash->next;
+       }
+
+       if (!var_hash) {
+               var_hash = emalloc(sizeof(var_entries));
+               var_hash->used_slots = 0;
+               var_hash->next = 0;
+
+               if (!var_hashx->first_dtor)
+                       var_hashx->first_dtor = var_hash;
+               else
+                       prev->next = var_hash;
+       }
+
+       (*rval)->refcount++;
+       var_hash->data[var_hash->used_slots++] = *rval;
+}
+
 PHPAPI void var_replace(php_unserialize_data_t *var_hashx, zval *ozval, zval **nzval)
 {
        int i;
@@ -93,6 +117,7 @@ static int var_access(php_unserialize_data_t *var_hashx, int id, zval ***store)
 PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
 {
        void *next;
+       int i;
        var_entries *var_hash = var_hashx->first;
        
        while (var_hash) {
@@ -100,6 +125,17 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
                efree(var_hash);
                var_hash = next;
        }
+               
+       var_hash = var_hashx->first_dtor;
+       
+       while (var_hash) {
+               for (i = 0; i < var_hash->used_slots; i++) {
+                       zval_ptr_dtor(&var_hash->data[i]);
+               }
+               next = var_hash->next;
+               efree(var_hash);
+               var_hash = next;
+       }
 }
 
 /* }}} */
@@ -205,14 +241,14 @@ static inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, int
 
                switch (Z_TYPE_P(key)) {
                        case IS_LONG:
-                               if (zend_hash_index_find(ht, Z_LVAL_P(key), (void **)&old_data)) {
-                                       var_replace(var_hash, old_data, rval);
+                               if (zend_hash_index_find(ht, Z_LVAL_P(key), (void **)&old_data)==SUCCESS) {
+                                       var_push_dtor(var_hash, old_data);
                                }
                                zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL);
                                break;
                        case IS_STRING:
-                               if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)) {
-                                       var_replace(var_hash, old_data, rval);
+                               if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)==SUCCESS) {
+                                       var_push_dtor(var_hash, old_data);
                                }
                                zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL);
                                break;
index 112eedff960cc7de9862ba57b1a15f177c62333e..9e7867b70e63e45f8f5d3c069b20c9ae82a00208 100644 (file)
@@ -54,6 +54,30 @@ static inline void var_push(php_unserialize_data_t *var_hashx, zval **rval)
        var_hash->data[var_hash->used_slots++] = *rval;
 }
 
+static inline void var_push_dtor(php_unserialize_data_t *var_hashx, zval **rval)
+{
+       var_entries *var_hash = var_hashx->first_dtor, *prev = NULL;
+
+       while (var_hash && var_hash->used_slots == VAR_ENTRIES_MAX) {
+               prev = var_hash;
+               var_hash = var_hash->next;
+       }
+
+       if (!var_hash) {
+               var_hash = emalloc(sizeof(var_entries));
+               var_hash->used_slots = 0;
+               var_hash->next = 0;
+
+               if (!var_hashx->first_dtor)
+                       var_hashx->first_dtor = var_hash;
+               else
+                       prev->next = var_hash;
+       }
+
+       (*rval)->refcount++;
+       var_hash->data[var_hash->used_slots++] = *rval;
+}
+
 PHPAPI void var_replace(php_unserialize_data_t *var_hashx, zval *ozval, zval **nzval)
 {
        int i;
@@ -91,6 +115,7 @@ static int var_access(php_unserialize_data_t *var_hashx, int id, zval ***store)
 PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
 {
        void *next;
+       int i;
        var_entries *var_hash = var_hashx->first;
        
        while (var_hash) {
@@ -98,6 +123,17 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx)
                efree(var_hash);
                var_hash = next;
        }
+       
+       var_hash = var_hashx->first_dtor;
+       
+       while (var_hash) {
+               for (i = 0; i < var_hash->used_slots; i++) {
+                       zval_ptr_dtor(&var_hash->data[i]);
+               }
+               next = var_hash->next;
+               efree(var_hash);
+               var_hash = next;
+       }
 }
 
 /* }}} */
@@ -208,14 +244,14 @@ static inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, int
 
                switch (Z_TYPE_P(key)) {
                        case IS_LONG:
-                               if (zend_hash_index_find(ht, Z_LVAL_P(key), (void **)&old_data)) {
-                                       var_replace(var_hash, old_data, rval);
+                               if (zend_hash_index_find(ht, Z_LVAL_P(key), (void **)&old_data)==SUCCESS) {
+                                       var_push_dtor(var_hash, old_data);
                                }
                                zend_hash_index_update(ht, Z_LVAL_P(key), &data, sizeof(data), NULL);
                                break;
                        case IS_STRING:
-                               if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)) {
-                                       var_replace(var_hash, old_data, rval);
+                               if (zend_hash_find(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, (void **)&old_data)==SUCCESS) {
+                                       var_push_dtor(var_hash, old_data);
                                }
                                zend_hash_update(ht, Z_STRVAL_P(key), Z_STRLEN_P(key) + 1, &data, sizeof(data), NULL);
                                break;