Diff for /embedaddon/php/ext/libxml/libxml.c between versions 1.1.1.1 and 1.1.1.2

version 1.1.1.1, 2012/02/21 23:47:57 version 1.1.1.2, 2012/05/29 12:34:40
Line 26 Line 26
 #endif  #endif
   
 #include "php.h"  #include "php.h"
   #include "SAPI.h"
   
 #define PHP_XML_INTERNAL  #define PHP_XML_INTERNAL
 #include "zend_variables.h"  #include "zend_variables.h"
Line 53 Line 54
   
 /* a true global for initialization */  /* a true global for initialization */
 static int _php_libxml_initialized = 0;  static int _php_libxml_initialized = 0;
   static int _php_libxml_per_request_initialization = 1;
   static xmlExternalEntityLoader _php_libxml_default_entity_loader;
   
 typedef struct _php_libxml_func_handler {  typedef struct _php_libxml_func_handler {
         php_libxml_export_node export_func;          php_libxml_export_node export_func;
Line 68  static PHP_FUNCTION(libxml_use_internal_errors); Line 71  static PHP_FUNCTION(libxml_use_internal_errors);
 static PHP_FUNCTION(libxml_get_last_error);  static PHP_FUNCTION(libxml_get_last_error);
 static PHP_FUNCTION(libxml_clear_errors);  static PHP_FUNCTION(libxml_clear_errors);
 static PHP_FUNCTION(libxml_get_errors);  static PHP_FUNCTION(libxml_get_errors);
   static PHP_FUNCTION(libxml_set_external_entity_loader);
 static PHP_FUNCTION(libxml_disable_entity_loader);  static PHP_FUNCTION(libxml_disable_entity_loader);
   
 static zend_class_entry *libxmlerror_class_entry;  static zend_class_entry *libxmlerror_class_entry;
Line 82  ZEND_GET_MODULE(libxml) Line 86  ZEND_GET_MODULE(libxml)
 static PHP_MINIT_FUNCTION(libxml);  static PHP_MINIT_FUNCTION(libxml);
 static PHP_RINIT_FUNCTION(libxml);  static PHP_RINIT_FUNCTION(libxml);
 static PHP_MSHUTDOWN_FUNCTION(libxml);  static PHP_MSHUTDOWN_FUNCTION(libxml);
 static PHP_RSHUTDOWN_FUNCTION(libxml);  
 static PHP_MINFO_FUNCTION(libxml);  static PHP_MINFO_FUNCTION(libxml);
   static int php_libxml_post_deactivate();
   
 /* }}} */  /* }}} */
   
Line 109  ZEND_BEGIN_ARG_INFO_EX(arginfo_libxml_disable_entity_l Line 113  ZEND_BEGIN_ARG_INFO_EX(arginfo_libxml_disable_entity_l
         ZEND_ARG_INFO(0, disable)          ZEND_ARG_INFO(0, disable)
 ZEND_END_ARG_INFO()  ZEND_END_ARG_INFO()
   
   ZEND_BEGIN_ARG_INFO_EX(arginfo_libxml_set_external_entity_loader, 0, 0, 1)
           ZEND_ARG_INFO(0, resolver_function)
   ZEND_END_ARG_INFO()
 /* }}} */  /* }}} */
   
 /* {{{ extension definition structures */  /* {{{ extension definition structures */
Line 119  static const zend_function_entry libxml_functions[] =  Line 126  static const zend_function_entry libxml_functions[] = 
         PHP_FE(libxml_clear_errors, arginfo_libxml_clear_errors)          PHP_FE(libxml_clear_errors, arginfo_libxml_clear_errors)
         PHP_FE(libxml_get_errors, arginfo_libxml_get_errors)          PHP_FE(libxml_get_errors, arginfo_libxml_get_errors)
         PHP_FE(libxml_disable_entity_loader, arginfo_libxml_disable_entity_loader)          PHP_FE(libxml_disable_entity_loader, arginfo_libxml_disable_entity_loader)
           PHP_FE(libxml_set_external_entity_loader, arginfo_libxml_set_external_entity_loader)
         PHP_FE_END          PHP_FE_END
 };  };
   
Line 129  zend_module_entry libxml_module_entry = { Line 137  zend_module_entry libxml_module_entry = {
         PHP_MINIT(libxml),       /* extension-wide startup function */          PHP_MINIT(libxml),       /* extension-wide startup function */
         PHP_MSHUTDOWN(libxml),   /* extension-wide shutdown function */          PHP_MSHUTDOWN(libxml),   /* extension-wide shutdown function */
         PHP_RINIT(libxml),       /* per-request startup function */          PHP_RINIT(libxml),       /* per-request startup function */
        PHP_RSHUTDOWN(libxml),   /* per-request shutdown function */        NULL,                    /* per-request shutdown function */
         PHP_MINFO(libxml),       /* information function */          PHP_MINFO(libxml),       /* information function */
         NO_VERSION_YET,          NO_VERSION_YET,
         PHP_MODULE_GLOBALS(libxml), /* globals descriptor */          PHP_MODULE_GLOBALS(libxml), /* globals descriptor */
         PHP_GINIT(libxml),          /* globals ctor */          PHP_GINIT(libxml),          /* globals ctor */
         NULL,                       /* globals dtor */          NULL,                       /* globals dtor */
        NULL,                       /* post deactivate */        php_libxml_post_deactivate, /* post deactivate */
         STANDARD_MODULE_PROPERTIES_EX          STANDARD_MODULE_PROPERTIES_EX
 };  };
   
Line 261  static PHP_GINIT_FUNCTION(libxml) Line 269  static PHP_GINIT_FUNCTION(libxml)
         libxml_globals->stream_context = NULL;          libxml_globals->stream_context = NULL;
         libxml_globals->error_buffer.c = NULL;          libxml_globals->error_buffer.c = NULL;
         libxml_globals->error_list = NULL;          libxml_globals->error_list = NULL;
           libxml_globals->entity_loader.fci.size = 0;
 }  }
   
   static void _php_libxml_destroy_fci(zend_fcall_info *fci)
   {
           if (fci->size > 0) {
                   zval_ptr_dtor(&fci->function_name);
                   if (fci->object_ptr != NULL) {
                           zval_ptr_dtor(&fci->object_ptr);
                   }
                   fci->size = 0;
           }
   }
   
 /* Channel libxml file io layer through the PHP streams subsystem.  /* Channel libxml file io layer through the PHP streams subsystem.
  * This allows use of ftps:// and https:// urls */   * This allows use of ftps:// and https:// urls */
   
