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