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

Reply via email to