Skip to content

Commit

Permalink
Fixed issue #115 (path issue when using phar).
Browse files Browse the repository at this point in the history
  • Loading branch information
laruence committed Oct 21, 2013
1 parent cbac47b commit 8568ed6
Showing 1 changed file with 39 additions and 5 deletions.
44 changes: 39 additions & 5 deletions ZendAccelerator.c
Expand Up @@ -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"

Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 8568ed6

Please sign in to comment.