|
|
@ -163,18 +163,15 @@ static int php_is_file_ok(const cwd_state *state) |
|
|
static void cwd_globals_ctor(virtual_cwd_globals *cwd_globals TSRMLS_DC) |
|
|
static void cwd_globals_ctor(virtual_cwd_globals *cwd_globals TSRMLS_DC) |
|
|
{ |
|
|
{ |
|
|
CWD_STATE_COPY(&cwd_globals->cwd, &main_cwd_state); |
|
|
CWD_STATE_COPY(&cwd_globals->cwd, &main_cwd_state); |
|
|
#ifdef REALPATH_CACHE |
|
|
|
|
|
cwd_globals->realpath_cache_size = 0; |
|
|
cwd_globals->realpath_cache_size = 0; |
|
|
cwd_globals->realpath_cache_size_limit = REALPATH_CACHE_SIZE; |
|
|
cwd_globals->realpath_cache_size_limit = REALPATH_CACHE_SIZE; |
|
|
cwd_globals->realpath_cache_ttl = REALPATH_CACHE_TTL; |
|
|
cwd_globals->realpath_cache_ttl = REALPATH_CACHE_TTL; |
|
|
memset(cwd_globals->realpath_cache, 0, sizeof(cwd_globals->realpath_cache)); |
|
|
memset(cwd_globals->realpath_cache, 0, sizeof(cwd_globals->realpath_cache)); |
|
|
#endif |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static void cwd_globals_dtor(virtual_cwd_globals *cwd_globals TSRMLS_DC) |
|
|
static void cwd_globals_dtor(virtual_cwd_globals *cwd_globals TSRMLS_DC) |
|
|
{ |
|
|
{ |
|
|
CWD_STATE_FREE(&cwd_globals->cwd); |
|
|
CWD_STATE_FREE(&cwd_globals->cwd); |
|
|
#ifdef REALPATH_CACHE |
|
|
|
|
|
{ |
|
|
{ |
|
|
int i; |
|
|
int i; |
|
|
|
|
|
|
|
|
@ -187,7 +184,6 @@ static void cwd_globals_dtor(virtual_cwd_globals *cwd_globals TSRMLS_DC) |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static char *tsrm_strndup(const char *s, size_t length) |
|
|
static char *tsrm_strndup(const char *s, size_t length) |
|
|
@ -308,7 +304,6 @@ CWD_API char *virtual_getcwd(char *buf, size_t size TSRMLS_DC) |
|
|
return buf; |
|
|
return buf; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
#ifdef REALPATH_CACHE |
|
|
|
|
|
static inline unsigned long realpath_cache_key(const char *path, int path_len) |
|
|
static inline unsigned long realpath_cache_key(const char *path, int path_len) |
|
|
{ |
|
|
{ |
|
|
register unsigned long h; |
|
|
register unsigned long h; |
|
|
@ -343,7 +338,8 @@ static inline void realpath_cache_add(const char *path, int path_len, const char |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static inline realpath_cache_bucket* realpath_cache_find(const char *path, int path_len, time_t t TSRMLS_DC) |
|
|
|
|
|
|
|
|
//static inline |
|
|
|
|
|
realpath_cache_bucket* realpath_cache_find(const char *path, int path_len, time_t t TSRMLS_DC) |
|
|
{ |
|
|
{ |
|
|
unsigned long key = realpath_cache_key(path, path_len); |
|
|
unsigned long key = realpath_cache_key(path, path_len); |
|
|
unsigned long n = key % (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0])); |
|
|
unsigned long n = key % (sizeof(CWDG(realpath_cache)) / sizeof(CWDG(realpath_cache)[0])); |
|
|
@ -352,19 +348,18 @@ static inline realpath_cache_bucket* realpath_cache_find(const char *path, int p |
|
|
while (*bucket != NULL) { |
|
|
while (*bucket != NULL) { |
|
|
if (CWDG(realpath_cache_ttl) && (*bucket)->expires < t) { |
|
|
if (CWDG(realpath_cache_ttl) && (*bucket)->expires < t) { |
|
|
realpath_cache_bucket *r = *bucket; |
|
|
realpath_cache_bucket *r = *bucket; |
|
|
*bucket = (*bucket)->next; |
|
|
|
|
|
CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1 + r->realpath_len + 1; |
|
|
|
|
|
free(r); |
|
|
|
|
|
|
|
|
*bucket = (*bucket)->next; |
|
|
|
|
|
CWDG(realpath_cache_size) -= sizeof(realpath_cache_bucket) + r->path_len + 1 + r->realpath_len + 1; |
|
|
|
|
|
free(r); |
|
|
} else if (key == (*bucket)->key && path_len == (*bucket)->path_len && |
|
|
} else if (key == (*bucket)->key && path_len == (*bucket)->path_len && |
|
|
memcmp(path, (*bucket)->path, path_len) == 0) { |
|
|
memcmp(path, (*bucket)->path, path_len) == 0) { |
|
|
return *bucket; |
|
|
return *bucket; |
|
|
} else { |
|
|
} else { |
|
|
*bucket = (*bucket)->next; |
|
|
|
|
|
|
|
|
bucket = &(*bucket)->next; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
return NULL; |
|
|
return NULL; |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Resolve path relatively to state and put the real path into state */ |
|
|
/* Resolve path relatively to state and put the real path into state */ |
|
|
@ -385,20 +380,17 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func |
|
|
#else |
|
|
#else |
|
|
char *new_path; |
|
|
char *new_path; |
|
|
#endif |
|
|
#endif |
|
|
#ifdef REALPATH_CACHE |
|
|
|
|
|
char orig_path[MAXPATHLEN]; |
|
|
char orig_path[MAXPATHLEN]; |
|
|
int orig_path_len; |
|
|
int orig_path_len; |
|
|
realpath_cache_bucket *bucket; |
|
|
realpath_cache_bucket *bucket; |
|
|
time_t t; |
|
|
time_t t; |
|
|
TSRMLS_FETCH(); |
|
|
TSRMLS_FETCH(); |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
if (path_length == 0) |
|
|
if (path_length == 0) |
|
|
return (0); |
|
|
return (0); |
|
|
if (path_length >= MAXPATHLEN) |
|
|
if (path_length >= MAXPATHLEN) |
|
|
return (1); |
|
|
return (1); |
|
|
|
|
|
|
|
|
#ifdef REALPATH_CACHE |
|
|
|
|
|
if (use_realpath && CWDG(realpath_cache_size_limit)) { |
|
|
if (use_realpath && CWDG(realpath_cache_size_limit)) { |
|
|
if (IS_ABSOLUTE_PATH(path, path_length) || (state->cwd_length < 1)) { |
|
|
if (IS_ABSOLUTE_PATH(path, path_length) || (state->cwd_length < 1)) { |
|
|
memcpy(orig_path, path, path_length+1); |
|
|
memcpy(orig_path, path, path_length+1); |
|
|
@ -430,7 +422,6 @@ CWD_API int virtual_file_ex(cwd_state *state, const char *path, verify_path_func |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
#if !defined(TSRM_WIN32) && !defined(NETWARE) |
|
|
#if !defined(TSRM_WIN32) && !defined(NETWARE) |
|
|
/* cwd_length can be 0 when getcwd() fails. |
|
|
/* cwd_length can be 0 when getcwd() fails. |
|
|
* This can happen under solaris when a dir does not have read permissions |
|
|
* This can happen under solaris when a dir does not have read permissions |
|
|
@ -609,11 +600,9 @@ php_failed_getlongpath: |
|
|
#endif |
|
|
#endif |
|
|
free(free_path); |
|
|
free(free_path); |
|
|
|
|
|
|
|
|
#ifdef REALPATH_CACHE |
|
|
|
|
|
if (use_realpath && CWDG(realpath_cache_size_limit)) { |
|
|
if (use_realpath && CWDG(realpath_cache_size_limit)) { |
|
|
realpath_cache_add(orig_path, orig_path_len, state->cwd, state->cwd_length, t TSRMLS_CC); |
|
|
realpath_cache_add(orig_path, orig_path_len, state->cwd, state->cwd_length, t TSRMLS_CC); |
|
|
} |
|
|
} |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
if (verify_path && verify_path(state)) { |
|
|
if (verify_path && verify_path(state)) { |
|
|
CWD_STATE_FREE(state); |
|
|
CWD_STATE_FREE(state); |
|
|
|