diff options
-rw-r--r-- | ext/dom/document.c | 37 |
1 files changed, 28 insertions, 9 deletions
diff --git a/ext/dom/document.c b/ext/dom/document.c index 7b357b750e..7f4d768356 100644 --- a/ext/dom/document.c +++ b/ext/dom/document.c @@ -1207,11 +1207,12 @@ PHP_FUNCTION(dom_document_document) static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC) { xmlDocPtr ret; xmlParserCtxtPtr ctxt; - char *directory = NULL; dom_doc_props *doc_props; dom_object *intern; dom_ref_obj *document = NULL; int validate, resolve_externals, keep_blanks, substitute_ent; + int resolved_path_len; + char *directory=NULL, resolved_path[MAXPATHLEN]; if (id != NULL) { intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC); @@ -1231,7 +1232,8 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC) xmlInitParser(); if (mode == DOM_LOAD_FILE) { - ctxt = xmlCreateFileParserCtxt(source); + expand_filepath(source, resolved_path TSRMLS_CC); + ctxt = xmlCreateFileParserCtxt(resolved_path); } else { ctxt = xmlCreateDocParserCtxt(source); } @@ -1240,11 +1242,24 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC) return(NULL); } - if (mode == DOM_LOAD_FILE) { - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory(source); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = (char *) xmlStrdup((xmlChar *) directory); + /* If loading from memory, we need to set the base directory for the document */ + if (mode != DOM_LOAD_FILE) { + #if HAVE_GETCWD + directory = VCWD_GETCWD(resolved_path, MAXPATHLEN); + #elif HAVE_GETWD + directory = VCWD_GETWD(resolved_path); + #endif + if (directory) { + if(ctxt->directory != NULL) { + xmlFree((char *) ctxt->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'; + } + ctxt->directory = (char *) xmlCanonicPath((const xmlChar *) resolved_path); + } } ctxt->recovery = 0; @@ -1261,9 +1276,13 @@ static xmlDocPtr dom_document_parser(zval *id, int mode, char *source TSRMLS_DC) xmlParseDocument(ctxt); - if (ctxt->wellFormed) + if (ctxt->wellFormed) { ret = ctxt->myDoc; - else { + /* If loading from memory, set the base reference uri for the document */ + if (ret->URL == NULL && ctxt->directory != NULL) { + ret->URL = xmlStrdup(ctxt->directory); + } + } else { ret = NULL; xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL; |