--- a/src/server/webdav/xml.c Sat Jan 18 13:48:59 2020 +0100 +++ b/src/server/webdav/xml.c Sat Jan 18 16:31:52 2020 +0100 @@ -344,19 +344,30 @@ /* * Serialize an XML text node * This replaces some special characters with entity refs + * type: 0 = element text, 1 = attribute text */ -static void xml_ser_text(Writer *out, const char *text) { +static void xml_ser_text(Writer *out, int type, const char *text) { size_t start = 0; size_t i; sstr_t entityref = { NULL, 0 }; for(i=0;text[i]!='\0';i++) { - switch(text[i]) { - case '<': entityref = S("<"); break; - case '>': entityref = S(">"); break; - case '&': entityref = S("&"); break; - case '\"': entityref = S("""); break; - case '\'': entityref = S("'"); break; + char c = text[i]; + if(c == '&') { + entityref = S("&"); + } else if(type == 0) { + if(c == '<') { + entityref = S("<"); + } else if(c == '>') { + entityref = S(">"); + } + } else { + if(c == '\"') { + entityref = S("""); + } else if(c == '\'') { + entityref = S("'"); + } } + if(entityref.ptr) { size_t len = i-start; if(len > 0) { @@ -436,7 +447,7 @@ xmlNode *value = attr->children; while(value) { if(value->content) { - xml_ser_text(out, (const char*)value->content); + xml_ser_text(out, 1, (const char*)value->content); } value = value->next; } @@ -459,7 +470,7 @@ case XML_ELEMENT_NODE: xml_ser_element(xw, node); break; case XML_ATTRIBUTE_NODE: break; case XML_TEXT_NODE: { - xml_ser_text(xw->out, (const char*)node->content); + xml_ser_text(xw->out, 0, (const char*)node->content); break; } case XML_CDATA_SECTION_NODE: {