From cacbe5d110d469463edb0dd8e11e493daaf3dbc4 Mon Sep 17 00:00:00 2001 From: Daniel Veillard Date: Fri, 10 Jan 2003 16:09:51 +0000 Subject: [PATCH] patch from Stefano Zacchiroli to fix some URI/file escaping problems * nanoftp.c nanohttp.c xmlIO.c: patch from Stefano Zacchiroli to fix some URI/file escaping problems Daniel --- ChangeLog | 5 ++++ nanoftp.c | 8 +++++- nanohttp.c | 9 +------ xmlIO.c | 71 ++++++++++++++++++++++++++++++++++++------------------ 4 files changed, 60 insertions(+), 33 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6ff34b74..a1ebbc3a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Fri Jan 10 17:07:01 CET 2003 Daniel Veillard + + * nanoftp.c nanohttp.c xmlIO.c: patch from Stefano Zacchiroli + to fix some URI/file escaping problems + Fri Jan 10 16:20:34 CET 2003 Daniel Veillard * python/generator.py: fixed a bug raised by Raymond Wiker, diff --git a/nanoftp.c b/nanoftp.c index d3c1e28c..a179deb9 100644 --- a/nanoftp.c +++ b/nanoftp.c @@ -59,6 +59,7 @@ #include #include #include +#include #include #include @@ -496,6 +497,7 @@ xmlNanoFTPScanProxy(const char *URL) { void* xmlNanoFTPNewCtxt(const char *URL) { xmlNanoFTPCtxtPtr ret; + char *unescaped; ret = (xmlNanoFTPCtxtPtr) xmlMalloc(sizeof(xmlNanoFTPCtxt)); if (ret == NULL) return(NULL); @@ -508,8 +510,12 @@ xmlNanoFTPNewCtxt(const char *URL) { ret->controlBufUsed = 0; ret->controlFd = -1; - if (URL != NULL) + unescaped = xmlURIUnescapeString(URL, 0, NULL); + if (unescaped != NULL) + xmlNanoFTPScanURL(ret, unescaped); + else if (URL != NULL) xmlNanoFTPScanURL(ret, URL); + xmlFree(unescaped); return(ret); } diff --git a/nanohttp.c b/nanohttp.c index 614fab75..376660bc 100644 --- a/nanohttp.c +++ b/nanohttp.c @@ -372,7 +372,6 @@ xmlNanoHTTPScanProxy(const char *URL) { static xmlNanoHTTPCtxtPtr xmlNanoHTTPNewCtxt(const char *URL) { xmlNanoHTTPCtxtPtr ret; - xmlChar *escaped; ret = (xmlNanoHTTPCtxtPtr) xmlMalloc(sizeof(xmlNanoHTTPCtxt)); if (ret == NULL) return(NULL); @@ -383,13 +382,7 @@ xmlNanoHTTPNewCtxt(const char *URL) { ret->fd = -1; ret->ContentLength = -1; - escaped = xmlURIEscapeStr(BAD_CAST URL, BAD_CAST"@/:=?;#%&"); - if (escaped != NULL) { - xmlNanoHTTPScanURL(ret, (const char *) escaped); - xmlFree(escaped); - } else { - xmlNanoHTTPScanURL(ret, URL); - } + xmlNanoHTTPScanURL(ret, URL); return(ret); } diff --git a/xmlIO.c b/xmlIO.c index 96073224..fa6f37db 100644 --- a/xmlIO.c +++ b/xmlIO.c @@ -339,7 +339,7 @@ xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) { } /** - * xmlFileOpen: + * xmlFileOpen_real: * @filename: the URI for matching * * input from FILE *, supports compressed input @@ -347,8 +347,8 @@ xmlFileMatch (const char *filename ATTRIBUTE_UNUSED) { * * Returns an I/O context or NULL in case of error */ -void * -xmlFileOpen (const char *filename) { +static void * +xmlFileOpen_real (const char *filename) { const char *path = NULL; FILE *fd; @@ -385,6 +385,27 @@ xmlFileOpen (const char *filename) { return((void *) fd); } +/** + * xmlFileOpen: + * @filename: the URI for matching + * + * Wrapper around xmlFileOpen_real that try it with an unescaped + * version of @filename, if this fails fallback to @filename + */ +void * +xmlFileOpen (const char *filename) { + char *unescaped; + void *retval; + unescaped = xmlURIUnescapeString(filename, 0, NULL); + if (unescaped != NULL) { + retval = xmlFileOpen_real(unescaped); + } else { + retval = xmlFileOpen_real(filename); + } + xmlFree(unescaped); + return retval; +} + /** * xmlFileOpenW: * @filename: the URI for matching @@ -513,7 +534,7 @@ xmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) { } /** - * xmlGzfileOpen: + * xmlGzfileOpen_real: * @filename: the URI for matching * * input from compressed file open @@ -522,7 +543,7 @@ xmlGzfileMatch (const char *filename ATTRIBUTE_UNUSED) { * Returns an I/O context or NULL in case of error */ static void * -xmlGzfileOpen (const char *filename) { +xmlGzfileOpen_real (const char *filename) { const char *path = NULL; gzFile fd; @@ -555,6 +576,27 @@ xmlGzfileOpen (const char *filename) { return((void *) fd); } +/** + * xmlGzfileOpen: + * @filename: the URI for matching + * + * Wrapper around xmlGzfileOpen that try it with an unescaped + * version of @filename, if this fails fallback to @filename + */ +static void * +xmlGzfileOpen (const char *filename) { + char *unescaped; + void *retval; + unescaped = xmlURIUnescapeString(filename, 0, NULL); + if (unescaped != NULL) { + retval = xmlGzfileOpen_real(unescaped); + } else { + retval = xmlGzfileOpen_real(filename); + } + xmlFree(unescaped); + return retval; +} + /** * xmlGzfileOpenW: * @filename: the URI for matching @@ -1724,7 +1766,6 @@ xmlParserInputBufferCreateFilename xmlParserInputBufferPtr ret; int i = 0; void *context = NULL; - char *unescaped; char *normalized; if (xmlInputCallbackInitialized == 0) @@ -1740,24 +1781,6 @@ xmlParserInputBufferCreateFilename /* * Try to find one of the input accept method accepting that scheme * Go in reverse to give precedence to user defined handlers. - * try with an unescaped version of the URI - */ - unescaped = xmlURIUnescapeString((char *) normalized, 0, NULL); - if (unescaped != NULL) { - for (i = xmlInputCallbackNr - 1;i >= 0;i--) { - if ((xmlInputCallbackTable[i].matchcallback != NULL) && - (xmlInputCallbackTable[i].matchcallback(unescaped) != 0)) { - context = xmlInputCallbackTable[i].opencallback(unescaped); - if (context != NULL) - break; - } - } - xmlFree(unescaped); - } - - /* - * If this failed try with a non-escaped URI this may be a strange - * filename */ if (context == NULL) { for (i = xmlInputCallbackNr - 1;i >= 0;i--) {