--- 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);