]> granicus.if.org Git - php/commitdiff
interoperability support
authorRob Richards <rrichards@php.net>
Sat, 14 Jun 2003 15:32:23 +0000 (15:32 +0000)
committerRob Richards <rrichards@php.net>
Sat, 14 Jun 2003 15:32:23 +0000 (15:32 +0000)
fix some memleak scenarios

ext/simplexml/php_simplexml.h
ext/simplexml/simplexml.c

index b57ad28ce6e7040afe341b838bc159e37f756230..233452dafa0c1c4f865e93f7c5d78c2f17a2101d 100644 (file)
@@ -26,8 +26,10 @@ extern zend_module_entry simplexml_module_entry;
 
 #ifdef PHP_WIN32
 #define PHP_SIMPLEXML_API __declspec(dllexport)
+#define SIMPLEXML_IMPORT __declspec(dllimport)
 #else
 #define PHP_SIMPLEXML_API
+#define SIMPLEXML_IMPORT extern
 #endif
 
 #ifdef ZTS
@@ -58,10 +60,10 @@ typedef struct {
 
 typedef struct {
        zend_object zo;
-       xmlHashTablePtr nsmap;
+       xmlNodePtr node;
        simplexml_ref_obj *document;
+       xmlHashTablePtr nsmap;
        xmlXPathContextPtr xpath;
-       xmlNodePtr node;
 } php_sxe_object;
 
 
index 72277fa7276a6c83fb1c8ba631b3ad335b603894..367010454b0381c32702f8905288585a79830bf2 100644 (file)
@@ -28,6 +28,7 @@
 #include "php_simplexml.h"
 
 zend_class_entry *sxe_class_entry;
+SIMPLEXML_IMPORT int xml_parser_inited;
 
 #define SKIP_TEXT(__p) \
        if ((__p)->type == XML_TEXT_NODE) { \
@@ -154,7 +155,6 @@ sxe_property_read(zval *object, zval *member TSRMLS_DC)
 
                if (!xmlStrcmp(node->name, name)) {
                        APPEND_PREV_ELEMENT(counter, value);
                        MAKE_STD_ZVAL(value);
                        _node_as_zval(sxe, node, value TSRMLS_CC);
                        value->refcount = 0;
@@ -912,20 +912,23 @@ PHP_FUNCTION(simplexml_load_file)
        php_sxe_object *sxe;
        char           *filename;
        int             filename_len;
+       xmlDocPtr       docp;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, &filename_len) == FAILURE) {
                return;
        }
 
+       docp = xmlParseFile(filename);
+       if (! docp) {
+               RETURN_FALSE;
+       }
+
        sxe = php_sxe_object_new(TSRMLS_C);
        sxe->document = emalloc(sizeof(simplexml_ref_obj));
-       sxe->document->ptr = (void *) xmlParseFile(filename);
+       sxe->document->ptr = docp;
        sxe->document->refcount = 1;
-       if (sxe->document->ptr == NULL) {
-               efree(sxe->document);
-               RETURN_FALSE;
-       }
        sxe->nsmap = xmlHashCreate(10);
+       sxe->node = NULL;
        
 
        return_value->type = IS_OBJECT;
@@ -940,20 +943,23 @@ PHP_FUNCTION(simplexml_load_string)
        php_sxe_object *sxe;
        char           *data;
        int             data_len;
+       xmlDocPtr       docp;
 
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &data, &data_len) == FAILURE) {
                return;
        }
 
+       docp = xmlParseMemory(data, data_len);
+       if (! docp) {
+               RETURN_FALSE;
+       }
+
        sxe = php_sxe_object_new(TSRMLS_C);
        sxe->document = emalloc(sizeof(simplexml_ref_obj));
        sxe->document->refcount = 1;
-       sxe->document->ptr = xmlParseMemory(data, data_len);
-       if (sxe->document->ptr == NULL) {
-               efree(sxe->document);
-               RETURN_FALSE;
-       }
+       sxe->document->ptr = docp;
        sxe->nsmap = xmlHashCreate(10);
+       sxe->node = NULL;
 
        return_value->type = IS_OBJECT;
        return_value->value.obj = php_sxe_register_object(sxe TSRMLS_CC);
@@ -993,6 +999,11 @@ PHP_MINIT_FUNCTION(simplexml)
        sxe.create_object = sxe_object_new;
        sxe_class_entry = zend_register_internal_class(&sxe TSRMLS_CC);
 
+       if (!xml_parser_inited) {
+               xmlInitThreads();
+               xml_parser_inited = 1;
+       }
+
        return SUCCESS;
 }
 /* }}} */
@@ -1001,7 +1012,11 @@ PHP_MINIT_FUNCTION(simplexml)
  */
 PHP_MSHUTDOWN_FUNCTION(simplexml)
 {
-       xmlCleanupParser();
+       if (xml_parser_inited) {
+               xmlCleanupParser();
+               xml_parser_inited = 0;
+       }
+
        return SUCCESS;
 }
 /* }}} */