summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--uri.c24
2 files changed, 29 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 6a0b9bd7..e8eea45f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Mar 25 14:20:49 CET 2008 Daniel Veillard <daniel@veillard.com>
+
+ * uri.c: fix saving for file:///X:/ URI embedding Windows file paths
+ should fix #524253
+
Mon Mar 24 21:42:33 CET 2008 Daniel Veillard <daniel@veillard.com>
* parser.c: fix a problem reported by Ashwin for system parameter
diff --git a/uri.c b/uri.c
index cf3768b7..fafd1125 100644
--- a/uri.c
+++ b/uri.c
@@ -421,6 +421,30 @@ xmlSaveUri(xmlURIPtr uri) {
}
if (uri->path != NULL) {
p = uri->path;
+ /*
+ * the colon in file:///d: should not be escaped or
+ * Windows accesses fail later.
+ */
+ if ((uri->scheme != NULL) &&
+ (p[0] == '/') &&
+ (((p[1] >= 'a') && (p[1] <= 'z')) ||
+ ((p[1] >= 'A') && (p[1] <= 'Z'))) &&
+ (p[2] == ':') &&
+ (xmlStrEqual(uri->scheme, BAD_CAST "file"))) {
+ if (len + 3 >= max) {
+ max *= 2;
+ ret = (xmlChar *) xmlRealloc(ret,
+ (max + 1) * sizeof(xmlChar));
+ if (ret == NULL) {
+ xmlGenericError(xmlGenericErrorContext,
+ "xmlSaveUri: out of memory\n");
+ return(NULL);
+ }
+ }
+ ret[len++] = *p++;
+ ret[len++] = *p++;
+ ret[len++] = *p++;
+ }
while (*p != 0) {
if (len + 3 >= max) {
max *= 2;