summaryrefslogblamecommitdiff
path: root/audio/icecast/files/patch-src::http.c
blob: b2b23087e5c90f8d603e9771fe94bdffa3a46e51 (plain) (tree)
















































































                                                                                                                                       
--- src/http.c
+++ src/http.c
@@ -327,7 +327,60 @@
 }
 
 char * 
-url_encode (const char *str, char **result_p)
+html_escape (const char *str)
+{
+  const char *p;
+  char *q;
+  char *result;
+  int toescape= 0;
+
+  if (!str) {
+	  xa_debug (1, "WARNING: html_escape() called with NULL string");
+	  return NULL;
+  }
+
+  for (p = str; *p; p++) {
+    if ((unsigned char) (*p) == '&') toescape+=4;
+    if ((unsigned char) (*p) == '"') toescape+=5;
+    if ((unsigned char) (*p) == '<') toescape+=3;
+    if ((unsigned char) (*p) == '>') toescape+=3;
+  }
+  
+  result = (char  *) nmalloc (p - str + toescape + 1);
+
+  for (q = result, p = str; *p; p++) {
+      unsigned char a = *p;
+      if (a == '&') {
+      	  *q++ = '&';
+      	  *q++ = 'a';
+      	  *q++ = 'm';
+      	  *q++ = 'p';
+      	  *q++ = ';';
+      } else if (a == '"') {
+      	  *q++ = '&';
+      	  *q++ = 'q';
+      	  *q++ = 'u';
+      	  *q++ = 'o';
+      	  *q++ = 't';
+      	  *q++ = ';';
+      } else if (a == '<') {
+      	  *q++ = '&';
+      	  *q++ = 'l';
+      	  *q++ = 't';
+      	  *q++ = ';';
+      } else if (a == '>') {
+      	  *q++ = '&';
+      	  *q++ = 'g';
+      	  *q++ = 't';
+      	  *q++ = ';';
+      } else *q++ = *p;
+    }
+  *q++ = 0; 
+  return result;
+}
+
+char * 
+url_encode (const char *str, char** result_p)
 {
   const char *p;
   char *q;
@@ -345,7 +398,6 @@
       unacceptable++;
 
   result = (char  *) nmalloc (p - str + unacceptable + unacceptable + 1);
-
   *result_p = result;
 
   for (q = result, p = str; *p; p++) 
@@ -1336,7 +1388,7 @@
 	  add_varpair2 (variables, nstrdup (ident), ice_itoa (i));
 	  add_varpair2 (variables, ice_cat (ident, ".id"), ice_itoa (travclients->id));
 	  add_varpair2 (variables, ice_cat (ident, ".host"), nstrdup (con_host (travclients)));
-	  add_varpair2 (variables, ice_cat (ident, ".user_agent"), nstrdup (get_user_agent (travclients)));
+	  add_varpair2 (variables, ice_cat (ident, ".user_agent"), nstrdup (html_escape(get_user_agent (travclients))));
 	  add_varpair2 (variables, ice_cat (ident, ".writebytes"), ice_utoa (travclients->food.client->write_bytes));
 	  add_varpair2 (variables, ice_cat (ident, ".connecttime"), nstrdup (nice_time (get_time() - travclients->connect_time, buf)));
 	  endptr = parse_template_file (clicon, NULL, runptr, fd, variables);