diff options
author | Xinchen Hui <laruence@php.net> | 2013-10-21 17:40:39 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@php.net> | 2013-10-21 17:40:39 +0800 |
commit | 098855433dc5d609e3970f0bc9d6766c007273f3 (patch) | |
tree | e9b6c60b01ea37e8d34ec5b01fe43e41a1970337 /ext/opcache/ZendAccelerator.c | |
parent | cb47396d4601656173cffadf86f6342bcba5e2b7 (diff) | |
download | php-git-098855433dc5d609e3970f0bc9d6766c007273f3.tar.gz |
Fixed issue #115 (path issue when using phar).
Diffstat (limited to 'ext/opcache/ZendAccelerator.c')
-rw-r--r-- | ext/opcache/ZendAccelerator.c | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index 72b5a1b9fe..48ff73019b 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -37,6 +37,7 @@ #include "zend_API.h" #include "zend_ini.h" #include "TSRM/tsrm_virtual_cwd.h" +#include "ext/phar/php_phar.h" #include "zend_accelerator_util_funcs.h" #include "zend_accelerator_hash.h" @@ -144,6 +145,21 @@ static inline int is_cacheable_stream_path(const char *filename) memcmp(filename, "phar://", sizeof("phar://") - 1) == 0; } +static inline int is_phar_relative_alias_path(const char *filename, char **alias, int *alias_len) +{ + if (memcmp(filename, "phar://", sizeof("phar://") - 1) == 0 + && filename[sizeof("phar://") - 1] != '\0' && filename[sizeof("phar://") - 1] != '/') { + char *slash; + *alias = filename + sizeof("phar://") - 1; + slash = strstr(*alias, "/"); + if (slash) { + *alias_len = slash - *alias; + return 1; + } + } + return 0; +} + /* O+ overrides PHP chdir() function and remembers the current working directory * in ZCG(cwd) and ZCG(cwd_len). Later accel_getcwd() can use stored value and * avoid getcwd() call. @@ -1028,15 +1044,33 @@ char *accel_make_persistent_key_ex(zend_file_handle *file_handle, int path_lengt } memcpy(ZCG(key) + cur_len, include_path, include_path_len); ZCG(key)[key_length] = '\0'; - } else { - /* not use_cwd */ - key_length = path_length; + } else { + /* not use_cwd */ + key_length = path_length; if ((size_t)key_length >= sizeof(ZCG(key))) { ZCG(key_len) = 0; return NULL; + } else { + char *alias; + int alias_len; + if (is_phar_relative_alias_path(file_handle->filename, &alias, &alias_len)) { + char *phar_path; + int phar_path_len; + if (phar_resolve_alias(alias, alias_len, &phar_path, &phar_path_len TSRMLS_CC) == SUCCESS) { + int filename_len = strlen(file_handle->filename); + memcpy(ZCG(key), "phar://", sizeof("phar://") -1); + memcpy(ZCG(key) + sizeof("phar://") - 1, phar_path, phar_path_len); + memcpy(ZCG(key) + sizeof("phar://") - 1 + phar_path_len, + alias + alias_len, filename_len - alias_len - sizeof("phar://") + 2); + key_length = filename_len + (phar_path_len - alias_len); + } else { + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } + } else { + memcpy(ZCG(key), file_handle->filename, key_length + 1); + } } - memcpy(ZCG(key), file_handle->filename, key_length + 1); - } + } *key_len = ZCG(key_len) = key_length; return ZCG(key); |