diff options
Diffstat (limited to 'ext/zip/php_zip.c')
| -rw-r--r-- | ext/zip/php_zip.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 3da018d97e..158be1143e 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -137,18 +137,18 @@ static char * php_zip_make_relative_path(char *path, size_t path_len) /* {{{ */ # define CWD_STATE_FREE(s) efree(s) /* {{{ php_zip_extract_file */ -static int php_zip_extract_file(struct zip * za, char *dest, char *file, int file_len) +static int php_zip_extract_file(struct zip * za, char *dest, char *file, size_t file_len) { php_stream_statbuf ssb; struct zip_file *zf; struct zip_stat sb; char b[8192]; - int n, len, ret; + int n, ret; php_stream *stream; char *fullpath; char *file_dirname_fullpath; char file_dirname[MAXPATHLEN]; - size_t dir_len; + size_t dir_len, len; int is_dir_only = 0; char *path_cleaned; size_t path_cleaned_len; @@ -181,7 +181,7 @@ static int php_zip_extract_file(struct zip * za, char *dest, char *file, int fil memcpy(file_dirname, path_cleaned, path_cleaned_len); dir_len = php_dirname(file_dirname, path_cleaned_len); - if (dir_len <= 0 || (dir_len == 1 && file_dirname[0] == '.')) { + if (!dir_len || (dir_len == 1 && file_dirname[0] == '.')) { len = spprintf(&file_dirname_fullpath, 0, "%s", dest); } else { len = spprintf(&file_dirname_fullpath, 0, "%s/%s", dest, file_dirname); @@ -625,6 +625,7 @@ int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_val #endif int files_cnt; zend_string **namelist; + pcre2_match_context *mctx = php_pcre_mctx(); #ifdef ZTS if (!IS_ABSOLUTE_PATH(path, path_len)) { @@ -651,11 +652,12 @@ int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_val files_cnt = php_stream_scandir(path, &namelist, NULL, (void *) php_stream_dirent_alphasort); if (files_cnt > 0) { - pcre *re = NULL; - pcre_extra *pcre_extra = NULL; - int preg_options = 0, i; + pcre2_code *re = NULL; + pcre2_match_data *match_data = NULL; + uint32_t preg_options = 0, i, capture_count; + int rc; - re = pcre_get_compiled_regex(regexp, &pcre_extra, &preg_options); + re = pcre_get_compiled_regex(regexp, &capture_count, &preg_options); if (!re) { php_error_docref(NULL, E_WARNING, "Invalid expression"); return -1; @@ -667,9 +669,7 @@ int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_val for (i = 0; i < files_cnt; i++) { zend_stat_t s; char fullpath[MAXPATHLEN]; - int ovector[3]; - int matches; - int namelist_len = ZSTR_LEN(namelist[i]); + size_t namelist_len = ZSTR_LEN(namelist[i]); if ((namelist_len == 1 && ZSTR_VAL(namelist[i])[0] == '.') || (namelist_len == 2 && ZSTR_VAL(namelist[i])[0] == '.' && ZSTR_VAL(namelist[i])[1] == '.')) { @@ -678,7 +678,7 @@ int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_val } if ((path_len + namelist_len + 1) >= MAXPATHLEN) { - php_error_docref(NULL, E_WARNING, "add_path string too long (max: %i, %i given)", + php_error_docref(NULL, E_WARNING, "add_path string too long (max: %u, %zu given)", MAXPATHLEN - 1, (path_len + namelist_len + 1)); zend_string_release(namelist[i]); break; @@ -697,9 +697,16 @@ int php_zip_pcre(zend_string *regexp, char *path, int path_len, zval *return_val continue; } - matches = pcre_exec(re, NULL, ZSTR_VAL(namelist[i]), ZSTR_LEN(namelist[i]), 0, 0, ovector, 3); + match_data = php_pcre_create_match_data(capture_count, re); + if (!match_data) { + /* Allocation failed, but can proceed to the next pattern. */ + zend_string_release(namelist[i]); + continue; + } + rc = pcre2_match(re, (PCRE2_SPTR)ZSTR_VAL(namelist[i]), ZSTR_LEN(namelist[i]), 0, preg_options, match_data, mctx); + php_pcre_free_match_data(match_data); /* 0 means that the vector is too small to hold all the captured substring offsets */ - if (matches < 0) { + if (rc < 0) { zend_string_release(namelist[i]); continue; } @@ -800,15 +807,20 @@ typedef struct _zip_prop_handler { static void php_zip_register_prop_handler(HashTable *prop_handler, char *name, zip_read_int_t read_int_func, zip_read_const_char_t read_char_func, zip_read_const_char_from_ze_t read_char_from_obj_func, int rettype) /* {{{ */ { zip_prop_handler hnd; + zend_string *str; + zval tmp; hnd.read_const_char_func = read_char_func; hnd.read_int_func = read_int_func; hnd.read_const_char_from_obj_func = read_char_from_obj_func; hnd.type = rettype; - zend_hash_str_add_mem(prop_handler, name, strlen(name), &hnd, sizeof(zip_prop_handler)); + str = zend_string_init_interned(name, strlen(name), 1); + zend_hash_add_mem(prop_handler, str, &hnd, sizeof(zip_prop_handler)); /* Register for reflection */ - zend_declare_property_null(zip_class_entry, name, strlen(name), ZEND_ACC_PUBLIC); + ZVAL_NULL(&tmp); + zend_declare_property_ex(zip_class_entry, str, &tmp, ZEND_ACC_PUBLIC, NULL); + zend_string_release(str); } /* }}} */ @@ -869,8 +881,7 @@ static zval *php_zip_get_property_ptr_ptr(zval *object, zval *member, int type, zend_object_handlers *std_hnd; if (Z_TYPE_P(member) != IS_STRING) { - ZVAL_COPY(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string_func(member)); member = &tmp_member; cache_slot = NULL; } @@ -903,8 +914,7 @@ static zval *php_zip_read_property(zval *object, zval *member, int type, void ** zend_object_handlers *std_hnd; if (Z_TYPE_P(member) != IS_STRING) { - ZVAL_COPY(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string_func(member)); member = &tmp_member; cache_slot = NULL; } @@ -942,8 +952,7 @@ static int php_zip_has_property(zval *object, zval *member, int type, void **cac int retval = 0; if (Z_TYPE_P(member) != IS_STRING) { - ZVAL_COPY(&tmp_member, member); - convert_to_string(&tmp_member); + ZVAL_STR(&tmp_member, zval_get_string_func(member)); member = &tmp_member; cache_slot = NULL; } @@ -1052,7 +1061,7 @@ static zend_object *php_zip_object_new(zend_class_entry *class_type) /* {{{ */ { ze_zip_object *intern; - intern = ecalloc(1, sizeof(ze_zip_object) + zend_object_properties_size(class_type)); + intern = zend_object_alloc(sizeof(ze_zip_object), class_type); intern->prop_handler = &zip_prop_handlers; zend_object_std_init(&intern->zo, class_type); object_properties_init(&intern->zo, class_type); |
