diff --git a/xs/src/libslic3r/Format/AMF.cpp b/xs/src/libslic3r/Format/AMF.cpp
index b446f456b..83b50ec9e 100644
--- a/xs/src/libslic3r/Format/AMF.cpp
+++ b/xs/src/libslic3r/Format/AMF.cpp
@@ -674,6 +674,33 @@ bool load_amf(const char *path, PresetBundle* bundle, Model *model)
return false;
}
+std::string xml_escape(std::string text)
+{
+ std::string::size_type pos = 0;
+ for (;;)
+ {
+ pos = text.find_first_of("\"\'&<>", pos);
+ if (pos == std::string::npos)
+ break;
+
+ std::string replacement;
+ switch (text[pos])
+ {
+ case '\"': replacement = """; break;
+ case '\'': replacement = "'"; break;
+ case '&': replacement = "&"; break;
+ case '<': replacement = "<"; break;
+ case '>': replacement = ">"; break;
+ default: break;
+ }
+
+ text.replace(pos, 1, replacement);
+ pos += replacement.size();
+ }
+
+ return text;
+}
+
bool store_amf(const char *path, Model *model, Print* print, bool export_print_config)
{
if ((path == nullptr) || (model == nullptr) || (print == nullptr))
@@ -701,7 +728,7 @@ bool store_amf(const char *path, Model *model, Print* print, bool export_print_c
{
std::string config = "\n";
GCode::append_full_config(*print, config);
- stream << "" << config << "\n";
+ stream << "" << xml_escape(config) << "\n";
}
for (const auto &material : model->materials) {