Line 278  static void *php_libxml_streams_IO_open_wrapper(const  Line 298  static void *php_libxml_streams_IO_open_wrapper(const 
   
         TSRMLS_FETCH();          TSRMLS_FETCH();
   
        uri = xmlParseURI((xmlChar *)filename);        uri = xmlParseURI(filename);
        if (uri && (uri->scheme == NULL || (xmlStrncmp(uri->scheme, "file", 4) == 0))) {        if (uri && (uri->scheme == NULL ||
                         (xmlStrncmp(BAD_CAST uri->scheme, BAD_CAST "file", 4) == 0))) {
                 resolved_path = xmlURIUnescapeString(filename, 0, NULL);                  resolved_path = xmlURIUnescapeString(filename, 0, NULL);
                 isescaped = 1;                  isescaped = 1;
         } else {          } else {
Line 300  static void *php_libxml_streams_IO_open_wrapper(const  Line 321  static void *php_libxml_streams_IO_open_wrapper(const 
            that the streams layer puts out at times, but for libxml we             that the streams layer puts out at times, but for libxml we
            may try to open files that don't exist, but it is not a failure             may try to open files that don't exist, but it is not a failure
            in xml processing (eg. DTD files)  */             in xml processing (eg. DTD files)  */
        wrapper = php_stream_locate_url_wrapper(resolved_path, &path_to_open, ENFORCE_SAFE_MODE TSRMLS_CC);        wrapper = php_stream_locate_url_wrapper(resolved_path, &path_to_open, 0 TSRMLS_CC);
         if (wrapper && read_only && wrapper->wops->url_stat) {          if (wrapper && read_only && wrapper->wops->url_stat) {
                 if (wrapper->wops->url_stat(wrapper, path_to_open, PHP_STREAM_URL_STAT_QUIET, &ssbuf, NULL TSRMLS_CC) == -1) {                  if (wrapper->wops->url_stat(wrapper, path_to_open, PHP_STREAM_URL_STAT_QUIET, &ssbuf, NULL TSRMLS_CC) == -1) {
                         if (isescaped) {                          if (isescaped) {
Line 311  static void *php_libxml_streams_IO_open_wrapper(const  Line 332  static void *php_libxml_streams_IO_open_wrapper(const 
         }          }
   
         context = php_stream_context_from_zval(LIBXML(stream_context), 0);          context = php_stream_context_from_zval(LIBXML(stream_context), 0);
        
        ret_val = php_stream_open_wrapper_ex(path_to_open, (char *)mode, ENFORCE_SAFE_MODE|REPORT_ERRORS, NULL, context);        ret_val = php_stream_open_wrapper_ex(path_to_open, (char *)mode, REPORT_ERRORS, NULL, context);
         if (isescaped) {          if (isescaped) {
                 xmlFree(resolved_path);                  xmlFree(resolved_path);
         }          }
Line 528  static void php_libxml_internal_error_handler(int erro Line 549  static void php_libxml_internal_error_handler(int erro
         }          }
 }  }
   
   static xmlParserInputPtr _php_libxml_external_entity_loader(const char *URL,
                   const char *ID, xmlParserCtxtPtr context)
   {
           xmlParserInputPtr       ret                     = NULL;
           const char                      *resource       = NULL;
           zval                            *public         = NULL,
                                                   *system         = NULL,
                                                   *ctxzv          = NULL,
                                                   **params[]      = {&public, &system, &ctxzv},
                                                   *retval_ptr     = NULL;
           int                                     retval;
           zend_fcall_info         *fci;
           TSRMLS_FETCH();
   
           fci = &LIBXML(entity_loader).fci;
           
           if (fci->size == 0) {
                   /* no custom user-land callback set up; delegate to original loader */
                   return _php_libxml_default_entity_loader(URL, ID, context);
           }
   
           ALLOC_INIT_ZVAL(public);
           if (ID != NULL) {
                   ZVAL_STRING(public, ID, 1);
           }
           ALLOC_INIT_ZVAL(system);
           if (URL != NULL) {
                   ZVAL_STRING(system, URL, 1);
           }
           MAKE_STD_ZVAL(ctxzv);
           array_init_size(ctxzv, 4);
   
   #define ADD_NULL_OR_STRING_KEY(memb) \
           if (context->memb == NULL) { \
                   add_assoc_null_ex(ctxzv, #memb, sizeof(#memb)); \
           } else { \
                   add_assoc_string_ex(ctxzv, #memb, sizeof(#memb), \
                                   (char *)context->memb, 1); \
           }
           
           ADD_NULL_OR_STRING_KEY(directory)
           ADD_NULL_OR_STRING_KEY(intSubName)
           ADD_NULL_OR_STRING_KEY(extSubURI)
           ADD_NULL_OR_STRING_KEY(extSubSystem)
           
   #undef ADD_NULL_OR_STRING_KEY
           
           fci->retval_ptr_ptr     = &retval_ptr;
           fci->params                     = params;
           fci->param_count        = sizeof(params)/sizeof(*params);
           fci->no_separation      = 1;
           
           retval = zend_call_function(fci, &LIBXML(entity_loader).fcc TSRMLS_CC);
           if (retval != SUCCESS || fci->retval_ptr_ptr == NULL) {
                   php_libxml_ctx_error(context,
                                   "Call to user entity loader callback '%s' has failed",
                                   fci->function_name);
           } else {
                   retval_ptr = *fci->retval_ptr_ptr;
                   if (retval_ptr == NULL) {
                           php_libxml_ctx_error(context,
                                           "Call to user entity loader callback '%s' has failed; "
                                           "probably it has thrown an exception",
                                           fci->function_name);
                   } else if (Z_TYPE_P(retval_ptr) == IS_STRING) {
   is_string:
                           resource = Z_STRVAL_P(retval_ptr);
                   } else if (Z_TYPE_P(retval_ptr) == IS_RESOURCE) {
                           php_stream *stream;
                           php_stream_from_zval_no_verify(stream, &retval_ptr);
                           if (stream == NULL) {
                                   php_libxml_ctx_error(context,
                                                   "The user entity loader callback '%s' has returned a "
                                                   "resource, but it is not a stream",
                                                   fci->function_name);
                           } else {
                                   /* TODO: allow storing the encoding in the stream context? */
                                   xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
                                   xmlParserInputBufferPtr pib = xmlAllocParserInputBuffer(enc);
                                   if (pib == NULL) {
                                           php_libxml_ctx_error(context, "Could not allocate parser "
                                                           "input buffer");
                                   } else {
                                           /* make stream not being closed when the zval is freed */
                                           zend_list_addref(stream->rsrc_id);
                                           pib->context = stream;
                                           pib->readcallback = php_libxml_streams_IO_read;
                                           pib->closecallback = php_libxml_streams_IO_close;
                                           
                                           ret = xmlNewIOInputStream(context, pib, enc);
                                           if (ret == NULL) {
                                                   xmlFreeParserInputBuffer(pib);
                                           }
                                   }
                           }
                   } else if (Z_TYPE_P(retval_ptr) != IS_NULL) {
                           /* retval not string nor resource nor null; convert to string */
                           SEPARATE_ZVAL(&retval_ptr);
                           convert_to_string(retval_ptr);
                           goto is_string;
                   } /* else is null; don't try anything */
           }
   
           if (ret == NULL) {
                   if (resource == NULL) {
                           if (ID == NULL) {
                                   ID = "NULL";
                           }
                           php_libxml_ctx_error(context,
                                           "Failed to load external entity \"%s\"\n", ID);
                   } else {
                           /* we got the resource in the form of a string; open it */
                           ret = xmlNewInputFromFile(context, resource);
                   }
           }
   
           zval_ptr_dtor(&public);
           zval_ptr_dtor(&system);
           zval_ptr_dtor(&ctxzv);
           if (retval_ptr != NULL) {
                   zval_ptr_dtor(&retval_ptr);
           }
           return ret;
   }
   
   static xmlParserInputPtr _php_libxml_pre_ext_ent_loader(const char *URL,
                   const char *ID, xmlParserCtxtPtr context)
   {
           /* Check whether we're running in a PHP context, since the entity loader
            * we've defined is an application level (true global) setting */
           if (xmlGenericError == php_libxml_error_handler) {
                   return _php_libxml_external_entity_loader(URL, ID, context);
           } else {
                   return _php_libxml_default_entity_loader(URL, ID, context);
           }
   }
   
 PHP_LIBXML_API void php_libxml_ctx_error(void *ctx, const char *msg, ...)  PHP_LIBXML_API void php_libxml_ctx_error(void *ctx, const char *msg, ...)
 {  {
         va_list args;          va_list args;
Line 565  PHP_LIBXML_API void php_libxml_initialize(void) Line 723  PHP_LIBXML_API void php_libxml_initialize(void)
         if (!_php_libxml_initialized) {          if (!_php_libxml_initialized) {
                 /* we should be the only one's to ever init!! */                  /* we should be the only one's to ever init!! */
                 xmlInitParser();                  xmlInitParser();
                   
                   _php_libxml_default_entity_loader = xmlGetExternalEntityLoader();
                   xmlSetExternalEntityLoader(_php_libxml_pre_ext_ent_loader);
   
                 zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1);                  zend_hash_init(&php_libxml_exports, 0, NULL, NULL, 1);
   
Line 580  PHP_LIBXML_API void php_libxml_shutdown(void) Line 741  PHP_LIBXML_API void php_libxml_shutdown(void)
 #endif  #endif
                 xmlCleanupParser();                  xmlCleanupParser();
                 zend_hash_destroy(&php_libxml_exports);                  zend_hash_destroy(&php_libxml_exports);
                   
                   xmlSetExternalEntityLoader(_php_libxml_default_entity_loader);
                 _php_libxml_initialized = 0;                  _php_libxml_initialized = 0;
         }          }
 }  }
Line 616  static PHP_MINIT_FUNCTION(libxml) Line 779  static PHP_MINIT_FUNCTION(libxml)
         REGISTER_LONG_CONSTANT("LIBXML_NSCLEAN",        XML_PARSE_NSCLEAN,              CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_NSCLEAN",        XML_PARSE_NSCLEAN,              CONST_CS | CONST_PERSISTENT);
         REGISTER_LONG_CONSTANT("LIBXML_NOCDATA",        XML_PARSE_NOCDATA,              CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_NOCDATA",        XML_PARSE_NOCDATA,              CONST_CS | CONST_PERSISTENT);
         REGISTER_LONG_CONSTANT("LIBXML_NONET",          XML_PARSE_NONET,                CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_NONET",          XML_PARSE_NONET,                CONST_CS | CONST_PERSISTENT);
           REGISTER_LONG_CONSTANT("LIBXML_PEDANTIC",       XML_PARSE_PEDANTIC,             CONST_CS | CONST_PERSISTENT);
 #if LIBXML_VERSION >= 20621  #if LIBXML_VERSION >= 20621
         REGISTER_LONG_CONSTANT("LIBXML_COMPACT",        XML_PARSE_COMPACT,              CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_COMPACT",        XML_PARSE_COMPACT,              CONST_CS | CONST_PERSISTENT);
         REGISTER_LONG_CONSTANT("LIBXML_NOXMLDECL",      XML_SAVE_NO_DECL,               CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_NOXMLDECL",      XML_SAVE_NO_DECL,               CONST_CS | CONST_PERSISTENT);
Line 625  static PHP_MINIT_FUNCTION(libxml) Line 789  static PHP_MINIT_FUNCTION(libxml)
 #endif  #endif
         REGISTER_LONG_CONSTANT("LIBXML_NOEMPTYTAG",     LIBXML_SAVE_NOEMPTYTAG, CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_NOEMPTYTAG",     LIBXML_SAVE_NOEMPTYTAG, CONST_CS | CONST_PERSISTENT);
   
           /* Additional constants for use with loading html */
   #if LIBXML_VERSION >= 20707
           REGISTER_LONG_CONSTANT("LIBXML_HTML_NOIMPLIED", HTML_PARSE_NOIMPLIED,           CONST_CS | CONST_PERSISTENT);
   #endif
   
   #if LIBXML_VERSION >= 20708
           REGISTER_LONG_CONSTANT("LIBXML_HTML_NODEFDTD",  HTML_PARSE_NODEFDTD,            CONST_CS | CONST_PERSISTENT);
   #endif
   
         /* Error levels */          /* Error levels */
         REGISTER_LONG_CONSTANT("LIBXML_ERR_NONE",               XML_ERR_NONE,           CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_ERR_NONE",               XML_ERR_NONE,           CONST_CS | CONST_PERSISTENT);
         REGISTER_LONG_CONSTANT("LIBXML_ERR_WARNING",    XML_ERR_WARNING,        CONST_CS | CONST_PERSISTENT);          REGISTER_LONG_CONSTANT("LIBXML_ERR_WARNING",    XML_ERR_WARNING,        CONST_CS | CONST_PERSISTENT);
Line 634  static PHP_MINIT_FUNCTION(libxml) Line 807  static PHP_MINIT_FUNCTION(libxml)
         INIT_CLASS_ENTRY(ce, "LibXMLError", NULL);          INIT_CLASS_ENTRY(ce, "LibXMLError", NULL);
         libxmlerror_class_entry = zend_register_internal_class(&ce TSRMLS_CC);          libxmlerror_class_entry = zend_register_internal_class(&ce TSRMLS_CC);
   
           if (sapi_module.name) {
                   static const char * const supported_sapis[] = {
                           "cgi-fcgi",
                           "fpm-fcgi",
                           "litespeed",
                           NULL
                   };
                   const char * const *sapi_name;
   
                   for (sapi_name = supported_sapis; *sapi_name; sapi_name++) {
                           if (strcmp(sapi_module.name, *sapi_name) == 0) {
                                   _php_libxml_per_request_initialization = 0;
                                   break;
                           }
                   }
           }
   
           if (!_php_libxml_per_request_initialization) {
                   /* report errors via handler rather than stderr */
                   xmlSetGenericErrorFunc(NULL, php_libxml_error_handler);
                   xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename);
                   xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename);
           }
           
         return SUCCESS;          return SUCCESS;
 }  }
   
   
 static PHP_RINIT_FUNCTION(libxml)  static PHP_RINIT_FUNCTION(libxml)
 {  {
        /* report errors via handler rather than stderr */        if (_php_libxml_per_request_initialization) {
        xmlSetGenericErrorFunc(NULL, php_libxml_error_handler);                /* report errors via handler rather than stderr */
        xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename);                xmlSetGenericErrorFunc(NULL, php_libxml_error_handler);
        xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename);                xmlParserInputBufferCreateFilenameDefault(php_libxml_input_buffer_create_filename);
                 xmlOutputBufferCreateFilenameDefault(php_libxml_output_buffer_create_filename);
         }
         return SUCCESS;          return SUCCESS;
 }  }
   
   
 static PHP_MSHUTDOWN_FUNCTION(libxml)  static PHP_MSHUTDOWN_FUNCTION(libxml)
 {  {
           if (!_php_libxml_per_request_initialization) {
                   xmlSetGenericErrorFunc(NULL, NULL);
                   xmlSetStructuredErrorFunc(NULL, NULL);
   
                   xmlParserInputBufferCreateFilenameDefault(NULL);
                   xmlOutputBufferCreateFilenameDefault(NULL);
           }
         php_libxml_shutdown();          php_libxml_shutdown();
   
         return SUCCESS;          return SUCCESS;
 }  }
   
static int php_libxml_post_deactivate()
static PHP_RSHUTDOWN_FUNCTION(libxml) 
 {  {
           TSRMLS_FETCH();
         /* reset libxml generic error handling */          /* reset libxml generic error handling */
        xmlSetGenericErrorFunc(NULL, NULL);        if (_php_libxml_per_request_initialization) {
        xmlSetStructuredErrorFunc(NULL, NULL);                xmlSetGenericErrorFunc(NULL, NULL);
                 xmlSetStructuredErrorFunc(NULL, NULL);
   
        xmlParserInputBufferCreateFilenameDefault(NULL);                xmlParserInputBufferCreateFilenameDefault(NULL);
        xmlOutputBufferCreateFilenameDefault(NULL);                xmlOutputBufferCreateFilenameDefault(NULL);
         }
   
         if (LIBXML(stream_context)) {          if (LIBXML(stream_context)) {
                 zval_ptr_dtor(&LIBXML(stream_context));                  zval_ptr_dtor(&LIBXML(stream_context));
Line 676  static PHP_RSHUTDOWN_FUNCTION(libxml) Line 884  static PHP_RSHUTDOWN_FUNCTION(libxml)
                 LIBXML(error_list) = NULL;                  LIBXML(error_list) = NULL;
         }          }
         xmlResetLastError();          xmlResetLastError();
           
           _php_libxml_destroy_fci(&LIBXML(entity_loader).fci);
   
         return SUCCESS;          return SUCCESS;
 }  }
Line 855  static PHP_FUNCTION(libxml_disable_entity_loader) Line 1065  static PHP_FUNCTION(libxml_disable_entity_loader)
         }          }
   
         RETURN_FALSE;          RETURN_FALSE;
   }
   /* }}} */
   
   /* {{{ proto void libxml_set_external_entity_loader(callback resolver_function) 
      Changes the default external entity loader */
   static PHP_FUNCTION(libxml_set_external_entity_loader)
   {
           zend_fcall_info                 fci;
           zend_fcall_info_cache   fcc;
           if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "f!", &fci, &fcc)
                           == FAILURE) {
                   return;
           }
           
           _php_libxml_destroy_fci(&LIBXML(entity_loader).fci);
           
           if (fci.size > 0) { /* argument not null */
                   LIBXML(entity_loader).fci = fci;
                   Z_ADDREF_P(fci.function_name);
                   if (fci.object_ptr != NULL) {
                           Z_ADDREF_P(fci.object_ptr);
                   }
                   LIBXML(entity_loader).fcc = fcc;
           }
           
           RETURN_TRUE;
 }  }
 /* }}} */  /* }}} */
   

Removed from v.1.1.1.1  
changed lines
  Added in v.1.1.1.2


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>