rrichards Wed May 10 11:58:57 2006 UTC
Modified files:
/php-src/ext/xmlreader php_xmlreader.c php_xmlreader.h
Log:
- revert back to using internal buffer
origional string may be modified during parse causing possible crash
http://cvs.php.net/viewcvs.cgi/php-src/ext/xmlreader/php_xmlreader.c?r1=1.32&r2=1.33&diff_format=u
Index: php-src/ext/xmlreader/php_xmlreader.c
diff -u php-src/ext/xmlreader/php_xmlreader.c:1.32
php-src/ext/xmlreader/php_xmlreader.c:1.33
--- php-src/ext/xmlreader/php_xmlreader.c:1.32 Fri Mar 31 23:20:58 2006
+++ php-src/ext/xmlreader/php_xmlreader.c Wed May 10 11:58:56 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_xmlreader.c,v 1.32 2006/03/31 23:20:58 pajoye Exp $ */
+/* $Id: php_xmlreader.c,v 1.33 2006/05/10 11:58:56 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -54,6 +54,7 @@
#define XMLREADER_LOAD_STRING 0
#define XMLREADER_LOAD_FILE 1
+
/* {{{ xmlreader_register_prop_handler */
static void xmlreader_register_prop_handler(HashTable *prop_handler, char
*name, xmlreader_read_int_t read_int_func, xmlreader_read_const_char_t
read_char_func, int rettype TSRMLS_DC)
{
@@ -65,6 +66,7 @@
zend_hash_add(prop_handler, name, strlen(name)+1, &hnd,
sizeof(xmlreader_prop_handler), NULL);
}
/* }}} */
+
/* {{{ xmlreader_property_reader */
static int xmlreader_property_reader(xmlreader_object *obj,
xmlreader_prop_handler *hnd, zval **retval TSRMLS_DC)
{
@@ -359,6 +361,11 @@
/* {{{ xmlreader_free_resources */
static void xmlreader_free_resources(xmlreader_object *intern) {
if (intern) {
+ if (intern->input) {
+ xmlFreeParserInputBuffer(intern->input);
+ intern->input = NULL;
+ }
+
if (intern->ptr) {
xmlFreeTextReader(intern->ptr);
intern->ptr = NULL;
@@ -396,6 +403,7 @@
intern = emalloc(sizeof(xmlreader_object));
memset(&intern->std, 0, sizeof(zend_object));
intern->ptr = NULL;
+ intern->input = NULL;
intern->schema = NULL;
intern->prop_handler = &xmlreader_prop_handlers;
@@ -1050,6 +1058,7 @@
char *source, *uri = NULL, *encoding = NULL;
int resolved_path_len;
char *directory=NULL, resolved_path[MAXPATHLEN];
+ xmlParserInputBufferPtr inputbfr;
xmlTextReaderPtr reader;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!l", &source,
&source_len, &encoding, &encoding_len, &options) == FAILURE) {
@@ -1070,39 +1079,43 @@
RETURN_FALSE;
}
+ inputbfr = xmlParserInputBufferCreateMem(source, source_len,
XML_CHAR_ENCODING_NONE);
+
+ if (inputbfr != NULL) {
/* Get the URI of the current script so that we can set the base directory in
libxml */
#if HAVE_GETCWD
- directory = VCWD_GETCWD(resolved_path, MAXPATHLEN);
+ directory = VCWD_GETCWD(resolved_path, MAXPATHLEN);
#elif HAVE_GETWD
- directory = VCWD_GETWD(resolved_path);
+ directory = VCWD_GETWD(resolved_path);
#endif
- if (directory) {
- resolved_path_len = strlen(resolved_path);
- if (resolved_path[resolved_path_len - 1] != DEFAULT_SLASH) {
- resolved_path[resolved_path_len] = DEFAULT_SLASH;
- resolved_path[++resolved_path_len] = '\0';
+ if (directory) {
+ resolved_path_len = strlen(resolved_path);
+ if (resolved_path[resolved_path_len - 1] !=
DEFAULT_SLASH) {
+ resolved_path[resolved_path_len] =
DEFAULT_SLASH;
+ resolved_path[++resolved_path_len] = '\0';
+ }
+ uri = (char *) xmlCanonicPath((const xmlChar *)
resolved_path);
}
- uri = (char *) xmlCanonicPath((const xmlChar *) resolved_path);
- }
-
- reader = xmlReaderForMemory(source, source_len, uri, encoding, options);
-
- if (uri) {
- xmlFree(uri);
- }
-
- if (reader != NULL) {
- if (id == NULL) {
- object_init_ex(return_value, xmlreader_class_entry);
- intern = (xmlreader_object
*)zend_objects_get_address(return_value TSRMLS_CC);
+ reader = xmlNewTextReader(inputbfr, uri);
+ if (uri) {
+ xmlFree(uri);
+ }
+ if (reader != NULL) {
+ if (id == NULL) {
+ object_init_ex(return_value,
xmlreader_class_entry);
+ intern = (xmlreader_object
*)zend_objects_get_address(return_value TSRMLS_CC);
+ } else {
+ RETVAL_TRUE;
+ }
+ intern->input = inputbfr;
intern->ptr = reader;
return;
- } else {
- intern->ptr = reader;
- RETURN_TRUE;
}
}
+ if (inputbfr) {
+ xmlFreeParserInputBuffer(inputbfr);
+ }
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unable to load source
data");
RETURN_FALSE;
}
http://cvs.php.net/viewcvs.cgi/php-src/ext/xmlreader/php_xmlreader.h?r1=1.6&r2=1.7&diff_format=u
Index: php-src/ext/xmlreader/php_xmlreader.h
diff -u php-src/ext/xmlreader/php_xmlreader.h:1.6
php-src/ext/xmlreader/php_xmlreader.h:1.7
--- php-src/ext/xmlreader/php_xmlreader.h:1.6 Sun Jan 1 13:09:56 2006
+++ php-src/ext/xmlreader/php_xmlreader.h Wed May 10 11:58:56 2006
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_xmlreader.h,v 1.6 2006/01/01 13:09:56 sniper Exp $ */
+/* $Id: php_xmlreader.h,v 1.7 2006/05/10 11:58:56 rrichards Exp $ */
#ifndef PHP_XMLREADER_H
#define PHP_XMLREADER_H
@@ -40,6 +40,8 @@
typedef struct _xmlreader_object {
zend_object std;
xmlTextReaderPtr ptr;
+ /* strings must be set in input buffer as copy is required */
+ xmlParserInputBufferPtr input;
void *schema;
HashTable *prop_handler;
zend_object_handle handle;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php