diff options
| author | Sean Finney <seanius@debian.org> | 2009-06-24 22:49:04 +0200 |
|---|---|---|
| committer | Sean Finney <seanius@debian.org> | 2009-06-24 22:49:04 +0200 |
| commit | 84f4ca9b07fe5b73d840258f4aa7c1eb534c4253 (patch) | |
| tree | 9829bd578af8a4a8b42b04277f9067e00dc5ad90 /ext/xmlwriter | |
| parent | 6821b67124604da690c5e9276d5370d679c63ac8 (diff) | |
| download | php-84f4ca9b07fe5b73d840258f4aa7c1eb534c4253.tar.gz | |
Imported Upstream version 5.3.0~RC4upstream/5.3.0_RC4upstream/5.3.0.RC4
Diffstat (limited to 'ext/xmlwriter')
13 files changed, 276 insertions, 5 deletions
diff --git a/ext/xmlwriter/php_xmlwriter.c b/ext/xmlwriter/php_xmlwriter.c index f72de17b8..21516a15a 100644 --- a/ext/xmlwriter/php_xmlwriter.c +++ b/ext/xmlwriter/php_xmlwriter.c @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_xmlwriter.c,v 1.20.2.12.2.15.2.11 2008/12/31 11:15:47 sebastian Exp $ */ +/* $Id: php_xmlwriter.c,v 1.20.2.12.2.15.2.15 2009/05/26 08:10:49 pajoye Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -28,7 +28,7 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "php_xmlwriter.h" - +#include "ext/standard/php_string.h" #if LIBXML_VERSION >= 20605 static PHP_FUNCTION(xmlwriter_set_indent); @@ -614,7 +614,10 @@ static char *_xmlwriter_get_valid_file_path(char *source, char *resolved_path, i if (uri->scheme != NULL) { /* absolute file uris - libxml only supports localhost or empty host */ - if (strncasecmp(source, "file:///",8) == 0) { + if (strncasecmp(source, "file:///", 8) == 0) { + if (source[sizeof("file:///") - 1] == '\0') { + return NULL; + } isFileUri = 1; #ifdef PHP_WIN32 source += 8; @@ -622,6 +625,10 @@ static char *_xmlwriter_get_valid_file_path(char *source, char *resolved_path, i source += 7; #endif } else if (strncasecmp(source, "file://localhost/",17) == 0) { + if (source[sizeof("file://localhost/") - 1] == '\0') { + return NULL; + } + isFileUri = 1; #ifdef PHP_WIN32 source += 17; @@ -631,14 +638,29 @@ static char *_xmlwriter_get_valid_file_path(char *source, char *resolved_path, i } } - file_dest = source; - if ((uri->scheme == NULL || isFileUri)) { + char file_dirname[MAXPATHLEN]; + size_t dir_len; + if (!VCWD_REALPATH(source, resolved_path) && !expand_filepath(source, resolved_path TSRMLS_CC)) { xmlFreeURI(uri); return NULL; } + + memcpy(file_dirname, source, strlen(source)); + dir_len = php_dirname(file_dirname, strlen(source)); + + if (dir_len > 0) { + struct stat buf; + if (php_sys_stat(file_dirname, &buf) != 0) { + xmlFreeURI(uri); + return NULL; + } + } + file_dest = resolved_path; + } else { + file_dest = source; } xmlFreeURI(uri); @@ -1755,9 +1777,13 @@ static PHP_FUNCTION(xmlwriter_open_uri) valid_file = _xmlwriter_get_valid_file_path(source, resolved_path, MAXPATHLEN TSRMLS_CC); if (!valid_file) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to resolve file path"); RETURN_FALSE; } + /* TODO: Fix either the PHP stream or libxml APIs: it can then detect when a given + path is valid and not report out of memory error. Once it is done, remove the + directory check in _xmlwriter_get_valid_file_path */ #ifndef ZEND_ENGINE_2 ioctx = php_xmlwriter_streams_IO_open_write_wrapper(valid_file TSRMLS_CC); if (ioctx == NULL) { diff --git a/ext/xmlwriter/tests/bug48204.phpt b/ext/xmlwriter/tests/bug48204.phpt new file mode 100644 index 000000000..86ab6688d --- /dev/null +++ b/ext/xmlwriter/tests/bug48204.phpt @@ -0,0 +1,17 @@ +--TEST-- +xmlwriter_open_uri with PHP_MAXPATHLEN + 1 +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +$path = str_repeat('a', PHP_MAXPATHLEN + 1); +var_dump(xmlwriter_open_uri('file:///' . $path)); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +Theo van der Zee +#Test Fest Utrecht 09-05-2009 +--EXPECTF-- + +Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d +bool(false) diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_001.phpt new file mode 100644 index 000000000..8bdf7eaea --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_001.phpt @@ -0,0 +1,16 @@ +--TEST-- +xmlwriter_open_uri with empty string as parameter +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +var_dump(xmlwriter_open_uri('')); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +Theo van der Zee +#Test Fest Utrecht 09-05-2009 +--EXPECTF-- + +Warning: xmlwriter_open_uri(): Empty string as source in %s on line %d +bool(false) diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_002.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_002.phpt new file mode 100644 index 000000000..cfda44e21 --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_002.phpt @@ -0,0 +1,16 @@ +--TEST-- +xmlwriter_open_uri without parameter +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +var_dump(xmlwriter_open_uri()); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +Theo van der Zee +#Test Fest Utrecht 09-05-2009 +--EXPECTF-- + +Warning: xmlwriter_open_uri() expects exactly %d parameter, %d given in %s on line %d +NULL diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_003.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_003.phpt new file mode 100644 index 000000000..49a293853 --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_003.phpt @@ -0,0 +1,16 @@ +--TEST-- +xmlwriter_open_uri with non existing file +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +var_dump(xmlwriter_open_uri('foo/bar.tmp')); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +Theo van der Zee +#Test Fest Utrecht 09-05-2009 +--EXPECTF-- + +Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d +bool(false) diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_004.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_004.phpt new file mode 100644 index 000000000..d4e72ffda --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_004.phpt @@ -0,0 +1,16 @@ +--TEST-- +xmlwriter_open_uri with file:/// +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +var_dump(xmlwriter_open_uri('file:///')); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +Theo van der Zee +#Test Fest Utrecht 09-05-2009 +--EXPECTF-- + +Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d +bool(false) diff --git a/ext/xmlwriter/tests/xmlwriter_open_uri_error_005.phpt b/ext/xmlwriter/tests/xmlwriter_open_uri_error_005.phpt new file mode 100644 index 000000000..20a28afcd --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_open_uri_error_005.phpt @@ -0,0 +1,16 @@ +--TEST-- +xmlwriter_open_uri with file://localhost/ +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +var_dump(xmlwriter_open_uri('file://localhost/')); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +Theo van der Zee +#Test Fest Utrecht 09-05-2009 +--EXPECTF-- + +Warning: xmlwriter_open_uri(): Unable to resolve file path in %s on line %d +bool(false) diff --git a/ext/xmlwriter/tests/xmlwriter_set_indent_string_basic_001.phpt b/ext/xmlwriter/tests/xmlwriter_set_indent_string_basic_001.phpt new file mode 100644 index 000000000..896778b02 --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_set_indent_string_basic_001.phpt @@ -0,0 +1,24 @@ +--TEST-- +xmlwriter_set_indent_string passing xmlwriter resource +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string.tmp"; + $fp = fopen($temp_filename, "w"); + fwrite ($fp, "Hi"); + fclose($fp); +$resource = xmlwriter_open_uri($temp_filename); +var_dump(xmlwriter_set_indent_string($resource, ' ')); +?> +--CLEAN-- +<?php +$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string.tmp"; +unlink($temp_filename); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +Theo van der Zee +#Test Fest Utrecht 09-05-2009 +--EXPECT-- +bool(true) diff --git a/ext/xmlwriter/tests/xmlwriter_set_indent_string_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_set_indent_string_error_001.phpt new file mode 100644 index 000000000..c39678dac --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_set_indent_string_error_001.phpt @@ -0,0 +1,24 @@ +--TEST-- +xmlwriter_set_indent_string with missing param(s) +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string_error.tmp"; + $fp = fopen($temp_filename, "w"); + fwrite ($fp, "Hi"); + fclose($fp); +$resource = xmlwriter_open_uri($temp_filename); +var_dump(xmlwriter_set_indent_string($resource)); +?> +--CLEAN-- +<?php +$temp_filename = dirname(__FILE__)."/xmlwriter_set_indent_string_error.tmp"; +unlink($temp_filename); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +--EXPECTF-- + +Warning: xmlwriter_set_indent_string() expects exactly %d parameters, %d given in %s on line %d +NULL diff --git a/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_basic_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_basic_001.phpt new file mode 100644 index 000000000..090327b66 --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_basic_001.phpt @@ -0,0 +1,28 @@ +--TEST-- +xmlwriter_write_attribute_ns basic function tests +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +$xw = xmlwriter_open_memory(); +xmlwriter_set_indent($xw, TRUE); +xmlwriter_start_document($xw, NULL, "UTF-8"); +xmlwriter_start_element($xw, 'root'); +xmlwriter_write_attribute_ns($xw, 'prefix', 'id', 'http://www.php.net/uri', 'elem1'); +xmlwriter_start_element($xw, 'elem1'); +xmlwriter_write_attribute($xw, 'attr1', 'first'); +xmlwriter_end_element($xw); +xmlwriter_full_end_element($xw); +xmlwriter_end_document($xw); + +$output = xmlwriter_flush($xw, true); +print $output; +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +--EXPECT-- +<?xml version="1.0" encoding="UTF-8"?> +<root prefix:id="elem1" xmlns:prefix="http://www.php.net/uri"> + <elem1 attr1="first"/> +</root> + diff --git a/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt new file mode 100644 index 000000000..251672313 --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_write_attribute_ns_error_001.phpt @@ -0,0 +1,35 @@ +--TEST-- +xmlwriter_write_attribute_ns with missing param +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +$xw = xmlwriter_open_memory(); +xmlwriter_set_indent($xw, TRUE); +xmlwriter_start_document($xw, NULL, "UTF-8"); +xmlwriter_start_element($xw, 'root'); +xmlwriter_write_attribute_ns($xw, 'prefix', '', 'http://www.php.net/uri'); +xmlwriter_start_element($xw, 'elem1'); +xmlwriter_write_attribute($xw, 'attr1', 'first'); +xmlwriter_end_element($xw); +xmlwriter_full_end_element($xw); +xmlwriter_end_document($xw); + +$output = xmlwriter_flush($xw, true); +print $output; + +// write attribute_ns without start_element first +$xw = xmlwriter_open_memory(); +var_dump(xmlwriter_write_attribute_ns($xw, 'prefix', 'id', 'http://www.php.net/uri', 'elem1')); +print xmlwriter_output_memory($xw); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +--EXPECTF-- + +Warning: xmlwriter_write_attribute_ns() expects exactly %d parameters, %d given in %s on line %d +<?xml version="1.0" encoding="UTF-8"?> +<root> + <elem1 attr1="first"/> +</root> +bool(false) diff --git a/ext/xmlwriter/tests/xmlwriter_write_dtd_basic_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_dtd_basic_001.phpt new file mode 100644 index 000000000..62adce818 --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_write_dtd_basic_001.phpt @@ -0,0 +1,22 @@ +--TEST-- +xmlwriter_write_dtd basic function tests +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php + +$xmlwriter = xmlwriter_open_memory(); +var_dump(xmlwriter_write_dtd($xmlwriter, 'bla1', 'bla2', 'bla3', 'bla4')); +$output = xmlwriter_flush($xmlwriter, true); +print $output . PHP_EOL; + +var_dump(xmlwriter_write_dtd($xmlwriter, '', '', '')); +$output = xmlwriter_flush($xmlwriter, true); +print $output; +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +--EXPECT-- +bool(true) +<!DOCTYPE bla1 PUBLIC "bla2" "bla3" [bla4]> +bool(false) diff --git a/ext/xmlwriter/tests/xmlwriter_write_dtd_error_001.phpt b/ext/xmlwriter/tests/xmlwriter_write_dtd_error_001.phpt new file mode 100644 index 000000000..7968eb456 --- /dev/null +++ b/ext/xmlwriter/tests/xmlwriter_write_dtd_error_001.phpt @@ -0,0 +1,15 @@ +--TEST-- +xmlwriter_write_dtd with missing param(s) +--SKIPIF-- +<?php if (!extension_loaded("xmlwriter")) print "skip"; ?> +--FILE-- +<?php +$xmlwriter = xmlwriter_open_memory(); +var_dump(xmlwriter_write_dtd($xmlwriter)); +?> +--CREDIT-- +Koen Kuipers koenk82@gmail.com +--EXPECTF-- + +Warning: xmlwriter_write_dtd() expects at least %d parameters, %d given in %s on line %d +NULL |
