]> granicus.if.org Git - php/commitdiff
Fixed wrong refcount updates
authorDmitry Stogov <dmitry@php.net>
Thu, 10 Jul 2008 16:16:15 +0000 (16:16 +0000)
committerDmitry Stogov <dmitry@php.net>
Thu, 10 Jul 2008 16:16:15 +0000 (16:16 +0000)
ext/phar/func_interceptors.c
ext/phar/stream.c
ext/phar/util.c

index 08cdcc18b10d7bf955be1c138f54921ff83d0323..aa39b0a5f515f1ad835e98cedfa2bbf25c4f4316 100644 (file)
@@ -658,7 +658,7 @@ splitted:
                                efree(entry);
                                goto stat_entry;
                        }
-                       if (SUCCESS == zend_hash_find(&(phar->virtual_dirs), entry, entry_len, (void **) &data)) {
+                       if (zend_hash_exists(&(phar->virtual_dirs), entry, entry_len)) {
                                efree(entry);
                                efree(arch);
                                if (IS_EXISTS_CHECK(type)) {
@@ -706,7 +706,7 @@ notfound:
                                        }
                                        goto stat_entry;
                                }
-                               if (SUCCESS == zend_hash_find(&(phar->virtual_dirs), entry + 1, entry_len - 1, (void **) &data)) {
+                               if (zend_hash_exists(&(phar->virtual_dirs), entry + 1, entry_len - 1)) {
                                        PHAR_G(cwd) = save;
                                        PHAR_G(cwd_len) = save_len;
                                        efree(entry);
index 54fb66ed2b9612b35edf95c166fc9b5562f0daab..a1c30b22df9172aa19bad8d30f281dd9e92d98d0 100644 (file)
@@ -608,7 +608,7 @@ static int phar_wrapper_stat(php_stream_wrapper *wrapper, char *url, int flags,
                php_url_free(resource);
                return SUCCESS;
        }
-       if (SUCCESS == zend_hash_find(&(phar->virtual_dirs), internal_file, internal_file_len, (void **) &entry)) {
+       if (zend_hash_exists(&(phar->virtual_dirs), internal_file, internal_file_len)) {
                phar_dostat(phar, NULL, ssb, 1, phar->alias, phar->alias_len TSRMLS_CC);
                php_url_free(resource);
                return SUCCESS;
index fb6edb464c5be08bdf3031abebff191f1287a9ab..88913fbce7b210744276ff2b4f1f36db82de08bf 100644 (file)
@@ -1358,7 +1358,7 @@ phar_entry_info *phar_get_entry_info_dir(phar_archive_data *phar, char *path, in
                return entry;
        }
        if (dir) {
-               if (SUCCESS == zend_hash_find(&phar->virtual_dirs, path, path_len, (void**)&entry)) {
+               if (zend_hash_exists(&phar->virtual_dirs, path, path_len)) {
                        /* a file or directory exists in a sub-directory of this path */
                        entry = (phar_entry_info *) ecalloc(1, sizeof(phar_entry_info));
                        /* this next line tells PharFileInfo->__destruct() to efree the filename */
@@ -1958,12 +1958,16 @@ int phar_create_signature(phar_archive_data *phar, php_stream *fp, char **signat
  */
 static int phar_add_empty(HashTable *ht, char *arKey, uint nKeyLength)  /* {{{ */
 {
-       char *dummy = (char*)1;
+       char **dummy;
+
        if (SUCCESS == zend_hash_find(ht, arKey, nKeyLength, (void **)&dummy)) {
-               dummy++;
-       }
+               (*dummy)++;
+               return SUCCESS;
+       } else {
+               char *dummy = (char*)1;
 
-       return zend_hash_update(ht, arKey, nKeyLength, (char *) &dummy, sizeof(void *), NULL);
+               return zend_hash_add(ht, arKey, nKeyLength, (char *) &dummy, sizeof(void *), NULL);
+       }
 }
 /* }}} */
 
@@ -1983,19 +1987,15 @@ void phar_add_virtual_dirs(phar_archive_data *phar, char *filename, int filename
 void phar_delete_virtual_dirs(phar_archive_data *phar, char *filename, int filename_len TSRMLS_DC) /* {{{ */
 {
        char *s = filename;
+       char **dummy;
 
        /* we use filename_len - 1 to avoid adding a virtual dir for empty directory entries */
        for (; s - filename < filename_len - 1; s++) {
                if (*s == '/') {
-                       char *dummy;
-                       if (FAILURE == zend_hash_find(&phar->virtual_dirs, filename, s - filename, (void **)&dummy)) {
-                               continue;
-                       }
-
-                       if (!--dummy) {
-                               zend_hash_del(&phar->virtual_dirs, filename, s - filename);
-                       } else {
-                               zend_hash_update(&phar->virtual_dirs, filename, s - filename, &dummy, sizeof(void *), NULL);
+                       if (SUCCESS == zend_hash_find(&phar->virtual_dirs, filename, s - filename, (void **)&dummy)) {
+                               if (!--(*dummy)) {
+                                       zend_hash_del(&phar->virtual_dirs, filename, s - filename);
+                               }
                        }
                }
        }