diff options
Diffstat (limited to 'ext/phar/dirstream.c')
-rw-r--r-- | ext/phar/dirstream.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/ext/phar/dirstream.c b/ext/phar/dirstream.c index 11088ead5b..c1e8f31661 100644 --- a/ext/phar/dirstream.c +++ b/ext/phar/dirstream.c @@ -94,7 +94,8 @@ static size_t phar_dir_read(php_stream *stream, char *buf, size_t count TSRMLS_D { size_t to_read; HashTable *data = (HashTable *)stream->abstract; - char *key; + phar_zstr key; + char *str_key; uint keylen; ulong unused; @@ -104,13 +105,14 @@ static size_t phar_dir_read(php_stream *stream, char *buf, size_t count TSRMLS_D if (HASH_KEY_NON_EXISTANT == zend_hash_get_current_key_ex(data, &key, &keylen, &unused, 0, NULL)) { return 0; } + PHAR_STR(key, str_key); zend_hash_move_forward(data); to_read = MIN(keylen, count); if (to_read == 0 || count < keylen) { return 0; } memset(buf, 0, sizeof(php_stream_dirent)); - memcpy(((php_stream_dirent *) buf)->d_name, key, to_read); + memcpy(((php_stream_dirent *) buf)->d_name, str_key, to_read); ((php_stream_dirent *) buf)->d_name[to_read + 1] = '\0'; return sizeof(php_stream_dirent); @@ -186,10 +188,11 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) { HashTable *data; int dirlen = strlen(dir); - char *save, *found, *key; + phar_zstr key; + char *entry, *found, *save, *str_key; uint keylen; ulong unused; - char *entry; + ALLOC_HASHTABLE(data); zend_hash_init(data, 64, zend_get_hash_value, NULL, 0); @@ -203,8 +206,9 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) if (HASH_KEY_NON_EXISTANT == zend_hash_get_current_key_ex(manifest, &key, &keylen, &unused, 0, NULL)) { break; } + PHAR_STR(key, str_key); if (keylen <= (uint)dirlen) { - if (keylen < (uint)dirlen || !strncmp(key, dir, dirlen)) { + if (keylen < (uint)dirlen || !strncmp(str_key, dir, dirlen)) { if (SUCCESS != zend_hash_move_forward(manifest)) { break; } @@ -213,27 +217,27 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) } if (*dir == '/') { /* root directory */ - if (NULL != (found = (char *) memchr(key, '/', keylen))) { + if (NULL != (found = (char *) memchr(str_key, '/', keylen))) { /* the entry has a path separator and is a subdirectory */ - entry = (char *) safe_emalloc(found - key, 1, 1); - memcpy(entry, key, found - key); - keylen = found - key; + entry = (char *) safe_emalloc(found - str_key, 1, 1); + memcpy(entry, str_key, found - str_key); + keylen = found - str_key; entry[keylen] = '\0'; } else { entry = (char *) safe_emalloc(keylen, 1, 1); - memcpy(entry, key, keylen); + memcpy(entry, str_key, keylen); entry[keylen] = '\0'; } goto PHAR_ADD_ENTRY; } else { - if (0 != memcmp(key, dir, dirlen)) { + if (0 != memcmp(str_key, dir, dirlen)) { /* entry in directory not found */ if (SUCCESS != zend_hash_move_forward(manifest)) { break; } continue; } else { - if (key[dirlen] != '/') { + if (str_key[dirlen] != '/') { if (SUCCESS != zend_hash_move_forward(manifest)) { break; } @@ -241,7 +245,7 @@ static php_stream *phar_make_dirstream(char *dir, HashTable *manifest TSRMLS_DC) } } } - save = key; + save = str_key; save += dirlen + 1; /* seek to just past the path separator */ if (NULL != (found = (char *) memchr(save, '/', keylen - dirlen - 1))) { /* is subdirectory */ @@ -289,7 +293,8 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path, char { php_url *resource = NULL; php_stream *ret; - char *internal_file, *key, *error; + char *internal_file, *error, *str_key; + phar_zstr key; uint keylen; ulong unused; phar_archive_data *phar; @@ -367,7 +372,8 @@ php_stream *phar_wrapper_open_dir(php_stream_wrapper *wrapper, char *path, char if (HASH_KEY_NON_EXISTANT != zend_hash_get_current_key_ex( &phar->manifest, &key, &keylen, &unused, 0, NULL)) { - if (keylen > (uint)i_len && 0 == memcmp(key, internal_file, i_len)) { + PHAR_STR(key, str_key); + if (keylen > (uint)i_len && 0 == memcmp(str_key, internal_file, i_len)) { /* directory found */ internal_file = estrndup(internal_file, i_len); |