diff options
| author | Rob Richards <rrichards@php.net> | 2005-08-26 02:29:56 +0000 | 
|---|---|---|
| committer | Rob Richards <rrichards@php.net> | 2005-08-26 02:29:56 +0000 | 
| commit | 293beeb74ae2c83b932bb833f263109cc3991109 (patch) | |
| tree | 4581fa75339f7d208f6aac8f0b55ac27b535d9b0 /ext | |
| parent | 2e4c7dbb0334e0531cc91a5d19b5c17367b05264 (diff) | |
| download | php-git-293beeb74ae2c83b932bb833f263109cc3991109.tar.gz | |
MFH: Fix URI escaping
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/libxml/libxml.c | 41 | 
1 files changed, 35 insertions, 6 deletions
diff --git a/ext/libxml/libxml.c b/ext/libxml/libxml.c index 119c63b86d..ede558ba82 100644 --- a/ext/libxml/libxml.c +++ b/ext/libxml/libxml.c @@ -253,14 +253,26 @@ static void php_libxml_init_globals(php_libxml_globals *libxml_globals_p TSRMLS_  int php_libxml_streams_IO_match_wrapper(const char *filename)  {  	char *resolved_path; -	int retval; +	int retval, isescaped=0; +	xmlURI *uri;  	TSRMLS_FETCH();  	if (zend_is_executing(TSRMLS_C)) { -		resolved_path = xmlURIUnescapeString(filename, 0, NULL); +		uri = xmlParseURI((xmlChar *)filename); +		if (uri && (uri->scheme == NULL || (xmlStrncmp(uri->scheme, "file", 4) == 0))) { +			resolved_path = xmlURIUnescapeString(filename, 0, NULL); +			isescaped = 1; +		} else { +			resolved_path = (char *)filename; +		} + +		if (uri) { +			xmlFreeURI(uri); +		} +  		retval = php_stream_locate_url_wrapper(resolved_path, NULL, 0 TSRMLS_CC) ? 1 : 0; -		if (resolved_path) { +		if (resolved_path && isescaped) {  			xmlFree(resolved_path);  		}  		return retval; @@ -275,9 +287,22 @@ void *php_libxml_streams_IO_open_wrapper(const char *filename, const char *mode,  	php_stream_wrapper *wrapper = NULL;  	char *resolved_path, *path_to_open = NULL;  	void *ret_val = NULL; +	int isescaped=0; +	xmlURI *uri;  	TSRMLS_FETCH(); -	resolved_path = xmlURIUnescapeString(filename, 0, NULL); + +	uri = xmlParseURI((xmlChar *)filename); +	if (uri && (uri->scheme == NULL || (xmlStrncmp(uri->scheme, "file", 4) == 0))) { +		resolved_path = xmlURIUnescapeString(filename, 0, NULL); +		isescaped = 1; +	} else { +		resolved_path = (char *)filename; +	} + +	if (uri) { +		xmlFreeURI(uri); +	}  	if (resolved_path == NULL) {  		return NULL; @@ -292,7 +317,9 @@ void *php_libxml_streams_IO_open_wrapper(const char *filename, const char *mode,  	wrapper = php_stream_locate_url_wrapper(resolved_path, &path_to_open, ENFORCE_SAFE_MODE TSRMLS_CC);  	if (wrapper && read_only && wrapper->wops->url_stat) {  		if (wrapper->wops->url_stat(wrapper, path_to_open, PHP_STREAM_URL_STAT_QUIET, &ssbuf, NULL TSRMLS_CC) == -1) { -			xmlFree(resolved_path); +			if (isescaped) { +				xmlFree(resolved_path); +			}  			return NULL;  		}  	} @@ -302,7 +329,9 @@ void *php_libxml_streams_IO_open_wrapper(const char *filename, const char *mode,  	}  	ret_val = php_stream_open_wrapper_ex(path_to_open, (char *)mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL, context); -	xmlFree(resolved_path); +	if (isescaped) { +		xmlFree(resolved_path); +	}  	return ret_val;  }  | 
