XML encode the strings in the device description (b/17754708)

Change-Id: I8d05e92178835984b4e540ea824470f060c22c5e
diff --git a/src/server/quick_ssdp.c b/src/server/quick_ssdp.c
index 7c3a3ae..3a399ea 100644
--- a/src/server/quick_ssdp.c
+++ b/src/server/quick_ssdp.c
@@ -34,6 +34,7 @@
 #include <unistd.h>
 
 #include "mongoose.h"
+#include "url_lib.h"
 
 // TODO: Partners should define this port
 #define SSDP_PORT (56790)
@@ -208,20 +209,17 @@
   socklen_t len = sizeof(sa);
 
   if(pFriendlyName) {
-      strncpy(friendly_name, pFriendlyName, sizeof(friendly_name));
-      friendly_name[255] = '\0';
+      xmlencode(friendly_name, pFriendlyName, sizeof(friendly_name));
   } else {
       strcpy(friendly_name, "DIAL server sample");
   }
   if(pModelName) {
-      strncpy(model_name, pModelName, sizeof(model_name));
-      model_name[255] = '\0';
+      xmlencode(model_name, pModelName, sizeof(model_name));
   } else {
       strcpy(model_name, "deadbeef-dead-beef-dead-beefdeadbeef");
   }
   if(pUuid) {
-      strncpy(uuid, pUuid, sizeof(uuid));
-      uuid[255] = '\0';
+      xmlencode(uuid, pUuid, sizeof(uuid));
   } else {
       strcpy(uuid, "deadbeef-dead-beef-dead-beefdeadbeef");
   }
diff --git a/src/server/url_lib.c b/src/server/url_lib.c
index 498b221..b743a38 100644
--- a/src/server/url_lib.c
+++ b/src/server/url_lib.c
@@ -87,31 +87,48 @@
 void xmlencode(char *dst, const char *src, size_t max_size) {
     size_t current_size = 0;
     while (*src && current_size < max_size) {
-        switch (*src) {
-            case '&':
-                dst = smartstrcat(dst, "&amp;", max_size - current_size);
-                current_size += 5;
-                break;
-            case '\"':
-                dst = smartstrcat(dst, "&quot;", max_size - current_size);
-                current_size += 6;
-                break;
-            case '\'':
-                dst = smartstrcat(dst, "&apos;", max_size - current_size);
-                current_size += 6;
-                break;
-            case '<':
-                dst = smartstrcat(dst, "&lt;", max_size - current_size);
-                current_size += 4;
-                break;
-            case '>':
-                dst = smartstrcat(dst, "&gt;", max_size - current_size);
-                current_size += 4;
-                break;
-            default:
-                *dst++ = *src;
-                current_size++;
-                break;
+        // Discard invalid characters for xml encoding, assuming input
+        // shouldn't contain utf.
+        if(!((*src&0x80) ||
+           (*src < 0x20 && *src != 0x09 && *src != 0x0A && *src != 0x0D))) {
+            switch (*src) {
+                case '\t':
+                    dst = smartstrcat(dst, "&#x9;", max_size - current_size);
+                    current_size += 5;
+                    break;
+                case '\n':
+                    dst = smartstrcat(dst, "&#xA;", max_size - current_size);
+                    current_size += 5;
+                    break;
+                case '\r':
+                    dst = smartstrcat(dst, "&#xD;", max_size - current_size);
+                    current_size += 5;
+                    break;
+                case '&':
+                    dst = smartstrcat(dst, "&amp;", max_size - current_size);
+                    current_size += 5;
+                    break;
+                case '\"':
+                    dst = smartstrcat(dst, "&quot;", max_size - current_size);
+                    current_size += 6;
+                    break;
+                case '\'':
+                    dst = smartstrcat(dst, "&apos;", max_size - current_size);
+                    current_size += 6;
+                    break;
+                case '<':
+                    dst = smartstrcat(dst, "&lt;", max_size - current_size);
+                    current_size += 4;
+                    break;
+                case '>':
+                    dst = smartstrcat(dst, "&gt;", max_size - current_size);
+                    current_size += 4;
+                    break;
+                default:
+                    *dst++ = *src;
+                    current_size++;
+                    break;
+            }
         }
         src++;
     }