mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00
Add stream_resolve_include_path()
This commit is contained in:
parent
ff6b250bba
commit
1caed2fa18
4 changed files with 75 additions and 0 deletions
1
NEWS
1
NEWS
|
@ -55,6 +55,7 @@ PHP NEWS
|
||||||
. sys_get_temp_dir() function that returns the default directory
|
. sys_get_temp_dir() function that returns the default directory
|
||||||
for temporary files (as requested in bug #35380). (Hartmut)
|
for temporary files (as requested in bug #35380). (Hartmut)
|
||||||
. "context" and "binary_pipes" params in "other_options" arg. (Sara)
|
. "context" and "binary_pipes" params in "other_options" arg. (Sara)
|
||||||
|
. stream_resolve_include_path(). (Sara)
|
||||||
|
|
||||||
- Fixed bug #36630 (umask not reset at the end of the request). (Ilia)
|
- Fixed bug #36630 (umask not reset at the end of the request). (Ilia)
|
||||||
- Fixed bug #34286 (__toString() behavior is inconsistent). (Marcus)
|
- Fixed bug #34286 (__toString() behavior is inconsistent). (Marcus)
|
||||||
|
|
|
@ -2443,6 +2443,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_encoding, 0, 0, 1)
|
||||||
ZEND_ARG_INFO(0, stream)
|
ZEND_ARG_INFO(0, stream)
|
||||||
ZEND_ARG_INFO(0, encoding)
|
ZEND_ARG_INFO(0, encoding)
|
||||||
ZEND_END_ARG_INFO()
|
ZEND_END_ARG_INFO()
|
||||||
|
|
||||||
|
static
|
||||||
|
ZEND_BEGIN_ARG_INFO_EX(arginfo_stream_resolve_include_path, 0, 0, 1)
|
||||||
|
ZEND_ARG_INFO(0, filename)
|
||||||
|
ZEND_ARG_INFO(0, context)
|
||||||
|
ZEND_END_ARG_INFO()
|
||||||
/* }}} */
|
/* }}} */
|
||||||
/* {{{ string.c */
|
/* {{{ string.c */
|
||||||
static
|
static
|
||||||
|
@ -3553,6 +3559,7 @@ zend_function_entry basic_functions[] = {
|
||||||
#endif
|
#endif
|
||||||
PHP_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream)
|
PHP_FE(stream_copy_to_stream, arginfo_stream_copy_to_stream)
|
||||||
PHP_FE(stream_get_contents, arginfo_stream_get_contents)
|
PHP_FE(stream_get_contents, arginfo_stream_get_contents)
|
||||||
|
PHP_FE(stream_resolve_include_path, arginfo_stream_resolve_include_path)
|
||||||
PHP_FE(fgetcsv, arginfo_fgetcsv)
|
PHP_FE(fgetcsv, arginfo_fgetcsv)
|
||||||
PHP_FE(fputcsv, arginfo_fputcsv)
|
PHP_FE(fputcsv, arginfo_fputcsv)
|
||||||
PHP_FE(flock, arginfo_flock)
|
PHP_FE(flock, arginfo_flock)
|
||||||
|
|
|
@ -1579,6 +1579,72 @@ PHP_FUNCTION(stream_encoding)
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
||||||
|
/* {{{ proto string stream_resolve_include_path(string filename[, resource context]) U
|
||||||
|
Determine what file will be opened by calls to fopen() with a relative path */
|
||||||
|
PHP_FUNCTION(stream_resolve_include_path)
|
||||||
|
{
|
||||||
|
zval **ppfilename, *zcontext = NULL;
|
||||||
|
char *filename, *ptr = PG(include_path), *end = ptr + (ptr ? strlen(ptr) : 0), buffer[MAXPATHLEN];
|
||||||
|
int filename_len;
|
||||||
|
php_stream_context *context = NULL;
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "Z|r", &ppfilename, &zcontext) == FAILURE ||
|
||||||
|
php_stream_path_param_encode(ppfilename, &filename, &filename_len, REPORT_ERRORS, context = php_stream_context_from_zval(zcontext, 0)) == FAILURE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (ptr < end) {
|
||||||
|
char *s = strchr(ptr, DEFAULT_DIR_SEPARATOR);
|
||||||
|
|
||||||
|
if (!s) {
|
||||||
|
s = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (s == ptr) {
|
||||||
|
ptr++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((s - ptr) + 1 + filename_len >= MAXPATHLEN) {
|
||||||
|
/* Too long to try */
|
||||||
|
ptr = s + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buffer, ptr, s - ptr);
|
||||||
|
buffer[s - ptr] = '/';
|
||||||
|
memcpy(buffer + (s - ptr) + 1, filename, filename_len + 1);
|
||||||
|
|
||||||
|
if (php_check_open_basedir_ex(buffer, 0 TSRMLS_CC)) {
|
||||||
|
ptr = s + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VCWD_STAT(buffer, &sb)) {
|
||||||
|
ptr = s + 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (UG(unicode)) {
|
||||||
|
UChar *upath;
|
||||||
|
int upath_len;
|
||||||
|
|
||||||
|
if (SUCCESS == php_stream_path_decode(NULL, &upath, &upath_len, buffer, (s - ptr) + 1 + filename_len, REPORT_ERRORS, context)) {
|
||||||
|
RETURN_UNICODEL(upath, upath_len, 0);
|
||||||
|
} else {
|
||||||
|
/* Fallback */
|
||||||
|
RETURN_STRINGL(buffer, (s - ptr) + 1 + filename_len, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
RETURN_STRINGL(buffer, (s - ptr) + 1 + filename_len, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
* tab-width: 4
|
* tab-width: 4
|
||||||
|
|
|
@ -55,6 +55,7 @@ PHP_FUNCTION(stream_filter_remove);
|
||||||
PHP_FUNCTION(stream_encoding);
|
PHP_FUNCTION(stream_encoding);
|
||||||
PHP_FUNCTION(stream_socket_enable_crypto);
|
PHP_FUNCTION(stream_socket_enable_crypto);
|
||||||
PHP_FUNCTION(stream_socket_pair);
|
PHP_FUNCTION(stream_socket_pair);
|
||||||
|
PHP_FUNCTION(stream_resolve_include_path);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue